@wayke-se/components-react 5.2.0 → 6.0.0-beta.1
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/README.md +260 -140
- package/dist/assets/StyreneA-Bold-Web-4CXEYQLA-4CXEYQLA.woff2 +0 -0
- package/dist/assets/StyreneA-Bold-Web-AGBUOKS2-AGBUOKS2.woff +0 -0
- package/dist/assets/StyreneA-Light-Web-DAMPSUFB-DAMPSUFB.woff +0 -0
- package/dist/assets/StyreneA-Light-Web-EE4AJECE-EE4AJECE.woff2 +0 -0
- package/dist/assets/StyreneA-Medium-Web-53Q6X35A-53Q6X35A.woff +0 -0
- package/dist/assets/StyreneA-Medium-Web-7KYQNCKQ-7KYQNCKQ.woff2 +0 -0
- package/dist/assets/StyreneA-Regular-Web-7SAOGHB5-7SAOGHB5.woff2 +0 -0
- package/dist/assets/StyreneA-Regular-Web-XFBCXNPA-XFBCXNPA.woff +0 -0
- package/dist/chunks/chunk-XBJKSIMP.js +2 -0
- package/dist/chunks/chunk-XBJKSIMP.js.map +7 -0
- package/dist/chunks/dist-3TYBTGV5.js +1969 -0
- package/dist/chunks/dist-3TYBTGV5.js.map +7 -0
- package/dist/index.js +1037 -3129
- package/dist/index.js.map +4 -4
- package/dist/style.css +1 -0
- package/dist/types/src/@types/filter.d.ts +7 -1
- package/dist/types/src/Gql/ad/legacyWaykeId.d.ts +1 -0
- package/dist/types/src/Gql/ad/propertyTree.d.ts +5 -0
- package/dist/types/src/Gql/ad/queries.d.ts +9 -0
- package/dist/types/src/Gql/ad/types.d.ts +378 -0
- package/dist/types/src/Gql/ad/useAd.d.ts +8 -0
- package/dist/types/src/Gql/ad/useInsuranceInquiry.d.ts +11 -0
- package/dist/types/src/Gql/ad/useLoanCalculation.d.ts +14 -0
- package/dist/types/src/Gql/ad/useRelatedAds.d.ts +12 -0
- package/dist/types/src/Gql/ad/view.d.ts +94 -0
- package/dist/types/src/Gql/client.d.ts +11 -0
- package/dist/types/src/Gql/config.d.ts +9 -0
- package/dist/types/src/Gql/facets.d.ts +19 -0
- package/dist/types/src/Gql/hit.d.ts +5 -0
- package/dist/types/src/Gql/legacyParams.d.ts +7 -0
- package/dist/types/src/Gql/queries.d.ts +17 -0
- package/dist/types/src/Gql/searchParams.d.ts +55 -0
- package/dist/types/src/Gql/suggest.d.ts +8 -0
- package/dist/types/src/Gql/types.d.ts +131 -0
- package/dist/types/src/Gql/useAdsSearch.d.ts +21 -0
- package/dist/types/src/State/Ad/AdContext.d.ts +5 -0
- package/dist/types/src/State/Router/RouterContext.d.ts +15 -0
- package/dist/types/src/State/Router/RouterProvider.d.ts +6 -0
- package/dist/types/src/State/Router/useRouter.d.ts +2 -0
- package/dist/types/src/State/Search/SearchContext.d.ts +15 -9
- package/dist/types/src/State/Search/SearchProvider.d.ts +1 -5
- package/dist/types/src/State/Settings/SettingsContext.d.ts +2 -12
- package/dist/types/src/State/Settings/settings.d.ts +62 -0
- package/dist/types/src/State/Settings/useSettings.d.ts +1 -1
- package/dist/types/src/components/ActionList/index.d.ts +3 -10
- package/dist/types/src/components/DocumentList/index.d.ts +3 -3
- package/dist/types/src/components/Filter/index.d.ts +1 -3
- package/dist/types/src/components/FilterPanel/checkListFacet.d.ts +2 -3
- package/dist/types/src/components/FilterPanel/colorFacet.d.ts +2 -3
- package/dist/types/src/components/FilterPanel/faceSelector.d.ts +2 -3
- package/dist/types/src/components/FilterPanel/index.d.ts +8 -15
- package/dist/types/src/components/FilterPanel/rangeFacet.d.ts +3 -3
- package/dist/types/src/components/FinancialOptions/LoanModal.d.ts +3 -7
- package/dist/types/src/components/FinancialOptions/index.d.ts +5 -7
- package/dist/types/src/components/FinancialOptions/leasing.d.ts +3 -3
- package/dist/types/src/components/FinancialOptions/loan.d.ts +3 -7
- package/dist/types/src/components/Gallery/index.d.ts +3 -5
- package/dist/types/src/components/Grid/index.d.ts +3 -7
- package/dist/types/src/components/InsuranceOptions/Insurance.d.ts +4 -6
- package/dist/types/src/components/InsuranceOptions/InsuranceFree.d.ts +5 -7
- package/dist/types/src/components/InsuranceOptions/InsuranceFreeModal.d.ts +4 -4
- package/dist/types/src/components/InsuranceOptions/InsuranceModal.d.ts +4 -6
- package/dist/types/src/components/InsuranceOptions/index.d.ts +5 -6
- package/dist/types/src/components/LeadForm/index.d.ts +1 -6
- package/dist/types/src/components/Lightbox/index.d.ts +2 -2
- package/dist/types/src/components/Map/index.d.ts +4 -2
- package/dist/types/src/components/OpeningHours/index.d.ts +2 -2
- package/dist/types/src/components/ProductCard/HitCard.d.ts +10 -0
- package/dist/types/src/components/ProductCard/index.d.ts +9 -13
- package/dist/types/src/components/SearchBar/index.d.ts +4 -1
- package/dist/types/src/components/SearchBar/wrapper.d.ts +10 -0
- package/dist/types/src/components/SortSelect/index.d.ts +1 -2
- package/dist/types/src/hooks/useSubmitLead.d.ts +1 -1
- package/dist/types/src/index.d.ts +5 -4
- package/dist/types/src/layouts/WaykeComposite.d.ts +3 -8
- package/dist/types/src/layouts/WaykeCompositeWithProvider.d.ts +1 -1
- package/dist/types/src/layouts/search/index.d.ts +6 -7
- package/dist/types/src/layouts/searchItem/Accessories/AccessoryModal.d.ts +2 -2
- package/dist/types/src/layouts/searchItem/Accessories/index.d.ts +2 -2
- package/dist/types/src/layouts/searchItem/Branch.d.ts +3 -4
- package/dist/types/src/layouts/searchItem/CheckList.d.ts +3 -15
- package/dist/types/src/layouts/searchItem/Documents.d.ts +2 -2
- package/dist/types/src/layouts/searchItem/ManufacturerPackagesOption.d.ts +2 -2
- package/dist/types/src/layouts/searchItem/PackageOptions.d.ts +3 -3
- package/dist/types/src/layouts/searchItem/Property.d.ts +1 -6
- package/dist/types/src/layouts/searchItem/Related.d.ts +5 -6
- package/dist/types/src/layouts/searchItem/index.d.ts +8 -6
- package/dist/types/src/layouts/searchItem/useEcom.d.ts +7 -3
- package/dist/types/src/providers/WaykeProvider.d.ts +7 -21
- package/dist/types/src/utils/image.d.ts +14 -0
- package/dist/types/src/utils/sortOptions.d.ts +4 -13
- package/package.json +26 -22
- package/dist/assets/default.css +0 -1
- package/dist/assets/fonts/slick.svg +0 -14
- package/dist/index.mjs +0 -5511
- package/dist/index.mjs.map +0 -7
- package/dist/types/src/@types/action.d.ts +0 -3
- package/dist/types/src/@types/codegen/types.d.ts +0 -433
- package/dist/types/src/@types/queryFilter.d.ts +0 -5
- package/dist/types/src/@types/search.d.ts +0 -114
- package/dist/types/src/State/CentralStorage/CentralStorageContext.d.ts +0 -5
- package/dist/types/src/State/CentralStorage/CentralStorageProvider.d.ts +0 -6
- package/dist/types/src/State/CentralStorage/useCentralStorage.d.ts +0 -6
- package/dist/types/src/State/Path/PathContext.d.ts +0 -8
- package/dist/types/src/State/Path/PathProvider.d.ts +0 -6
- package/dist/types/src/State/Path/reducer.d.ts +0 -14
- package/dist/types/src/State/Path/usePath.d.ts +0 -3
- package/dist/types/src/State/RelatedSearch/RelatedSearchContext.d.ts +0 -9
- package/dist/types/src/State/RelatedSearch/RelatedSearchProvider.d.ts +0 -9
- package/dist/types/src/State/RelatedSearch/useRelatedSearch.d.ts +0 -2
- package/dist/types/src/State/Settings/SettingsProvider.d.ts +0 -11
- package/dist/types/src/components/Video/QuickNavVideo.d.ts +0 -7
- package/dist/types/src/hooks/apolloTypes.d.ts +0 -6
- package/dist/types/src/hooks/useHasBeenVisible.d.ts +0 -2
- package/dist/types/src/hooks/useHashGuid.d.ts +0 -2
- package/dist/types/src/hooks/useInsurance.d.ts +0 -4
- package/dist/types/src/hooks/useLoan.d.ts +0 -4
- package/dist/types/src/hooks/useOnScreen.d.ts +0 -2
- package/dist/types/src/hooks/usePrevious.d.ts +0 -2
- package/dist/types/src/hooks/useSearchItem.d.ts +0 -4
- package/dist/types/src/hooks/useSearchItemBranch.d.ts +0 -4
- package/dist/types/src/hooks/useSessionStorage.d.ts +0 -7
- package/dist/types/src/layouts/searchItem/BranchModal.d.ts +0 -9
- package/dist/types/src/providers/WaykeItemProvidet.d.ts +0 -24
- package/dist/types/src/providers/graphqlProvider.d.ts +0 -6
- package/dist/types/src/queries/INSURANCE_CALCULATION.d.ts +0 -2
- package/dist/types/src/queries/LOAN_CALCULATION.d.ts +0 -2
- package/dist/types/src/queries/SEARCH_ITEM_BRANCH_QUERY.d.ts +0 -2
- package/dist/types/src/queries/SEARCH_ITEM_QUERY.d.ts +0 -2
- package/dist/types/src/utils/deep-copy.d.ts +0 -5
- package/dist/types/src/utils/regex.d.ts +0 -3
- package/dist/types/src/utils/specification.d.ts +0 -28
- package/dist/types/src/utils/url.d.ts +0 -1
- package/dist/types/src/utils/vehicle-properties/compare-basic-properties.d.ts +0 -3
- package/dist/types/src/utils/vehicle-properties/compare-categories.d.ts +0 -3
- package/dist/types/src/utils/vehicle-properties/compare-properties.d.ts +0 -3
- package/dist/types/src/utils/vehicle-properties/custom-property-adder.d.ts +0 -13
- package/dist/types/src/utils/vehicle-properties/property-remover.d.ts +0 -7
- package/dist/types/src/utils/vehicle-properties/property-tree-creator.d.ts +0 -31
- package/dist/types/src/utils/vehicle-properties/property-tree-sorter.d.ts +0 -3
- /package/dist/assets/{ajax-loader.gif → ajax-loader-BOAPMZMT.gif} +0 -0
- /package/dist/assets/{fonts/slick.eot → slick-EVLS6IWX.eot} +0 -0
- /package/dist/assets/{fonts/slick.woff → slick-MU5EZO5G.woff} +0 -0
- /package/dist/assets/{fonts/slick.ttf → slick-NKQ64RRA.ttf} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../node_modules/object-path/index.js", "../../node_modules/entities/src/decode-codepoint.ts", "../../node_modules/entities/src/internal/decode-shared.ts", "../../node_modules/entities/src/generated/decode-data-html.ts", "../../node_modules/entities/src/generated/decode-data-xml.ts", "../../node_modules/entities/src/internal/bin-trie-flags.ts", "../../node_modules/entities/src/decode.ts", "../../node_modules/htmlparser2/src/Tokenizer.ts", "../../node_modules/htmlparser2/src/Parser.ts", "../../node_modules/domelementtype/dist/index.js", "../../node_modules/domhandler/dist/node.js", "../../node_modules/domhandler/dist/index.js", "../../node_modules/domutils/src/querying.ts", "../../node_modules/domutils/src/legacy.ts", "../../node_modules/entities/src/escape.ts", "../../node_modules/entities/src/index.ts", "../../node_modules/dom-serializer/src/foreign-names.ts", "../../node_modules/dom-serializer/src/index.ts", "../../node_modules/domutils/src/stringify.ts", "../../node_modules/domutils/src/feeds.ts", "../../node_modules/domutils/src/helpers.ts", "../../node_modules/domutils/src/manipulation.ts", "../../node_modules/domutils/src/traversal.ts", "../../node_modules/domutils/src/index.ts", "../../node_modules/htmlparser2/src/index.ts", "../../node_modules/escape-string-regexp/index.js", "../../node_modules/is-plain-object/dist/is-plain-object.js", "../../node_modules/parse-srcset/src/parse-srcset.js", "../../node_modules/picocolors/picocolors.browser.js", "../../node_modules/postcss/lib/css-syntax-error.js", "../../node_modules/postcss/lib/stringifier.js", "../../node_modules/postcss/lib/stringify.js", "../../node_modules/postcss/lib/symbols.js", "../../node_modules/postcss/lib/node.js", "../../node_modules/postcss/lib/comment.js", "../../node_modules/postcss/lib/declaration.js", "../../node_modules/postcss/lib/container.js", "../../node_modules/postcss/lib/at-rule.js", "../../node_modules/postcss/lib/document.js", "../../node_modules/nanoid/non-secure/index.cjs", "../../node_modules/postcss/lib/previous-map.js", "../../node_modules/postcss/lib/input.js", "../../node_modules/postcss/lib/root.js", "../../node_modules/postcss/lib/list.js", "../../node_modules/postcss/lib/rule.js", "../../node_modules/postcss/lib/fromJSON.js", "../../node_modules/postcss/lib/map-generator.js", "../../node_modules/postcss/lib/tokenize.js", "../../node_modules/postcss/lib/parser.js", "../../node_modules/postcss/lib/parse.js", "../../node_modules/postcss/lib/warning.js", "../../node_modules/postcss/lib/result.js", "../../node_modules/postcss/lib/warn-once.js", "../../node_modules/postcss/lib/lazy-result.js", "../../node_modules/postcss/lib/no-work-result.js", "../../node_modules/postcss/lib/processor.js", "../../node_modules/postcss/lib/postcss.js", "../../node_modules/dayjs/dayjs.min.js", "../../node_modules/launder/index.js", "../../node_modules/sanitize-html/index.js", "../../node_modules/@wayke-se/ecom-web/src/Utils/i18n.ts", "../../node_modules/@wayke-se/ecom-web/src/translation/nb-NO.ts", "../../node_modules/@wayke-se/ecom-web/src/translation/sv-SE.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/market.ts", "../../node_modules/@wayke-se/ecom-web/src/App.ts", "../../node_modules/@wayke-se/ecom-web/package.json", "../../node_modules/@wayke-se/ecom-web/src/Utils/trapFocus.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Extension/HtmlNode.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Modal/ModalBody.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Modal/ModalCenter.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonClose.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Modal/ModalClose.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Modal/ModalContainer.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Modal/ModalDialog.ts", "../../node_modules/@wayke-se/ecom-web/src/Templates/Logotype.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Modal/ModalFooter.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Modal/ModalHeader.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Modal/Modal.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/creditAssessmentCancelSigning.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/convert.ts", "../../node_modules/@wayke-se/ecom-web/src/Redux/action.ts", "../../node_modules/@wayke-se/ecom-web/src/Redux/store.ts", "../../node_modules/@wayke-se/ecom-web/src/Redux/reducer.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/compare.ts", "../../node_modules/@wayke-se/ecom-web/src/Redux/watch.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/ecomEvent.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/intervals.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/vw.ts", "../../node_modules/@wayke-se/ecom-web/src/Templates/Loader.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/Button.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonAlt.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/ConfirmClose/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/cdn.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/format.ts", "../../node_modules/@wayke-se/ecom-web/src/Templates/ItemTileSmall.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonArrowRight.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonSkip.ts", "../../node_modules/@wayke-se/ecom-web/src/Templates/KeyValueListItem.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/StageCompleted.ts", "../../node_modules/@wayke-se/ecom-web/src/Templates/ListItem.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/OverflowGrid/Arrow.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/OverflowGrid/OverflowGridList.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonAddRemove.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonAsLink.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/OverflowGrid/OverflowGridItem.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/portal.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonAsLinkArrowLeft.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonClear.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Gallery/Arrow.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Gallery/Gallery.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/parser.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/scroll.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Accessories/AccessoryItemInfo.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Accessories/AccessoryItem.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Accessories/AccessoryList.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Accessories/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputError.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputInformation.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputRadioField.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputRadioGroup.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/getOrder.ts", "../../node_modules/@wayke-se/ecom-web/src/Templates/Alert.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/CentralStorage/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/mask.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputField.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/regex.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/validationMethods.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Customer/EmailAndPhone.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Disclaimer/DisclaimerPadlock.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/getAddress.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/render.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Customer/FullAddressBySocialId.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Customer/FullAddressForm.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Customer/FullAddress.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Customer/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Delivery/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/delivery.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/constants.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/CreditAssessment.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Accordion/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/BankId/BankIdSign.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/isMobile.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/BankId/BankIdSignQrCode.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonBankId.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/BankId/BankIdSignSameDevice.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Disclaimer/Disclaimer.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputSelect.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/creditAssessmentDecline.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/creditAssessmentGetStatus.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/creditAssessmentNewCase.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/creditAssessmentSignCase.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/CreditAssessmentResult.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/CreditAssessmentApproved.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/StageCompletedFinancialCreditAssessment.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/CreditAssessmentAssessManually.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/CreditAssessmentRejected.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/utils.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/ErrorAlert/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputRange.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/getPayment.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Chart/PieChart.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/LoanDetailsBasic.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/LoanDetailsDetailed.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/LoanDetailsMonthlyCost.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/LoanDetails.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/Loan.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Financial/StageCompletedFinancial.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/DefaultInsurance/InsuranceItemInfo.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/DefaultInsurance/InsuranceItem.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/DefaultInsurance/InsuranceList.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/DefaultInsurance/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/IfInsurance/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/getInsurances.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Button/ButtonSuccess.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputCheckbox.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/IfInsurance/InsuranceAddonBox.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/IfInsurance/InsuranceItemInfo.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/IfInsurance/InsuranceItem.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/IfInsurance/InsuranceList.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/IfInsurance/InsuranceView.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Insurance/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Input/InputTextarea.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/getTradeInVehicle.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/TradeIn/PartTradeIn.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/TradeIn/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/stage.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/createOrder.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Confirmation/NoVerify.ts", "../../node_modules/@wayke-se/ecom-web/src/Utils/payment.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Confirmation/Payment.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Confirmation/VerifyByBankId.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/creditAssessmentAccept.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/getBankIdAuth.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/getBankIdQrCode.ts", "../../node_modules/@wayke-se/ecom-web/src/Data/getBankIdStatus.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/Confirmation/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Main/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/OrderCallback/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Checklist/Checklist.ts", "../../node_modules/@wayke-se/ecom-web/src/Templates/ItemTileLarge.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Preview/HowTo.ts", "../../node_modules/@wayke-se/ecom-web/src/Templates/TimelineItem.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Preview/index.ts", "../../node_modules/@wayke-se/ecom-web/src/Components/Extension/StackNode.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Summary/CentralStorage.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Summary/Customer.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Summary/Delivery.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Summary/Intro.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Summary/Order.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Summary/TradeIn.ts", "../../node_modules/@wayke-se/ecom-web/src/Views/Summary/index.ts", "../../node_modules/@wayke-se/ecom-web/src/index.ts", "../../node_modules/@wayke-se/ecom/dist-src/config/index.js", "../../node_modules/@wayke-se/ecom/dist-src/errors/request-error.js", "../../node_modules/@wayke-se/ecom/dist-src/errors/vehicle-unavailable-error.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/handle-response-error.js", "../../node_modules/@wayke-se/ecom/dist-src/http/http-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/http/index.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/customers.js", "../../node_modules/@wayke-se/ecom/dist-src/customers/address-lookup-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/customers/address-lookup-response.js", "../../node_modules/@wayke-se/ecom/dist-src/customers/customer-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/customers/index.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/insurances.js", "../../node_modules/@wayke-se/ecom/dist-src/insurances/insurance-options-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/insurances/insurance-options-response.js", "../../node_modules/@wayke-se/ecom/dist-src/insurances/index.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/orders.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/insurance-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/order-create-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/order-create-response.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/order-options-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/payments/payment-lookup-response.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/order-options-response.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/payment-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/order-credit-assessment-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/index.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/payments.js", "../../node_modules/@wayke-se/ecom/dist-src/payments/payment-lookup-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/payments/index.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/vehicles.js", "../../node_modules/@wayke-se/ecom/dist-src/vehicles/vehicle-lookup-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/vehicles/vehicle-lookup-response.js", "../../node_modules/@wayke-se/ecom/dist-src/vehicles/vehicle-trade-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/vehicles/index.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/types.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/bankid/utils.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/bankid/auth.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/bankid/collect.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/bankid/cancel.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/bankid/qrcode.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/bankid.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/bankid-auth-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/bankid-auth-response.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/bankid-collect-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/message-resolver.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/bankid-collect-response.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/bankid-cancel-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/bankid-qrcode-request-builder.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/bankid-qrcode-response.js", "../../node_modules/@wayke-se/ecom/dist-src/bankid/index.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/credit-assessment/get-status.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/credit-assessment/new-case.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/credit-assessment/sign.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/credit-assessment/cancel-sign.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/credit-assessment/decline.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/credit-assessment/accept.js", "../../node_modules/@wayke-se/ecom/dist-src/http/apis/credit-assessment.js", "../../node_modules/@wayke-se/ecom/dist-src/credit-assessment/sign-response.js", "../../node_modules/@wayke-se/ecom/dist-src/credit-assessment/types.js", "../../node_modules/@wayke-se/ecom/dist-src/credit-assessment/convert-status.js", "../../node_modules/@wayke-se/ecom/dist-src/credit-assessment/convert-decision.js", "../../node_modules/@wayke-se/ecom/dist-src/credit-assessment/convert-recommendation.js", "../../node_modules/@wayke-se/ecom/dist-src/credit-assessment/status-response.js", "../../node_modules/@wayke-se/ecom/dist-src/credit-assessment/validator.js", "../../node_modules/@wayke-se/ecom/dist-src/credit-assessment/index.js", "../../node_modules/@wayke-se/ecom/dist-src/insurances/types.js", "../../node_modules/@wayke-se/ecom/dist-src/orders/types.js", "../../node_modules/@wayke-se/ecom/dist-src/vehicles/types.js", "../../node_modules/redux/src/utils/formatProdErrorMessage.ts", "../../node_modules/redux/src/utils/symbol-observable.ts", "../../node_modules/redux/src/utils/actionTypes.ts", "../../node_modules/redux/src/utils/isPlainObject.ts", "../../node_modules/redux/src/utils/kindOf.ts", "../../node_modules/redux/src/createStore.ts", "../../node_modules/redux/src/utils/warning.ts", "../../node_modules/redux/src/combineReducers.ts", "../../node_modules/redux/src/bindActionCreators.ts", "../../node_modules/redux/src/compose.ts", "../../node_modules/redux/src/applyMiddleware.ts", "../../node_modules/redux/src/utils/isAction.ts"],
|
|
4
|
+
"sourcesContent": ["(function (root, factory) {\n 'use strict'\n\n /*istanbul ignore next:cant test*/\n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = factory()\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory)\n } else {\n // Browser globals\n root.objectPath = factory()\n }\n})(this, function () {\n 'use strict'\n\n var toStr = Object.prototype.toString\n\n function hasOwnProperty (obj, prop) {\n if (obj == null) {\n return false\n }\n //to handle objects with null prototypes (too edge case?)\n return Object.prototype.hasOwnProperty.call(obj, prop)\n }\n\n function isEmpty (value) {\n if (!value) {\n return true\n }\n if (isArray(value) && value.length === 0) {\n return true\n } else if (typeof value !== 'string') {\n for (var i in value) {\n if (hasOwnProperty(value, i)) {\n return false\n }\n }\n return true\n }\n return false\n }\n\n function toString (type) {\n return toStr.call(type)\n }\n\n function isObject (obj) {\n return typeof obj === 'object' && toString(obj) === '[object Object]'\n }\n\n var isArray = Array.isArray || function (obj) {\n /*istanbul ignore next:cant test*/\n return toStr.call(obj) === '[object Array]'\n }\n\n function isBoolean (obj) {\n return typeof obj === 'boolean' || toString(obj) === '[object Boolean]'\n }\n\n function getKey (key) {\n var intKey = parseInt(key)\n if (intKey.toString() === key) {\n return intKey\n }\n return key\n }\n\n function factory (options) {\n options = options || {}\n\n var objectPath = function (obj) {\n return Object.keys(objectPath).reduce(function (proxy, prop) {\n if (prop === 'create') {\n return proxy\n }\n\n /*istanbul ignore else*/\n if (typeof objectPath[prop] === 'function') {\n proxy[prop] = objectPath[prop].bind(objectPath, obj)\n }\n\n return proxy\n }, {})\n }\n\n var hasShallowProperty\n if (options.includeInheritedProps) {\n hasShallowProperty = function () {\n return true\n }\n } else {\n hasShallowProperty = function (obj, prop) {\n return (typeof prop === 'number' && Array.isArray(obj)) || hasOwnProperty(obj, prop)\n }\n }\n\n function getShallowProperty (obj, prop) {\n if (hasShallowProperty(obj, prop)) {\n return obj[prop]\n }\n }\n\n var getShallowPropertySafely\n if (options.includeInheritedProps) {\n getShallowPropertySafely = function (obj, currentPath) {\n if (typeof currentPath !== 'string' && typeof currentPath !== 'number') {\n currentPath = String(currentPath)\n }\n var currentValue = getShallowProperty(obj, currentPath)\n if (currentPath === '__proto__' || currentPath === 'prototype' ||\n (currentPath === 'constructor' && typeof currentValue === 'function')) {\n throw new Error('For security reasons, object\\'s magic properties cannot be set')\n }\n return currentValue\n }\n } else {\n getShallowPropertySafely = function (obj, currentPath) {\n return getShallowProperty(obj, currentPath)\n }\n }\n\n function set (obj, path, value, doNotReplace) {\n if (typeof path === 'number') {\n path = [path]\n }\n if (!path || path.length === 0) {\n return obj\n }\n if (typeof path === 'string') {\n return set(obj, path.split('.').map(getKey), value, doNotReplace)\n }\n var currentPath = path[0]\n var currentValue = getShallowPropertySafely(obj, currentPath)\n if (path.length === 1) {\n if (currentValue === void 0 || !doNotReplace) {\n obj[currentPath] = value\n }\n return currentValue\n }\n\n if (currentValue === void 0) {\n //check if we assume an array\n if (typeof path[1] === 'number') {\n obj[currentPath] = []\n } else {\n obj[currentPath] = {}\n }\n }\n\n return set(obj[currentPath], path.slice(1), value, doNotReplace)\n }\n\n objectPath.has = function (obj, path) {\n if (typeof path === 'number') {\n path = [path]\n } else if (typeof path === 'string') {\n path = path.split('.')\n }\n\n if (!path || path.length === 0) {\n return !!obj\n }\n\n for (var i = 0; i < path.length; i++) {\n var j = getKey(path[i])\n\n if ((typeof j === 'number' && isArray(obj) && j < obj.length) ||\n (options.includeInheritedProps ? (j in Object(obj)) : hasOwnProperty(obj, j))) {\n obj = obj[j]\n } else {\n return false\n }\n }\n\n return true\n }\n\n objectPath.ensureExists = function (obj, path, value) {\n return set(obj, path, value, true)\n }\n\n objectPath.set = function (obj, path, value, doNotReplace) {\n return set(obj, path, value, doNotReplace)\n }\n\n objectPath.insert = function (obj, path, value, at) {\n var arr = objectPath.get(obj, path)\n at = ~~at\n if (!isArray(arr)) {\n arr = []\n objectPath.set(obj, path, arr)\n }\n arr.splice(at, 0, value)\n }\n\n objectPath.empty = function (obj, path) {\n if (isEmpty(path)) {\n return void 0\n }\n if (obj == null) {\n return void 0\n }\n\n var value, i\n if (!(value = objectPath.get(obj, path))) {\n return void 0\n }\n\n if (typeof value === 'string') {\n return objectPath.set(obj, path, '')\n } else if (isBoolean(value)) {\n return objectPath.set(obj, path, false)\n } else if (typeof value === 'number') {\n return objectPath.set(obj, path, 0)\n } else if (isArray(value)) {\n value.length = 0\n } else if (isObject(value)) {\n for (i in value) {\n if (hasShallowProperty(value, i)) {\n delete value[i]\n }\n }\n } else {\n return objectPath.set(obj, path, null)\n }\n }\n\n objectPath.push = function (obj, path /*, values */) {\n var arr = objectPath.get(obj, path)\n if (!isArray(arr)) {\n arr = []\n objectPath.set(obj, path, arr)\n }\n\n arr.push.apply(arr, Array.prototype.slice.call(arguments, 2))\n }\n\n objectPath.coalesce = function (obj, paths, defaultValue) {\n var value\n\n for (var i = 0, len = paths.length; i < len; i++) {\n if ((value = objectPath.get(obj, paths[i])) !== void 0) {\n return value\n }\n }\n\n return defaultValue\n }\n\n objectPath.get = function (obj, path, defaultValue) {\n if (typeof path === 'number') {\n path = [path]\n }\n if (!path || path.length === 0) {\n return obj\n }\n if (obj == null) {\n return defaultValue\n }\n if (typeof path === 'string') {\n return objectPath.get(obj, path.split('.'), defaultValue)\n }\n\n var currentPath = getKey(path[0])\n var nextObj = getShallowPropertySafely(obj, currentPath)\n if (nextObj === void 0) {\n return defaultValue\n }\n\n if (path.length === 1) {\n return nextObj\n }\n\n return objectPath.get(obj[currentPath], path.slice(1), defaultValue)\n }\n\n objectPath.del = function del (obj, path) {\n if (typeof path === 'number') {\n path = [path]\n }\n\n if (obj == null) {\n return obj\n }\n\n if (isEmpty(path)) {\n return obj\n }\n if (typeof path === 'string') {\n return objectPath.del(obj, path.split('.'))\n }\n\n var currentPath = getKey(path[0])\n getShallowPropertySafely(obj, currentPath)\n if (!hasShallowProperty(obj, currentPath)) {\n return obj\n }\n\n if (path.length === 1) {\n if (isArray(obj)) {\n obj.splice(currentPath, 1)\n } else {\n delete obj[currentPath]\n }\n } else {\n return objectPath.del(obj[currentPath], path.slice(1))\n }\n\n return obj\n }\n\n return objectPath\n }\n\n var mod = factory()\n mod.create = factory\n mod.withInheritedProps = factory({includeInheritedProps: true})\n return mod\n})\n", "// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\n\n/**\n * C1 Unicode control character reference replacements (code points 128\u2013159).\n * Index i gives the replacement for code point 128+i; 0 means \"no replacement\".\n */\nconst c1: number[] = [\n 8364, 0, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, 0,\n 381, 0, 0, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250,\n 339, 0, 382, 376,\n];\n\n/**\n * True for NUL, UTF-16 surrogates, and values past U+10FFFF.\n * @param codePoint Unicode code point to check.\n */\nfunction isInvalidCodePoint(codePoint: number): boolean {\n return (\n codePoint === 0 ||\n (codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n codePoint > 0x10_ff_ff\n );\n}\n\n/**\n * Replace the given code point with U+FFFD if it is NUL (0), a surrogate, or\n * outside the valid Unicode range. Code points in the C1 controls range\n * (128\u2013159) are remapped to their Windows-1252 equivalents, following the\n * HTML spec. All other code points are returned unchanged.\n * @param codePoint Unicode code point to convert.\n */\nexport function replaceCodePoint(codePoint: number): number {\n if (isInvalidCodePoint(codePoint)) {\n return 0xff_fd;\n }\n\n if (codePoint >= 128 && codePoint <= 159) {\n return c1[codePoint - 128] || codePoint;\n }\n\n return codePoint;\n}\n\n/**\n * XML numeric character references are the referenced Unicode code point.\n * Invalid values still become U+FFFD; the HTML Windows-1252 C1 remap is not\n * applied.\n * @see https://www.w3.org/TR/xml/#NT-CharRef\n * @param codePoint Unicode code point to convert.\n */\nexport function replaceCodePointXML(codePoint: number): number {\n return isInvalidCodePoint(codePoint) ? 0xff_fd : codePoint;\n}\n\n/**\n * Convert the code point of a decoded numeric entity to a string, replacing\n * invalid values.\n *\n * Fast path for plain BMP code points: [1..0x7F] and [0xA0..0xD7FF] pass\n * `replaceCodePoint` unchanged (no NUL, C1 remap, surrogate, or out-of-range\n * handling) and fit a single charCode. 0xd760 = 0xD800 (the first surrogate)\n * - 0xA0.\n * @param codePoint Unicode code point to convert.\n */\nexport function codePointToString(codePoint: number): string {\n return (codePoint - 1) >>> 0 < 0x7f || (codePoint - 0xa0) >>> 0 < 0xd7_60\n ? String.fromCharCode(codePoint)\n : String.fromCodePoint(replaceCodePoint(codePoint));\n}\n", "/*\n * Inverse of the encoder's SAFE alphabet (0x21..0x7E minus 0x22, 0x24, 0x5C),\n * precomputed once at module load. Entries for excluded chars stay 0 but\n * are never read.\n */\nconst BASE91_INVERSE = /* #__PURE__ */ (() => {\n const table = new Uint8Array(127);\n let code = 0;\n for (let char = 0x21; char <= 0x7e; char++) {\n if (char !== 0x22 && char !== 0x24 && char !== 0x5c) {\n table[char] = code++;\n }\n }\n return table;\n})();\n\n/**\n * Decode a dictionary-encoded trie string back into its Uint16Array.\n *\n * Stream layout (consumed in this order):\n * 1. dict1 atoms \u2014 `dict1AtomCount` uint16 values, delta+RLE encoded.\n * 2. dict2 atoms \u2014 `atomCount - dict1AtomCount` values, delta+RLE.\n * 3. dict2 ngrams \u2014 `ngramCount - (dictSize - dict1AtomCount)` entries,\n * each a pair of slot codes that resolve to earlier slots.\n * 4. dict1 ngrams \u2014 `dictSize - dict1AtomCount` entries, same shape.\n * 5. data \u2014 slot codes, each expanding to one or more uint16 values.\n *\n * Codes use a 91-char base (printable ASCII minus `\"`, `$`, `\\`):\n * - char1 < dictSize \u2192 1-char code, slot = char1\n * - char1 \u2265 dictSize \u2192 2-char code, slot = dictSize + (char1 - dictSize)*91 + char2\n *\n * Slot index \u2192 token kind:\n * [0, A) dict1 atoms (1-char codes)\n * [A, dictSize) dict1 ngrams (1-char codes)\n * [dictSize, dictSize+D) dict2 atoms (2-char codes)\n * [dictSize+D, end) dict2 ngrams (2-char codes)\n *\n * Both atom dicts decode before any ngram, and dict2 ngrams decode before\n * dict1 ngrams. So every ngram entry references slots whose contents are\n * already filled \u2014 no forward references to handle.\n *\n * This runs on library import. Flat typed arrays store each slot as either\n * a plain value (`single`, covering every atom) or a range in a shared\n * `pool` (ngrams).\n * @param input Packed trie string.\n * @param resultLength Expected number of uint16 values in the output.\n * @param atomCount Total number of distinct uint16 values in the trie.\n * @param dict1AtomCount Atoms in the 1-char range (`A` above).\n * @param ngramCount Total number of ngram entries (dict1 + dict2).\n * @param dictSize Number of 1-char code slots; the rest of `BASE - dictSize`\n * first-byte values are 2-char codes.\n */\nexport function decodeTrieDict(\n input: string,\n resultLength: number,\n atomCount: number,\n dict1AtomCount: number,\n ngramCount: number,\n dictSize: number,\n): Uint16Array {\n const base = 91;\n const inputLength = input.length;\n // For 2-char codes, slot = char1 * base - twoCharBias + char2.\n const twoCharBias = dictSize * (base - 1);\n\n let pos = 0;\n\n /** Read one slot code at `pos` and return its slot index, advancing pos. */\n const readSlotCode = (): number => {\n const c1 = BASE91_INVERSE[input.charCodeAt(pos++)];\n return c1 < dictSize\n ? c1\n : c1 * base - twoCharBias + BASE91_INVERSE[input.charCodeAt(pos++)];\n };\n\n const dict2AtomCount = atomCount - dict1AtomCount;\n const slotCount = atomCount + ngramCount;\n\n /*\n * Per-slot contents: atoms (always a single value) live directly in\n * `single`; ngram slots hold -1 there and expand to\n * `pool[start[slot] .. start[slot] + length[slot])`.\n */\n const single = new Int32Array(slotCount);\n single.fill(-1, dict1AtomCount, dictSize);\n single.fill(-1, dictSize + dict2AtomCount, slotCount);\n const start = new Int32Array(slotCount);\n const length = new Int32Array(slotCount);\n\n /**\n * Decode `count` ascending uint16 values from a delta+RLE stream into\n * `single[off..off+count)`.\n *\n * code < 89 \u2192 delta = code\n * code == 89 \u2192 run-length: next char encodes runLength-2; emit `runLength` consecutive +1 values\n * code == 90, next < 90 \u2192 escape: delta = 89 + next * BASE + after-next\n * code == 90, next == 90 \u2192 double-escape: extra char for very large deltas\n * @param count\n * @param off\n */\n function decodeDelta(count: number, off: number): void {\n let previous = 0;\n let slot = off;\n const end = off + count;\n while (slot < end) {\n const code = BASE91_INVERSE[input.charCodeAt(pos++)];\n if (code < 89) {\n previous += code;\n single[slot++] = previous;\n } else if (code === 89) {\n let runLength = BASE91_INVERSE[input.charCodeAt(pos++)] + 2;\n while (runLength--) single[slot++] = ++previous;\n } else {\n const next = BASE91_INVERSE[input.charCodeAt(pos++)];\n previous +=\n 89 +\n // eslint-disable-next-line unicorn/prefer-minimal-ternary -- branches read a different number of side-effecting input bytes\n (next < 90\n ? next * base + BASE91_INVERSE[input.charCodeAt(pos++)]\n : BASE91_INVERSE[input.charCodeAt(pos++)] * 8281 +\n BASE91_INVERSE[input.charCodeAt(pos++)] * base +\n BASE91_INVERSE[input.charCodeAt(pos++)]);\n single[slot++] = previous;\n }\n }\n }\n\n // Streams 1 & 2: atoms decoded into their slot ranges.\n decodeDelta(dict1AtomCount, 0);\n decodeDelta(dict2AtomCount, dictSize);\n\n /*\n * Streams 3 & 4 are read in two passes: first collect every ngram's two\n * references and derive its expanded length (each ref resolves to an earlier\n * slot, so lengths are already known), which sizes the shared pool.\n * Pool ranges are handed out in decode order, so the second pass fills\n * the pool contiguously with a single write cursor.\n */\n const references = new Int32Array(ngramCount * 2);\n let poolSize = 0;\n let ngramIndex = 0;\n\n /**\n * Read `count` ngram entries (each = 2 slot-code references) for the slots\n * starting at `startSlot`, recording references and assigning pool ranges.\n * @param count\n * @param startSlot\n */\n function readNgramReferences(count: number, startSlot: number): void {\n for (let index = 0; index < count; index++) {\n const slot = startSlot + index;\n const a = readSlotCode();\n const b = readSlotCode();\n references[ngramIndex * 2] = a;\n references[ngramIndex * 2 + 1] = b;\n ngramIndex += 1;\n start[slot] = poolSize;\n const entryLength =\n (single[a] < 0 ? length[a] : 1) +\n (single[b] < 0 ? length[b] : 1);\n length[slot] = entryLength;\n poolSize += entryLength;\n }\n }\n readNgramReferences(\n ngramCount - dictSize + dict1AtomCount,\n dictSize + dict2AtomCount,\n );\n readNgramReferences(dictSize - dict1AtomCount, dict1AtomCount);\n\n // Second pass: concatenate each ngram's two halves into the pool.\n const pool = new Uint16Array(poolSize);\n let write = 0;\n for (let index = 0; index < ngramIndex; index++) {\n for (let half = 0; half < 2; half++) {\n const source = references[index * 2 + half];\n const value = single[source];\n if (value < 0) {\n let read = start[source];\n const readEnd = read + length[source];\n while (read < readEnd) pool[write++] = pool[read++];\n } else {\n pool[write++] = value;\n }\n }\n }\n\n // Stream 5: data. Each code expands to its slot's stored values.\n const out = new Uint16Array(resultLength);\n let outIndex = 0;\n while (pos < inputLength) {\n let slot = BASE91_INVERSE[input.charCodeAt(pos++)];\n if (slot >= dictSize) {\n slot =\n slot * base -\n twoCharBias +\n BASE91_INVERSE[input.charCodeAt(pos++)];\n }\n const value = single[slot];\n if (value < 0) {\n let read = start[slot];\n const readEnd = read + length[slot];\n while (read < readEnd) out[outIndex++] = pool[read++];\n } else {\n out[outIndex++] = value;\n }\n }\n return out;\n}\n", "// Generated using scripts/write-decode-map.ts\n\nimport { decodeTrieDict } from \"../internal/decode-shared.js\";\n/** Packed HTML decode trie data. */\nexport const htmlDecodeTree: Uint16Array = /* #__PURE__ */ decodeTrieDict(\n \"!}.&u%}'&}*'~!6*)%&,~!J~!J~%L~y<~!R,~~%Lu~~#GD~~#|)1#%}^%}2%+#.##%##%}&%##%'#%##&%#%#'%#&#%#&#'#%%#&#%##%#)%''%&%#%#'%#%%#%%}%%%#%#&(23#%%#&-%0%('1#(##%#'##+%'*.:1}#%#6-+(%'%%#%%%}#L'2351&('%}&/N'(0(/*-%(%%}#'+&T%7.2}#&%&#%#36/5##%&%%#&#%%#))2%%##%&&'0~!#*+&'%1~!%).'3q?&%'1~!.##%6(~!+%%%(Gw'rT~!E#<nA%#jZ~!H%(~!42##~!*31&~!G%U~#)5~#`3~!J~!Z~%]~%Y~%C~!q~!u~#kz~%#~!6'~!D~!U~!?~#T~!c%~!G#'~%7|~!G~!J~!G&~#pb~(Df}#%}*&}#%##%##%##&#-}&'#'&%#.++}%mI,#,@&(}*%}*'%&##&#%##%}&0}#.},U},%}+%}&%}#%##&}B%(}(%}+%)})%##%#&}&%##%&}<%}>%#%&}*%}(%}9%}/%})%}*%}*%}?&}&%}3%}&*#%})%#%#)}#&#-#+*%E%%'%'#%}#*V##&##I}#&&##%&%#&&Qf%%))w/0+&%#(#.%-''''++++7}>%4'',##1,#%#&%##&#'##&#*#9)%&%}#*}%,#+P(%A&%#'&##wSD',9E00#y#@}(+}&%&>~!#~!X}#*}(&&}(&}(,%}%&#+&}#&}I%#%}%)#(},'%#*}4%%#%}(''}#/##(##),%-##%%)#&}(.}&%#&}%%}*&#%},&&}&%}#%*'#%})%}D&}&%}-&}6&#&}-,%}#%})-(~+`~,=?~I9'9%~!,#%})%})%}@%}?%}(~!?~#<~#pP~#BG~#=1#%K+~#?#~%;)~#A~#mF1~#A'~'X%'~#lR~#N~'N~#r~#m#-~#i'?%#'%~#B%##%,%#~#_%#0%~#]732~,w~2+#:&#%&'0%&>%}#>##F+)#%&&#(+_}4&}-%}(&}@&}O7Fdf0@+/v4}&WU##&/0#&'('B#%}.%}'+#%}#%%&#&%#%##+#&#)#6#'#.},%}c%},%#%##%&#&%#&~#>'*-.%##%##%}#%%}%'~#)D1}#%*&~#_%%'(~#S2%'.}#~#=##*'*-%}&'%'##&&~'E%.#&~#M4}%%##&'%#~#O1##%&#'+~#<B%##%%'%+~#;#@%}#&%#&&%#(~#H1}'%'##&&~#?A}&'~#D#%32}'&&&&~#[}'(#%}'~#;C})&}%%#%~#=&%,3}%'(#%%~#^'#&&)#%'~#Y%-~#d-%'~#^%%&#&&&}#~#b~2t*&'~&(~&@~0%~e~3}%*''0})&}+~!9##-}#%-hD*)1fC#%/&/fB#40~!+#)*4~!+~!K'&:~!/*7~!.#~!H~!L':~%x&~!H#~!*~%1~!I#~!+A~#p'~!F~~#-#~,,(~.Z~!V~%;'B'mq-W~!N~%I%#&&#&}#%},%%}'%}+X#%}#&}(%}'%}<%}#%}%%'}'%}:~![)9@~%>~#UA%-%##&~!C%~!-.9:~!1~!-^2/:a~!y,D*J#-5)/4~%23,~#G~!L1~!0X3`~!2+~!!0-~&E~!W~!o,>Y&]~%cZx_&~#O*9#A#'#+I'%#)~!0B*-5A+-((F&*M#)(-7-5+'-3a5Vi~!Y~!?+[)%3),ERHm~!+:D,VG.+)?fB%%*(%)'(#&80%1'8`K8?`+'Z#&O&'H5#*9)A%%5&3))0%39+.*7#()&&*=4@**L)<'_&*+..;(#*+)./&0#3)%')-8(4ixD(&.}%,('aI:,)%,k2231T)I'#/-W7,/'Q#.'Y24+h')37</31&83##&0#),H(?'&?/1##%#&&#%''-%&&&#(&''&#.-'%#%%(,')*'&#&#'##%(%(#%('#&##%%%%('%#%#%%#%#&%##h>w+v<ayvyvcg.uuhKr}g/v|g>u9i[~>g5uI~=RvdwEg;v/g;uk!!TTSx]@RT!U!#!@VBRUU!'UTe-d0c`e&gSdicedFcrdTaqb.kYcAohdYd@a3e+d}dMdtd.aJ#bqcK`dle/e.e'dwdPdodddjbEb}ogd^ofdpduc6j?l%d{drdqc)d7bacOdQ%T#Y)X.sR[yH>6Vyv3[xwLu>vo'!*.[yBacahoj>6Rew3[xqdZa#!a&#^(X-[yG>6Vyu3[xvg3sEr|g.u/Ri9db0T#^(Xa)!-[y;>6Vylg4wKs{JwNZt3@3r=c4Z([xlg;wKt!cpq's@v7A'*a(a+!-a#[y<3Dt?3Dt'>6Vym3[xmg9rxsNJwLZt4~?r?db1T#`-!(Xa,!0[yS>6Vz%NuQs.g4wKtnJwNZtS@3r>c4Z([y%g;wKtrdga8!a(!#&T*Y-Xa#!a0<or[yc3Dtq>6Vz43[y3JwNZtf@3s!Ju}!%Dti:pm3c_%X#tjB5pkd6q!r]u?voC'*-a.a2!0a&a+[yI3DtI3Ds~3DtH>6Vyw3[xx;:s#~<5pKJwNZtE@3r~d`a)!a2T#a.(!+U.X1[yT3Dt`3Dtv>6Vz&3[y&g9rxwzcxstPu.<rAJwLZtT~?r@dZa%!a.&^*Za(/Reu[ya>6Vz23[y1g3sEr}wkg{NuQRg{ci(U#5@b`~,cg#U(2WnH5wugcRh7dX#T(Y,a'Ta!!a,[yZ<]mj>6Vz,3[y+Pv#5ReZKu+=,%!H}7ABwkaS?Rh:BcW(X#<]mrj:ubv/ARekdg%!(!a.*Ta(Y.X1!#sP>Rl*Dt6[y>>6Vyo3Wf*jOvuumvuRgRJuq*!:9<B@bX~3jVv&v@s@5Re[d/rQt{uAvo&a&a*)a2!,0Wf!3Dt0=Bs'>6Re}3[xy~<5s%JwJZt1~Gs)c;&!#2sJkNuXvzq7rxu,Re8dka4!a8(aEZ+a@Y.X1Xa)[yd=Bs(3DtP>6Vz53[y4cX#X&Re:avRe9~<5s&JwJZtQ~Gs*i^rzvdRg+Jv{%!2sbB@bX}kdga,!Za?&^*T1/!a'Dt+[y6>6Vyf3Wf%g/u;s4hGu6?Rh-JvZ,!c%#&RoX54Rivj7uyvf8RgTKvZB%*!2sGh<vu5Rgq<=C::9bb~#dZ#T&Ta6Y.X*Dt>[y93Wf)coZ(T,6VyifluvRgC@95@B@bX~/hFu34cC#T,k/unq8w8Q5RkUklwQuzunq8w8Q5Rk8d/rJu?v8w9)-&!a0a;a&aIWejg3sEr/h1s<DtDJvyZqY5aws3Jvy!&Wei~Hr1:au5@Bag>23E~5c:Z&bX};kKv?w&unuVu5Rjc;>bs)#~@:Rh.=ay<a]C;b`}Vd6s/t{uAvoaxa()!a,a7%-a#a2Dt,[yF2Wo[>6Vyt3[xuNuPRi&NuPwpi#RoWh?vf8Ri%Jv]!%Ri:KvxD!.'2WeAjZu`q9rxu,Re7woeAg-unLq(qA_/*2Wg_g3u5q^9:4E}/jTrxrzv=Wkkd~0UX#^^Xa-a1a5T&a=U1a'*aEa]!a*aPaA-adok[y54Rn>;:p3~Dp5g9rpsFNvZqjg3uJp4~<5p0Pw;5qlJwNZt*@3p1Pw:5p/Ou!5p2JvG'!6Vye=<qnJvh_[xhg3v,Rh3kOwOw-sDuev/Re^dha[a%!%!a+#Ta7)-5TaCaO!aka!a)sf[yb2>Rl!9ARiq5E}Qg=ucRkBE|oJrJ_@Wk~@Wk{JrJ_@Wk|@WkyJrJ_@Wk}@WkzJvO_[y2g-vMRmiKuYC!)&>Ri;>Ri<@3RkNc](X#@9Rk=g5vuRmhKvDB!+'=]meg3u4Rmgd)#Y'Vz3CARmfd`a+!%T'!+#Ta1Ta6TaM-sTDt9[yA9sYd'%Y#s[[xpj:ueunaXRgEjRq,v-vuqdd2'`#6Rev<32@5>:2<E}5xIo9a*X#Y(;5RePJvD_g>vyRgNj8w)v8<wggs:RgXiZt|vjx,hSq3ah!-(~@:Ro/Ou!5RhWj^v(pyw8unRhUdx-UY#^Ua.a3a70!)%UX1TaDa)'omRiRRhE[y:3Dsz=Br,>6Vyj3[xkg6ruwjcqsrPw;5r*Ku]D'Zt-@3r(~?r.i[vwv]dU1a--U#`a4(g/vsRhPOu!5RhLj:rmu9Wo!~@:wdh@g/vsRiTjXuvvNr}:RhBj^v(pyw8unRn]dz1UYa'a+^Y(!aETZalaRY.Ta?a4[yDJw1!#qLsW>6Vyrfzq-pLflpwRe|Js>%!Dt@3Dt&Jvy_[xs~HrnjMuwpsw'RecKu+D#'!t<~Grl~?rjg5u-x,gwp{ah!-(~@:Rg~Ou!5Rh'jXuvvNr}:Rh#cW#X/c;&!#2sLi[v7u7RgpJv)(!iLrxu,Re6j7v@s@5Se[e7d`aW!Za(a`T.a#!a3!&aDa-!9)Dt_=6s+3[x~~DR|h~DS6avhGun5RkZj3w)v-]mkKunB!&*]kb97R|i<ARk<c:Z(6Vy}Juh'!wziMRoS:F|vkLuauJv5vtvQRh1d='T+Y#VyO~DR|jcF#T'7R|g97R|kJv3'!ay<Rj,Jvh&!:ReXcsa6*a+#a#_aIRf9aLRf?c,Z&Rf5Rf7c.Z&Rf;Rf>cQ#%T'p-Rf8Rf=ct#%'(*!,p,Rf4p+Rf6Rf:Rf<d~'Ua%U*^UYa(!a,-!#a4YaTalaEX0a8a<Weo3Dt/3Dsx=Br93Wen~Dr;~<5p<JwNZt2@3p=Pw:5p;Ou!5r3c7&!#:p>3Ds}KvGB)_6Vyk2sM=<r7x'eovA(!hFu1ARf}cV#X&@r5j6rvwQa^Rf3c=Za'wkghJv__g;unRggA53B9=b^}%j6uduo5Jq;!(hIv%2Re`Ou4ARe_e%a#^^^Xa&!a*a2!&a6YaP!*ad!#a:aE/5Rn?[y@>6Vyp;:pE~DrY~<5pBJwNZt8@3pCh=rt3rWPw:5pAJup_[xoNuPpF9c!#'45pD5ARn)d8#X'X*3@rU72s]h>v<<sSjJpqvewOJq/(!hNw'5ReBk0s2u3w/w'5ReE5@Jq.!a+JQ!&WeU23d(#Y&RjG5]jBk!u7w&u0udARjEe#+^^^Ub#!a2/a`Z(agT1!a-a;|@TaG!aS[yV=Re~fow'RguNuPRe?bz#'>RoUWeL>:Cbb|?JwPZtVg6ruRmzJvD'!6Vz(g/vmRh~Jvy_[y(g9voRgyx*cy(#2>Ri2B9b]~9kIw9u7rluJu3Rg]dI#a%UY'@=p%CAx.gQZ&RhwwygtRm{x5g_Z'+ABqR9Woa=Bp&dV#^*Xa'!&@o{g4v]Rk;Jv{!%Rk[wkkiA5RkiwwfUB=x,fUuqC&*!>RfTg8v0RfV~ARfSd;rJsAuAv9wR'ae+/aO!a@aza/a#[yQ@Wg!2Wemg3sEr0JvB_g>uvReWg2v+Re=KupB_+[y!2AbY~-~Hr2AJwD!(h<~El>h<~El?Kun@+_:9b`}Kg-v/Ri3g;vtwyk_9]k_d=&T#*U.6qh@Ab`|K9:H|CJv[!&3Dtex'fDwC%!Rf[9WlMd[(^X,!a%Z06Vz!@WgBg=v~Rgvg,QRe@awd,#Y+jTv|Q~EfWj]uNr|~FRfXdy#Y&^Ua%!aO.!(a)Ua;=!a@aKap!a-,a!Ta]a[rSa]p?[y82sK=Bq~;:p:~<5p8Pw:5p7d'#Y'Wf(;RnRi[u4w&RgJJvG'!6Vyh=<r#ijuuv/sIKuYD'ZtG@3p9~Gr&d2#`(g<vtRgFj`u5w&rqpxRf2CJuY!+:wfnTOu!5Rg}jNs1ucv&RfwJvA!&3@q|BDcC#T,k/unq8w8Q5RkTklwQuzunq8w8Q5Rk9dga#!a'!a=#a0!:+Tb*b@aO.a4!aba8aFJv^}?!VyR~Dr<g;u%Rn.~<5p[x'e`wNZtR@3p]Pw:5pZhNvjBp.woe_g5u-r4JwF!%DtO3:ooc7&!#:p^3DtpLuGw(!+%)Dtk6Vz#2sd=<r8d'#Y([y#<x3gJt`w@!)%}MRiowzikRij=]ilxAf3,U(#B2Rf#g0v-Rm[ck{`U#]giKv3>)!&6Ri154s,KuGB_%@r68r:dJ|t`#X(9<E|u2@H|rx3gJu?w'!+'1Nu7Reg4=H~+9<wxgY95Rm]xLggZ-`(X}U2:Ri4h<uOawRmsJv__5@bb{jbV~3dka#a'a]!,#a+U=a>b6a3b%!/aKa/)!arwve^VyJ;:pR~DpTg3uJpS~<5pOPw;5qmPw:5pNOu!5pQJvG'!6Vyx=<qoJvA!{~Jup!%@qk7Rn/KvyD!}''[xz;>wkh'?Rh,x8gyt`w5D!&),(SgyccRgztJ@3pPB5p#d'(Y#<]mmifubw&RgoJvE&!82s^JvF&!8Rf,ADb]~;x=h'rNu]vK!,%'*0RnORh)4Rh*AqQg-vaRnNg;wHwkh'ba~4cE#Ta*x3gctyw@'!+%RnFRnD<4Rn@hFvK5RnCxWg[#`&a0Ua()`1Rm75Rg[c]%X#qi8Rg^NvdRj>BwzgZauwji7Rm6A4wgg]d1#&(*,.0a#Rm;Rm<Rm=Rm>Rm?Rm@RmARmBe%#^^^Xaea?aC/b+(,!a+a#!a/!>a&Ta<aKbD!2wphBRnk[yPw}hE|.=Br-3Dtm>6Vy~g6urRf.x,hPrNav!%'RnqRo%Ro#Nu;q[Pw;5r+JwNZtM@3r)d'#Y'Weh;xChL#`&RnmRnoKu}>%(!Rne~Bs-;2wjcussJv+'!aYSO}6@B<5?ba~8LrNvj!.%*ROwungw~ng~:9;Ri^>wtnig;wHRnixDh@|(UZ.x1h@|)!#:2<H|*xHn]#-UX'3Ro)z=iT}6ARns=Bwsn_wpnaRncw]aR(#UXa&Ua*a/=]iPd'#Y&Ro'WnXf{QRm2hNvj]nZd`'T~&1`{|`#9b]{}c:'!#Wl{>@=be}]?cl{{U#:5Abb}Jds#^YaF!a*b4a#a3aPa>&Tb!bH!*a_!Eau?/a&RjY<]gj>6Vz*;:pe~DrZg,QRj1JwNZtX@wihspcJvZ&!VyX9WmOJu|!|N2WmHJvh&!]ht~Bpbcn&T(!#RmQ<s7Nu;padH#X'`+WmJ@>RmKCARhnKup=!)&Wf+:RhqNuPpf9c!#'45pd5AwghpARn(Ls@w!%,)!RmP@Wfe<E|IJva!&WmNg8vsRmLd`*.`#Y'Xa!axRn*]hrA8Rhug5s@rXg8u!RmMd8#X'X*3@rV72smdI*#UY&RmICARho~GsgxVgd)Ta'U-Y&Xa!T#RnEWnA@Wffg1uDRi0hFvK5RnBxGnG&#`%owp)@wsf+bX}Ze-*1!a*^^^Ua|!#a.aq&Ya2!a>.a6!a:aO`aJDtL[y`@Wg#>6Vz12@wzoYRoZNuPRi!NuPRhzg=ucRi,@=b`{Yg=ucRi-ACJvB!&Sh[ebSh]ebi`wUuFRm4Jw2_[y0JvB!.<Ju(!&SoG}6Shd}6<Ju(!&SoH}6She}6Kur@._g5vHRieJvx!{L2G{Kx6gd'T#?Rh82Wi5cZ#X(g1w)Rm5dW-Y(Ta#!a)!#aYa=wnfE=su2>>bU{0j9udv:<svj8uQv-7RgHdE%#^'sq9sp=>Bb_{TJv`!&g/r|snj6v(us5d,#Y(56H}[978H}]Jw5!&g1rushJvB!+j;v{u5?zDhd}6}bj;v{u5?zDhe}6}ce*#`(^^^a[aea!=!a6a*aoXb1a.!aAbL!b>,b'aL!aV@Wf|2Wlg3[y/JwNZt^@3piPw:5pgJunZou3@rsJva&!Vy_g<v~Rm#JvG'!6Vz0=<r{Ju{%!:pj@WfsiXuJu3Rm:JvZ&!WfA~Bph@c4Z&Dtwax5rubx(#:awRk1@d,#Y&RfjRfid1#,Y(@Wfp2Wlrg5s@ryKu[@!,'=]ig9wlk?Rk>g5u-rqJvy'!@9RkQcH(T#=>Ri~@<wkj(Wj(KuZB*!&<7rw@9RkRcH(T#=>Ri}@<wkj)Wj)dg(Ta2Xa9X#`-!a*CARhg@@=I}d9x;c~#X%so=<sj>2@@=aybb}XjWv0Q~EfEj3vLv;<d,#Y(56H}`978H}_dgaPaFa'a/!#a3Y0a_a;a|!1(a7-[yE3[xt;:pJNvZrrg3uJrvJwNZt=@3pIh=rt3rxPw:5pGOu!5rpJvG'!6Vys=<rz@c4Z&Dt(ax5rtJvZ!&~BpH@wsfNg-vaRlNci*U#=<wei<F}a5@Jq.!a*JQ!%@qZ23d(#Y&RjH5]jCk!u7w&u0udARjFd/prq=tyvpaEa(a:.!a1aZ(@@=I}:9wpd%=<sX55w_h}@@=I{t=ay<aU@@=I}T=ay<2@@=I})?C9:9au@9Cb]}DP~=x-fAZ(2Wl1=ay<aU@@=I}>5@d##Y+jTv|vV~EfFj]uNpn~FRfGdgaK!Z2&!a8a-Tb({E!acTbM*!a(DtY[yYd'%Y#sl[y*hHvh>Re5x2c{Z}.j4uCvcawRiMd+#X+_x&d!},<5RkX;2Hzw@x,gavfB-!{CcF&T#Roe;RodwWbBg5urRgaKvHC*_6Vz+<4opieuew&Rmq@d]&Y)X,T#X0Rh}<BqP=4qS9:ReMg/ujReNJw0!/<Jui%!bd{kawwnemRelAxUa?a3#*.&UX(Ya+a/RhvRnQ<o}9Wmtd-#Y&RgSRmw9;Rmxay=Rmyg-vaRmuxEhSrNu,v-voC!%(aR.a(a7+1Ro1>Ro5CE{A9b]{@;5x#eO{:g;urRi+KrNA!%(Ro3>Ro79;Ri_Ku@>{;&!x%gX|{KunA_+g5QRj/g3u5Rj#g>uERj%wio/xRhS&!,!#^1U}wba{8>>@=be}qC@:D5ba{7Ku+A&!}x?ba}t>>@=be}se(aA^^^Uat!b0#{pa+awUazbGa#aLb9bgaWac'a5TbS=Br!d1#`%scp_Jvl!#rT>Re0JvX&!VyN=H{Fcm#U&:pY=ReaJv2&!]h0=]nUJvG'!6Vy|=<r%JrM_=]h2@Wlud'#)U'Wf'b]{i=]h/Jvh!&~BpWg=v]RnMx+ny#'Nu;pVwjnu=]nwxJnx,T#`&Reqwjnt=]nvieu9vrRjLLuYwP(#+!th@wih5pX~Gr'g5v/Rh4KunA'!-CARnP@wwiN:Rm_9x'cvw>!|l=<saKvAA!0&3@q}>w^e1bp#&Re2Re3BDx7gH#T|f5H|eKuZ>!%(:qNAH{]Jv6!+3B2B9=b^{X<5<B92:E{ZLvhwA(a;a%!igQuyRmad+#Y}m@3Rh5d8#X'X*:AqUAHzmaxwbh<aXRnVcF}RT#Nw&cj#U(BWnug/vsRntdka)(a3+.Zb7aYYan1!bVa@Xa}[y^@b[{G=H{+hFu73Rj&Pv#5ReQcK%T#sig1v{Rj'Ku+D#'!t]~Grm~?rkKuMB!01d5#`'Vy.ta3Dtu~Hroc8#'{^45s85AwZbP&!#Rn!wghxWn#KvEA!)&2RlA2RlBx:h|#(T,=]j09Wobz>x]z/@awRoTd+#Y(az]hFhCrm4d,#Y+jTv|Q~EfMj]uNr|~FRfOdCa!Xa9_X#@<plJvf!%b`{(9;Rgwc;.!#2x7cw#T|UDb]|T5Ju={(!=@E{&Jv)&!Ab`{'awJvf!~*>>@=be{#KuY>!+&4Ezyi[ugv&RjIdea+T)#UXa&T-T&a!Rh9auRmW=]kLg5vuRn+g3u4Rn-Ow6ARn,hHus5xNk?#UX(U~)/g8v0RkD~AwkkF?Ri.OuNBwkkA?Ri/d|a2`a*^UYa.!aBTZaTa'Xa;!(!2!-a#b2[yC>6Vyq3[xr2Wi?g1rusVh%s?DtF~<5rbJs;%!DtBfswKtCj[uvuSsEu3RgVx3o:u+wN'*Zt;@3rd~Grh~?rfg8w)Lq)qE&-a%!>bI|`jWv0vV~EfCjTv|vV~Ef@j]uNpn~FRfBcK#T']gWNu7x,k7q4ai(0!hHv8<RhmkMu9vrsBuev/RhlCJvB!,g<v{wchh~@:Rhji[vrv{wchi~@:RhkdS&a5UY#Ta!RgPwwiI5BwciI~@:Rh`x'iJvj'!5]iJPu8Bwch]~@:Rhach)U#h3rp]gLh@t|Ax,hTq3ah!-(~@:Ro0Ou!5RhXj^v(pyw8unRhVd|)`,^UYas!a?/a2Z'a^Ta{Tb7Ta(a#!a,Wf&9sZ3DtAadamov=Bqt3[xig8vsRm~>waiL2b`{QJv*_Ouv2qgj<v]v2BqfdR'X*X#Y-@3qr~Gqv~?p6hHv-]glPup5Lq+q?_%*b_{qF{n9b^{rOu4ARhpKvCD!+&~Bqp:5Dbb}nwoiKl&unuTuBv]v+ueunaXRf0=Jvh!0nKufu8v1w&w7q%w&uHrz:Rgnj5w,uxDJq/(!hNw'5ReCk0s2u3w/w'5ReFd>Za&!*UaA=<wkgsRnSJv^!%Refifw3vyRgOKu_B'!,<]gkiiu:w&Rh<=C@a^<B57@2F{[<B5@aW:=3away9A5aW=<B=C@a^<B57@2F{Ie-#`(^^^bCara.b8aza6!/bZ,!adTbnTbOb+aFaS!aAT9@Wf~2Wli3Dtl2@d,#Y&RfnRfmJwJZtN~GqyJva&!VyMg<v~Rm%iXuJu3Rm9Jv[_=]ih9wlkDRkCd1#`(@Wg>2Wls3cH#T(@<Rj*=>Ri|b~'#23s9h<~El.d'#Y&Dtxi^rzvdRl#d*#U%(o|B2s`hJwSaxRmDKv4B&!1:Rmdd5#`'Vx}to~Hq{x'f1v3(!BA5ba|bJv_&!Wfug1v]ReIdO+U/Y#&G}-8wze=Rh{g1v]ReHg/uQRf/by#)ibQwERl/cH#T(@<Rj+=>Ri{cNu+vlax-!(#a0qa9<Rii2;;bU{H;x<i=&X#Rk`<4wwi=C9H~8xAI(Y#<azRi@45wXI<B9;5bb~7dL(X#Xa(+!aL6Vy{g5QqOau:5au2@ay547EzbxOcU(UX-T#Ta#:Cbb|A?wjh/b_|SOw6ARgtihr}u7Rhy<d1#T)X1@@=I|~=ay<2@@=aybb}Sj3vLv;<d,#Y(56H}A978H}@dGpvs@uAu`vcw9*!aFa+ai%(b!aXa8.a?a[ozWey=sU2@G}Nch&U#Rf_WexKu+D#'!t:~Gr`~?r^j]uNr|~FRg*j^psurwJt|RmcKv)@&!)7Rkv~Br[@wxfO:Rl3co#U'6Rezj_q#vIuavjRltwzeyh@vr5JqD0!>aY?C9:9au@9Cb]}9cl#U*5;5<H||jbuus1ucv&Rfvg1v~d/pppzqFr^a--a~!aMat1(hFv;Wiz@@=Izoj5uuv-7Rix~Cw`fk2WlVcZ#X,k)u3vWs@u2]ktg;wEx'fBq(_2Wg/jTv|vV~EfoJv]!15x'hzqG!(P~EfU~CRl_j6v(us5x4i-#T(2WmZ?C2F|d>Kq<aj1!*jTqIsBv=Wl`~Cw`fi2WlWj`v0u*~>RlR=c>Z,k#u3vWs@u2]kr<c1Z+jTqIsBv=Wla~Cw`fm2WlXdmb3!a{(arZa`bkTa%TbQTa-a9+c'!aM!/[yL=Bqug.w'RifhFvyDRj.g>vgwyk^9]k^Jv3_@WfbAARkhJw2_[x|JvB_wkoIRoKwkoJRoLd'(Y#<]gm=<9<H|yd'%_X#skDtb3awwqkgNulRkgdB#^',9:p'hJwSaxRmEBwVb8@4=H|qLu+w50&!)@3qs~?pU>Awwn;;Rn=c:Z'ARn<=<qwKvC@!/&~BqqJv6!&]eVb^z^xRge'/a%+^`#Sge}6<4Rn3=]n0Pw2>Rn8Jw0!&>Rn:>Rn6cY#a7+!a&=<wkaNw~h3z_c5Z{=wjh#=]nLKv^D!&)Vyz=bW|swYb<WetcG#T(2wxa@qVx@gD#Y&b^|V5JwG&!5bb|pg/w&RgD@x=kHs=uAvn!a%%/'+RmSRh694Ro`g-vaRmRhHv-]mlxCcS#`&ba~.5cD#Ta)P~=d,#Y(56H{>978H{Dd_#{2^Y%_+qbbb{6g3sERhsbU{?dfa.,`a(Xa<!aiX#(55RiG54RiHcI#T'WiU3RiVNvdwtfcRlKNvdd,#Y&RlHRlExQgf.1*^T'X#Sgf}6Wn4=]hfPrk>Rn7Jw0!&>Rn5>Rn9Lunw?&a2!,5<oq@@wqfdRlJj5Q~=d,#Y(~ARfcOuN]fdDKw;ay(}i!547E}j?cI#T(@5bV}iCbV}hdv(^^Tb?a40,b##Tbo!a*bR!a<b|a/!aKai!aU[yK=]o^g:v>ReGJwPZtK<7Rh+h<~El,Pv#5ReR@awwxjCg,ulRjDJv6&!]j!z?aQeeg>w=Sh<eeJw;!&axEzOg,Qosc!#*:wkeJ]eJ>x'h-u(!%Ro.w~h.zPdNZ(X,Ya![x{;9ReY;wkgxRiF:x?ap#Y&RmUg<s2Rkod]+UY0TZ'!a&A9sw<=bczLNvuw{gqzNhJwSaxRmCKuLay!#&s_Rf-55b^{uJvZa!!c%#(55Ri654wmiu5RiuawLu,vp!+}^%b_}Y9;wkgxba}o>A9:=b^}zKuh=a''!3awRk3c*'!#aHRk6c+Z&Rk5Rk4Jv)&!awRjSawd9*`#0?C2@EzMj8u<uJ5RmbjQrquJu3x,k>uq@_+=ayb^|W~ARkEOuN]k@7dhzV^X/X&a-#zRzSb`zXcJzTT#2WkVKvDBzW!%FzY9;5bbzWjQrquJu3Jw3%!b`zU=ayb^zQd:#X(T-a!6Vyywxh}=b]{Jg=u1RiAdGp~qHtzv!w(wA+a+a;<!aJaYai'anasb(=azRmV:Cbb{MLq2vb!%')RjuRjrRjtRjqx3jnqCw3!%')Rk(Rk+Rk&Rk)Lq2vb!%')Rj{RjxRjzRjwLq2vb!%')RjsRjpRjfRjex3jcqCw3!%')Rk'Rk*RjkRjl9<CbbzfOu4ARhxLq2vb!%')RjyRjvRjhRjgx=joq*uKvb!%')+-Rk.Rk%Rj~Rk-Rk#Rj}x=jdq*uKvb!%')+-Rk,Rk!Rj|RjmRjjRjidAq&qKs@uAv8Aa.'*-a@a&0!aM@a5[y73Dsy3Ds|3Dt):wxgI2sHJwJZt.~Gqxwsf0ikrzt}Rl0Jvy_[xj~HqzKv_A|D!&WfP8axRoVcf,U#k(v]v+ueunaXRf1Ju}'!g8u#Ri=jQw!sCunLprq>!,')~<5qeGzq9F{W=c##%s5au:5aU3CBE|;d4#X(D!a&6Vygx(b;#(=]ed?C2F{N<capoq2r[a&!aPa9,'Pw;5s:@@=I|,55w_h|@@=IzcP~=x'fCqB_2Wl2>aU@@=I|1OuNBc1Z+jTqIsBv=Wlc~Cw`fl2WlZ~AcTa%!Z+jTqIsBv=Wlb~Cw`fh2WlYk+uNqJsBv=WlSg,u3dca3#UXaMYa)TaB-=cM|7T#<bI}l5@B932:aV2G{BOuNBJq:|M!5Ezt=<B=C@a^<B57@2F{v>cB{/T#=ay<bI{3Jv6!a.6BKq0ah&+!5E}HP~Ef{978BaU@@=Iza<7d#.Y#978BaU@@=IzH~AJq0!(@@=IzG978BaU@@=IzFe,aU*Y&^^^bvJb,b:bFad!a,c2Ta>aL.bo6!a#CbTa'T#Re{2Wlh2@G{yg6t~Ro_NvdRfticuRQRllJv3&!x&c|zs@Jw3!%RflwpfkRlpKuL;%(!Re<@G|C2GzdhIvuBwgjAg-u0RjAKQB%!(GzZ@G|5NuuRl7d='T+Y#Vy[g<v~Rm!==G|>JvA!)@wma=]m1ifuaw&RmnLs@vT'!|/+[y,g:v>ReTJw1!#qX=x!eC{bLu+wT&)ZtZauq_~Graci&U#F|89:r_Lupvq!.)&2RlG8RfaC=x!eF{_h?rpWlmd&'!#X|&]k::xJey#`'T|+<E|&2@H|%dE#(^,g;u.RiEg6vjRiC9xCkA{O|zY#g=ucRmXKs0@!&*@G|m@awRknJuh!,3d(}gY}eJvj!%Rm):Jw3!%Rm+Rm-Ls0w(&!a(a#@b[|6cZ#X'7RkxWgAOu4ARn'dH'U#Y*Vz-Wm'CARm}d]*#a%^a*T'aK!a<9bV{PC=p*Jw4!&SgxcbB5r]idw(wBRmF7xFkt#&`(Rm/Rm8E|!JuY_9:Rl5=wrgr2:bbxd@xXfB(a*#T+!.X0X1Ta/a'T&RlDRfL>RlyARl9b[z[>RfZ:RlL:RfRwlg/ARl;9;RlxKv,A/!%7s69<74=BA5ba{-8Bde#`a<XaKYa1,a'P~=wxfB2bZ}}?C972@@=I}r8@55B9;5bb}G978B2@@=aybb}3j3vLv;<Jw3&!>Rfk=ayb^}4~Ad1#`*@@=aybb{w2@>==<bbz]dx+UY#^UaF!a9!bB'Ya1.!ajXa#%olRhD[y=3Dt#Ov5BrHKuMB%!(Rf^Wep~HrJwkiQjKr|~FRg)Ku+D#'!t5~GrF~?rDdV)UY,Z/_7RkuG{<~BrBg,rlsO:235B@bX}|d?a1!#`(6Vyn5@d##Y+jTv|vV~EfIj]uNpn~FRfH7Lq2vb1!a9-978BaU@@=Iz9978BbU}#~AJq0!(@@=Iz8978BaU@@=Iz7~AJQ|}!978BbU}!JvkaK!AdUa21-U#`a+(g/vsRn~Ou!5RPj:rmu9WhOjXuvvNr}:RhAj^v(pyw8unRn[kPr}p|u7vwv]RiSBd;pppzq@qHQa?(b.!a.a`@.|xa(hFv;Wiyj5uuv-7Riw~Cw`fg2WlU978BbU|wOuNBJqG!(P~EfD~CRlQcZ#X,k)u3vWs@u2]ksg;wEx'f@q1_2Wg.j]uNpn~FRfqJv]!15x'h{qG!(@@=IzK~CRl^j6v(us5x4i,#T(2WmY?C2F{1>Kq<aj1!*jTqIsBv=Wld~Cw`fj2Wl[j`v0u*~>RlT=c>Z,k#u3vWs@u2]kq<c1Z+jTqIsBv=Wle~Cw`fn2Wl]dn1#c(a(b^a2!b/bAT(bj!aDa7bu,a_a{c0!2T0g:v>ReD2@G{42@G{5~DpM~<5rc=Bx6i>{RT#RnI@zCx]y]z:2Jv[!zr5Awyk]9]k]dD(Y+X#6Vz.g=wKtgwhaCwgmTWj2Lu,w%_+/[y-B;b^xeg3u3Rj-2@bX{*KrJ<!+'@Wg(g?QRlC@Jv`!%b[zIwsfII}8JQ_@w|kW|=Jv(%!AqcOuNBJvEzh!bYzjLs@wP#(0!oy@>RkdJwMZtc3Dtd@BcG#T'9bWxg2@2Fznd*#Y+;2x'c}w<zizixNgwa#Z'U+!/!a'!a+w~g~z6wcn{Rn}wcnzRn|5Rh%=]nJg5vuRmvNvdRlvcprJu}w*az*a#!%.a.'Bot9qT]kj@Wg'ay2Gzv@Jv`!%b[zEwsfHI}1;ck#Ux`<Cbbx_Lu+w!a&0*!wko*wwo,So,}6Juqxf!E}PigQuyRm`d3(`#8>Rn%:A5B;bZ~%KvhCa!a2!x>k7#Uxb@b{#xaRk7Jw0!)>wwhlShl}6>wwhmShm}6CJvB!.x'hhvj{!!5Bwkhhbaz}x'hivjz~!5Bwkhibaz|xEhTrNu,v-vpD!a%&/)a3a.,%Ro2t[CE{)@3re9b]{%wjo09:rgc:Z&Ro6=<riifuaw&RmoKrNA!%(Ro4>Ro89;Ri`dSaL'UYzxZb)7Rka3xRhT&!,!#^1U}vbaz{>>@=be}yC@:D5bazzKu+A&!}{?ba}y>>@=be}wxBh[t`u~vJvr!%a!a()a,a0a4RoC=]o;Ju(!%RoGRhdwjh`=]oAg>w#Ro?g5vuRo=NvdRl|Ku]C.!&;RoEJvB!%RoORoMBx'h[v+_?w~h`}~5?w~hd~!xKh]oiptu-utv.vp!#%&a30a@a'a+(a/aOp(o~p!RoDJu(!%RoHRhewjha=]oBNvdRl}g>w#Ro@g5vuRo>c[#X']o<CauRoRAd-#Y':RkpauRoQKu]C.!&;RoFJvB!%RoNRoPBx'h]v+_?w~ha}t5?w~he}ue!/UbhYacXaW^Tc&a;b:a-c/#b&aja1(!cL+!bKbt!bmcRc9aIc?8[yW3Dtt94Rg`Jv}!&SiRMzBhEebShEMNuPRe>x7gL#TzuwjirRipc<Z&>on;>z=h-MSh.Mwqczx'a7vj&!>Re4@=ResJt__NuPRi*NuPRi)j]uNr|~FRfzKrJ>_+@Wfy@Wf]2WocKrJ<!+'@Wg%g/QRl@@Jv`!&awRl<wsfFIzgLu(w*!.*&ShBMwvhIRhI9;RhNx1hK'!#Sn]Mx1hK~0!#:2<H~7cNu+w7D*'1ZtW>Rn1~?rOc:Z&Rn2=<rQ<7wjh&=BSnLMc]#X(6Vz)w[b=a!U#9wzgMc3#&(RgMRitRis<x,gKt`ax!&+SioM=BSilMc3#&(RgKRinRimKurB,!&SiQMzBhDebShDM6BJQ!(P~Efx978B2@@=I}WLrJw!!,a*&@G}O@9wkibRid@@x'fKwC!&SlDMSfLMjUv~Q~EfKKv3@a+!(hFv-]mpx/hYZ(C5RiWz<o/MwkhY?So/M@x,gbvfB*&!SgEM:SoeeehFu3:Rgbda(,^TZa)X/7Sg[eb:2RgI~BrMC@wgkc:wwkcRerx3h(uUvK!&*,SnOM4Sh*MArRg;wHRh(x=h;rJvPwI!a4',a'0@Wg&=BSh/Mg>w=Rh=g3w*wwgGRgGcW(X#;Sg}M2Gzk@Jv`!&awRl=wsfGIz`dKZ*T'Y-:RhR7RhQg5u-p`j6v(us5d,#Y+~Awkia?RicOuNBwkibba}Ld6p~tyu_vbAa'a+!a/'a3aEa8a!>Sh,ebJv{!&Sh@ebSaReb9;SgwebNuPRi(NvdRl)NuPRi'hHu^<Rm^Jvv_@Wl(g;u1Si/ebKu'B&!*Sh?eb@Wl'z@aPeb95Si.ebcpputyvjB)!,&a+0a%ShAMWeK@G}C@WfJ9;RhMwvhH9w{ia}ix,hJvRA1(!zAn[MRhHx1hJ~*!#hFv(BSn[MBJQ!(@@=I~'978B2@@=I}2db.Ua<'X}+T#a0XaG2G}E;wkg|wuh!Rh!x,hZu,@)!&So0MVy)C5RiXACJvB!&5RiY5RiZg8w)cG}*T#2@bU}=KsA>(!a.3wkhZba~(x,h^u(A!&(SoCMRhb5Bz=h[eb?w~hb~6x,h_u(A!&(SoDMRhc5Bz=h]eb?w~hc~6e)aA1T#T,^^^c-bMb&blcPaP(a/!0!bA=b5c@a(!bfbrc#2afwmhARnjwchORnp2Wlf3DtsNvdRl-2@wpa<]m0bx(#:awRk2@Jw3!%RfhwpfgRlnKQB%!(G{V@G|'NuuRl6d='T+Y#VyUg<v~Rl~==G|<Jv+'!aYShC}6@B<5?ba~8@Jw3'!g2QRljhLrpWlOd+#Y'g.w'rIg>w*wgj@g-u0Rj@Lu+wT&)ZtUauq]~GrGci&U#F|39:rELrNvj!.%*RhCwunfw~nf~:9;Ri]>wtnhg;wHRnhx3hDs@v~!/+'@Wfr@9RkSNu&Rlo=@<5GzoKs0@_+@Wl+@awRkmJuh!-3d(}pY#qWJvj!%Rm(:Jw3!%Rm,Rm*de&!1U-U#`)Re;@G|.@9Ri82@wjfvRlq=@<5GzpLvOvr!).&2RlF8Rf`C=x!eE{.Jw3_g2QRlkhLrpWlPde(!#U{s,UXa*Ta'[y'g:v>ReS;x0PZ&RnlRnn~HrKJw1}f!=x!eB|2w]aP(#Xa&a*Ta.Ua2a7=]iOd'#Y&Ro&WnWg;u.RiDg6vjRiBNvdRlzhNvj]nYJuW_2Wm3x)kFze{9d])!a.!,Y01!#&aC!a3RndC=ox~BrC@2b^{pg,rlse7x'ksuq!%Rm.E{xidw(wBRmGx9o+)X#wwo-So-}69:Rl4@xSf@a#XZ'X)X,Ta(/ARl8b[xc>RfY:RlI:RfQwlg.ARl:9;Rlwdn'#^XafaQa1X1TaHTa)@b[{zcZ#X'7RkwWg@Ou4ARn&x)kG#{,g7u/RkGdH'U#Y*Vz'Wm&CARm|bx#(A]gUbUzJj9Q~=d,#Y(56H}l978H{U7d,0#U*2>ABb_xZ978BbU{e~AJQ{g!978BbU{hxMh?ad{oUYZ.x1h?{l!#:2<H{mx3n[t{vl!,&a%3Ro(z=iS}6ARnr=Bwsn^wvn`Rnbd`*T}B0!#^X'BG{c9b]{a>>@=be}F?JvS!&BG{d7BG}(Bde#`a1X,Ya@!a'P~=wxf@2bZ}I56B2@@=aybb}08@55B9;5bb}<j3vLv;<Jw3&!>Rfg=ayb^}&OuNBKuLA!)a!P~=x#fD{f2@>==<bbzl?C972@@=Ix^d6rSu,v7w*C(0a)a6#B+a%!sQ[y?3Dt%3[xn~<5rLOu!5p@Ku+D#'!t7~GrP~?rNKvlaya7'!h+v-5qMg=t|cd,U#5AAaa5Abb{S@52B5@a[@52B5Gx[iXueu;d<#`a(!/549C;ag>23ExY5@Dah89b^~689Jv)!~2b[~1Lv'w(%*!a#bX|aPrmawRe]keu7uhv-q6rxu,q`xTo]/a5aU!bNaDXbi!b-!ao!b<bwA!#5@B932:aV2G|:d-)Y#hJrL>RhG<7@C5<H|_=Cau:5aj5@B932:bJ|ng>vIbs)#?C2F|9jPv0w.vISh-MKvUaz(.!9ABbb|[5;5<H|Eg>unwfh;9:4E|YjQsBt|vjx'hYq3!(?C2F|J:2<BaY?C2F|GOu!5x,g|p{ah!-(?C2F|c9:4E|OjXuvvNr}:Rh&i[w*t|cd+U#jJvsu)vsSn~Mkfrmu9p}u7vwv]So!McW#Xa!ax5@A5aY:5;5<H|>kJv~vYrquJu3x4ib#T)2@SmZM?C2F|Bj:rmu9@xPhI(a*a#U#`a3-5Abb|L~@:RhK9:4E|0@52B5G|#C::aY?C2F|-:2<BaY?C2F|.5Jvk!a)javYrquJu3x4ia#T)2@SmYM?C2F|HAxPhH(!a#U#`a*-5Abb|4~@:RhJ9:4E|R@52B5G|F:2<BaY?C2F|Sc^#Xa2j=Qq5CJvB!-g<v{z;hhM?C2F|Zi[vrv{z;hiM?C2F|XKsA>!a)-g<v{z;h[eb?C2F|]i[vrv{z;h]eb?C2F|^iZu.vix,hZq3ah!.(?C2F|QOu!5ShXM:2<BaY?C2F|P\",\n 13_494,\n 2713,\n 49,\n 25,\n 61,\n);\n", "// Generated using scripts/write-decode-map.ts\n\n/** Packed XML decode trie data. */\nexport const xmlDecodeTree: Uint16Array = /* #__PURE__ */ new Uint16Array([\n 512, 26_465, 29_036, 7, 0, 2, 4, 116, 24_638, 116, 24_636, 8693, 29_807,\n 24_610, 621, 1, 0, 0, 3, 112, 24_614, 111, 115, 24_615,\n]);\n", "/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * The trie is a flat `Uint16Array`. Every node starts with one header word:\n *\n * 15..14 VALUE_LENGTH Number of words the value occupies, +1.\n * 0 = no value; 1 = value inline in bits 12..0;\n * 2/3 = value in the 1/2 words after the header.\n * 13 FLAG13 If VALUE_LENGTH > 0: semicolon required (\"strict\"\n * entity; `;` is never stored as a branch).\n * If VALUE_LENGTH == 0: this node is a compact run.\n * 12..7 BRANCH_LENGTH Number of branches (or run length for runs).\n * 6..0 JUMP_TABLE Jump-table offset / single-branch char / first\n * run char (see below).\n *\n * Branch data follows the header and any value words. Its shape is selected\n * by (JUMP_TABLE, BRANCH_LENGTH) in the header:\n *\n * Single branch JUMP_TABLE = the only child's char, BRANCH_LENGTH = 0.\n * No branch words; the child node follows immediately.\n * Jump table JUMP_TABLE = first covered char (> 0), BRANCH_LENGTH =\n * table length. One word per covered char: 0 = no branch,\n * otherwise the child's offset from the END of the table,\n * +1 (so 0 stays the no-branch sentinel).\n * Dictionary JUMP_TABLE = 0, BRANCH_LENGTH = number of branches.\n * ceil(n/2) words of sorted keys packed two per word\n * (low byte first), then n pointer words storing the\n * child's offset from the END of the branch data.\n * Compact run VALUE_LENGTH = 0, FLAG13 set. BRANCH_LENGTH = run\n * length (3..63), JUMP_TABLE = first char; remaining run\n * chars packed two per word after the header. The target\n * node follows the packed words immediately.\n *\n * Pointers are end-relative (rather than relative to the pointer's own\n * position) because that makes the common \"child encoded right after the\n * branch data\" case a small constant, which compresses far better. Offsets\n * to already-encoded (shared) nodes wrap via uint16 modulo arithmetic; the\n * decoder masks navigation results with `& 0xff_ff` to match.\n */\nexport const enum BinTrieFlags {\n VALUE_LENGTH = 0b1100_0000_0000_0000,\n FLAG13 = 0b0010_0000_0000_0000,\n BRANCH_LENGTH = 0b0001_1111_1000_0000,\n JUMP_TABLE = 0b0000_0000_0111_1111,\n /** Bits 12..0: the inline value of a VALUE_LENGTH = 1 header word. */\n VALUE_MASK = 0b0001_1111_1111_1111,\n}\n", "import {\n codePointToString,\n replaceCodePoint,\n replaceCodePointXML,\n} from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\n\nconst enum CharCodes {\n AMP = 38, // \"&\"\n NUM = 35, // \"#\"\n SEMI = 59, // \";\"\n EQUALS = 61, // \"=\"\n ZERO = 48, // \"0\"\n NINE = 57, // \"9\"\n LOWER_A = 97, // \"a\"\n LOWER_X = 120, // \"x\"\n}\n\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\n\n/*\n * `parseNumericEntity` packs its two results into one 32-bit integer:\n * `(consumed << CONSUMED_SHIFT) | codePoint`. The 21-bit code point field\n * fits any valid Unicode value (max 0x10FFFF, clamped before packing); the\n * consumed count excludes `&` and gets the remaining 11 bits. Extract it\n * with `>>>` so the topmost bit isn't treated as a sign.\n *\n * Plain consts rather than a `const enum`: with `isolatedModules`, enum\n * member reads compile to runtime property loads.\n */\nconst CONSUMED_SHIFT = 21;\nconst CODE_POINT_MASK = 0x1f_ff_ff;\n/**\n * Reserved consumed field for counts of at least 2047 characters after `&`.\n * The true count is in `longNumericConsumed`.\n */\nconst CONSUMED_OVERFLOW = 0x7_ff;\n\n/**\n * Side channel for numeric entities of at least 2048 characters including\n * `&`. Set by `parseNumericEntity` when its consumed count reaches the\n * reserved value `CONSUMED_OVERFLOW`; callers read the true count from here.\n * A module-level slot avoids a tuple allocation on the hot path.\n */\nlet longNumericConsumed = 0;\n\n/**\n * Extract the consumed count from a `parseNumericEntity` packed result,\n * recovering the true length from `longNumericConsumed` when the packed\n * field contains the sentinel. Read it before the next `parseNumericEntity`\n * call, which may overwrite the side channel. This helper owns that protocol.\n * @param packed Packed result of `parseNumericEntity`.\n */\nfunction unpackConsumed(packed: number): number {\n const consumed = packed >>> CONSUMED_SHIFT;\n return consumed === CONSUMED_OVERFLOW ? longNumericConsumed : consumed;\n}\n\n/**\n * Unsigned subtraction trick: (code - lo) >>> 0 wraps negatives to large\n * values, so a single `<=` covers the entire [lo..hi] range check.\n * @param code Code point to check.\n */\nfunction isNumber(code: number): boolean {\n return (code - CharCodes.ZERO) >>> 0 <= 9;\n}\n\nfunction isHexadecimalCharacter(code: number): boolean {\n return ((code | TO_LOWER_BIT) - CharCodes.LOWER_A) >>> 0 <= 5; // F - a\n}\n\nfunction isAlpha(code: number): boolean {\n return ((code | TO_LOWER_BIT) - CharCodes.LOWER_A) >>> 0 <= 25; // Z - a\n}\n\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n * @param code Code point to check.\n */\nfunction isEntityInAttributeInvalidEnd(code: number): boolean {\n return code === CharCodes.EQUALS || isAlpha(code) || isNumber(code);\n}\n\nconst enum EntityDecoderState {\n EntityStart,\n NumericStart,\n NumericDecimal,\n NumericHex,\n NamedEntity,\n}\n\n/**\n * Decoding mode for named entities.\n */\nexport enum DecodingMode {\n /** Entities in text nodes that can end with any character. */\n Legacy = 0,\n /** Only allow entities terminated with a semicolon. */\n Strict = 1,\n /** Entities in attributes have limitations on ending characters. */\n Attribute = 2,\n}\n\n/**\n * Producers for character reference errors as defined in the HTML spec.\n */\nexport interface EntityErrorProducer {\n missingSemicolonAfterCharacterReference(): void;\n absenceOfDigitsInNumericCharacterReference(\n consumedCharacters: number,\n ): void;\n /**\n * Validate the accumulated numeric value, before Unicode replacement.\n * Values beyond the JavaScript number range are positive infinity.\n */\n validateNumericCharacterReference(code: number): void;\n}\n\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n /** The current state of the decoder. */\n private state: number = EntityDecoderState.EntityStart;\n /** Characters that were consumed while parsing an entity. */\n private consumed = 1;\n /**\n * The result of the entity.\n *\n * For named entities: the trie index of the best legacy match so far\n * (0 = none). For numeric entities: the accumulated code point.\n */\n private result = 0;\n\n /** The current index in the decode tree. */\n private treeIndex = 0;\n /**\n * Characters consumed since the last recorded legacy match, plus one.\n * Invariant at the top of the `stateNamedEntity` loop: `excess` equals\n * the number of unrecorded consumed characters + 1.\n */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive (read via destructuring)\n private excess = 1;\n /** The mode in which the decoder is operating. */\n private decodeMode = DecodingMode.Strict;\n /** The number of characters that have been consumed in the current run. */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n private runConsumed = 0;\n\n constructor(\n /** The predefined HTML or XML decode tree. */\n private readonly decodeTree: Uint16Array,\n /**\n * The function that is called when a codepoint is decoded.\n *\n * For named entities that decode to multiple code points, this will\n * be called multiple times, with the second codepoint, and the same\n * `consumed` value.\n * @param codepoint The decoded codepoint.\n * @param consumed The number of characters consumed by the decoder.\n */\n private readonly emitCodePoint: (cp: number, consumed: number) => void,\n /** An object that is used to produce errors. */\n private readonly errors?: EntityErrorProducer | undefined,\n ) {}\n\n /**\n * Resets the instance to make it reusable.\n * @param decodeMode Entity decoding mode to use.\n */\n startEntity(decodeMode: DecodingMode): void {\n this.decodeMode = decodeMode;\n this.state = EntityDecoderState.EntityStart;\n this.result = 0;\n this.treeIndex = 0;\n this.excess = 1;\n this.consumed = 1;\n this.runConsumed = 0;\n }\n\n /**\n * Write an entity to the decoder. This can be called multiple times with partial entities.\n * If the entity is incomplete, the decoder will return -1.\n *\n * Mirrors the non-streaming `decodeWithTrie`, but with the ability to stop decoding if the\n * entity is incomplete, and resume when the next string is written.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n write(input: string, offset: number): number {\n switch (this.state) {\n case EntityDecoderState.EntityStart: {\n if (input.charCodeAt(offset) === CharCodes.NUM) {\n this.state = EntityDecoderState.NumericStart;\n this.consumed += 1;\n return this.stateNumericStart(input, offset + 1);\n }\n this.state = EntityDecoderState.NamedEntity;\n return this.stateNamedEntity(input, offset);\n }\n\n case EntityDecoderState.NumericStart: {\n return this.stateNumericStart(input, offset);\n }\n\n case EntityDecoderState.NumericDecimal: {\n return this.stateNumericDecimal(input, offset);\n }\n\n case EntityDecoderState.NumericHex: {\n return this.stateNumericHex(input, offset);\n }\n\n default: {\n // NamedEntity \u2014 the only remaining state.\n return this.stateNamedEntity(input, offset);\n }\n }\n }\n\n /**\n * Switches between the numeric decimal and hexadecimal states.\n *\n * Equivalent to the `Numeric character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n // eslint-disable-next-line unicorn/consistent-class-member-order\n private stateNumericStart(input: string, offset: number): number {\n if (offset >= input.length) {\n return -1;\n }\n\n if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n this.state = EntityDecoderState.NumericHex;\n this.consumed += 1;\n return this.stateNumericHex(input, offset + 1);\n }\n\n this.state = EntityDecoderState.NumericDecimal;\n return this.stateNumericDecimal(input, offset);\n }\n\n /**\n * Parses a hexadecimal numeric entity.\n *\n * Equivalent to the `Hexademical character reference state` in the HTML\n * spec. Digit parsing matches the hex loop in `parseNumericEntity`.\n * The accumulated value is preserved for numeric validation callbacks.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNumericHex(input: string, offset: number): number {\n const inputLength = input.length;\n // Local accumulators; flushed before any exit (see stateNamedEntity).\n let { result } = this;\n let { consumed } = this;\n while (offset < inputLength) {\n const char = input.charCodeAt(offset);\n if (isNumber(char) || isHexadecimalCharacter(char)) {\n // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n const digit =\n char <= CharCodes.NINE\n ? char - CharCodes.ZERO\n : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n result = result * 16 + digit;\n consumed += 1;\n offset += 1;\n } else {\n this.result = result;\n this.consumed = consumed;\n return this.emitNumericEntity(char, 3);\n }\n }\n this.result = result;\n this.consumed = consumed;\n return -1; // Incomplete entity\n }\n\n /**\n * Parses a decimal numeric entity.\n *\n * Equivalent to the `Decimal character reference state` in the HTML\n * spec. Digit parsing matches the decimal loop in `parseNumericEntity`.\n * The accumulated value is preserved for numeric validation callbacks.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNumericDecimal(input: string, offset: number): number {\n const inputLength = input.length;\n // Local accumulators; flushed before any exit (see stateNamedEntity).\n let { result } = this;\n let { consumed } = this;\n while (offset < inputLength) {\n const digit = input.charCodeAt(offset) - CharCodes.ZERO;\n if (digit >>> 0 > 9) {\n this.result = result;\n this.consumed = consumed;\n return this.emitNumericEntity(digit + CharCodes.ZERO, 2);\n }\n result = result * 10 + digit;\n consumed += 1;\n offset += 1;\n }\n this.result = result;\n this.consumed = consumed;\n return -1; // Incomplete entity\n }\n\n /**\n * Validate and emit a numeric entity.\n *\n * Implements the logic from the `Hexademical character reference start\n * state` and `Numeric character reference end state` in the HTML spec.\n * @param lastCp The last code point of the entity. Used to see if the\n * entity was terminated with a semicolon.\n * @param expectedLength The minimum number of characters that should be\n * consumed. Used to validate that at least one digit\n * was consumed.\n * @returns The number of characters that were consumed.\n */\n private emitNumericEntity(lastCp: number, expectedLength: number): number {\n // Ensure we consumed at least one digit.\n if (this.consumed <= expectedLength) {\n this.errors?.absenceOfDigitsInNumericCharacterReference(\n this.consumed,\n );\n return 0;\n }\n\n // Figure out if this is a legit end of the entity\n if (lastCp === CharCodes.SEMI) {\n this.consumed += 1;\n } else if (this.decodeMode === DecodingMode.Strict) {\n return 0;\n }\n\n this.emitCodePoint(\n (this.decodeTree === xmlDecodeTree\n ? replaceCodePointXML\n : replaceCodePoint)(this.result),\n this.consumed,\n );\n\n if (this.errors) {\n if (lastCp !== CharCodes.SEMI) {\n this.errors.missingSemicolonAfterCharacterReference();\n }\n\n this.errors.validateNumericCharacterReference(this.result);\n }\n\n return this.consumed;\n }\n\n /**\n * Flush locally-tracked walk state back to the fields, then emit the\n * recorded legacy match or reject (cold path \u2014 at most once per\n * entity). Called after failed navigation (leaf node, branch miss, or\n * compact-run mismatch). In attribute mode, reject if no legacy was\n * recorded at the current node, if we descended past it, or if the\n * pending input character is an invalid attribute terminator.\n * @param consumed Locally-tracked consumed count.\n * @param excess Locally-tracked excess count.\n * @param char Pending input character (may be the mismatching char).\n * @param valueLength Value length at the current trie node.\n */\n private flushAndEmitLegacyOrReject(\n consumed: number,\n excess: number,\n char: number,\n valueLength: number,\n ): number {\n this.consumed = consumed;\n this.excess = excess;\n return this.result === 0 ||\n (this.decodeMode === DecodingMode.Attribute &&\n (valueLength === 0 ||\n excess > 1 ||\n isEntityInAttributeInvalidEnd(char)))\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n\n /**\n * Parses a named entity.\n *\n * Equivalent to the `Named character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNamedEntity(input: string, offset: number): number {\n const { decodeTree } = this;\n const inputLength = input.length;\n const isStrict = this.decodeMode === DecodingMode.Strict;\n\n /*\n * Local copies of the resumable walk state avoid per-character\n * field writes. They are flushed back to the fields\n * on every exit (chunk end, and before any emit helper that reads\n * them). `this.result` is only written at the (rare) record points,\n * so it stays a direct field write.\n *\n * Legacy-match recording happens in two idempotent places: at the\n * loop top when sitting on a value node, and in the chunk-end\n * epilogue (so `end()` sees matches that land exactly on a chunk\n * boundary). Recording applies `consumed += excess - 1; excess = 1`,\n * which is a no-op when repeated \u2014 the loop-top invariant is\n * `excess` = unrecorded consumed characters + 1.\n */\n let { treeIndex } = this;\n let { excess } = this;\n let { consumed } = this;\n let current = decodeTree[treeIndex];\n\n while (offset < inputLength) {\n /*\n * Descend through value-less jump-table nodes (including the\n * single-branch encoding) inline, mirroring `decodeWithTrie`:\n * this avoids a `determineBranch` call per level for the\n * dominant node shape \u2014 including the root on the first write.\n */\n while (\n (current &\n (BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)) ===\n 0 &&\n (current & BinTrieFlags.JUMP_TABLE) !== 0\n ) {\n const char = input.charCodeAt(offset);\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n if (branchCount === 0) {\n // Single branch encoded inline in the jump offset bits.\n if (char !== jumpOffset) {\n return this.flushAndEmitLegacyOrReject(\n consumed,\n excess,\n char,\n 0,\n );\n }\n treeIndex += 1;\n } else {\n const slot = char - jumpOffset;\n if (slot >>> 0 >= branchCount) {\n return this.flushAndEmitLegacyOrReject(\n consumed,\n excess,\n char,\n 0,\n );\n }\n const stored = decodeTree[treeIndex + 1 + slot];\n if (stored === 0) {\n return this.flushAndEmitLegacyOrReject(\n consumed,\n excess,\n char,\n 0,\n );\n }\n // End-relative: branch data ends at treeIndex+1+branchCount.\n treeIndex = (treeIndex + branchCount + stored) & 0xff_ff;\n }\n current = decodeTree[treeIndex];\n offset += 1;\n excess += 1;\n /*\n * `charCodeAt` past the end returns NaN, which would alias\n * to slot 0 after `>>> 0` \u2014 bail out explicitly.\n */\n // eslint-disable-next-line unicorn/no-break-in-nested-loop\n if (offset >= inputLength) break;\n }\n if (offset >= inputLength) break;\n\n // Handle compact runs (resumable across chunks).\n if (\n (current &\n (BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)) ===\n BinTrieFlags.FLAG13\n ) {\n const runLength =\n (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 3..63 */\n let { runConsumed } = this;\n\n // If we are starting a run, check the first char.\n if (runConsumed === 0) {\n const char = input.charCodeAt(offset);\n if (char !== (current & BinTrieFlags.JUMP_TABLE)) {\n return this.flushAndEmitLegacyOrReject(\n consumed,\n excess,\n char,\n 0,\n );\n }\n offset += 1;\n excess += 1;\n runConsumed = 1;\n }\n\n // Check remaining characters in the run (packed two per uint16 word).\n while (runConsumed < runLength) {\n if (offset >= inputLength) {\n this.treeIndex = treeIndex;\n this.excess = excess;\n this.consumed = consumed;\n this.runConsumed = runConsumed;\n return -1;\n }\n\n const charIndexInPacked = runConsumed - 1;\n const packedWord =\n decodeTree[treeIndex + 1 + (charIndexInPacked >> 1)];\n const expectedChar =\n (packedWord >> ((charIndexInPacked & 1) << 3)) & 0xff;\n\n const char = input.charCodeAt(offset);\n if (char !== expectedChar) {\n this.runConsumed = 0;\n return this.flushAndEmitLegacyOrReject(\n consumed,\n excess,\n char,\n 0,\n );\n }\n offset += 1;\n excess += 1;\n runConsumed += 1;\n }\n\n this.runConsumed = 0;\n treeIndex += 1 + (runLength >> 1);\n current = decodeTree[treeIndex];\n // Loop top handles the landed-on node (record/emit/branch).\n continue;\n }\n\n // Header plus out-of-line value words; 0 means no value.\n const valueLength = current >>> 14;\n const char = input.charCodeAt(offset);\n\n if (valueLength !== 0) {\n // Record a legacy match (FLAG13 clear = semicolon optional).\n if (!isStrict && (current & BinTrieFlags.FLAG13) === 0) {\n this.result = treeIndex;\n consumed += excess - 1;\n excess = 1;\n }\n\n /*\n * Implicit semicolon handling: emit immediately. Covers both\n * strict (FLAG13 set) and legacy entities \u2014 neither stores\n * an explicit `;` branch in the trie.\n */\n if (char === CharCodes.SEMI) {\n return this.emitNamedEntityData(\n treeIndex,\n valueLength,\n consumed + excess,\n );\n }\n\n /*\n * `valueLength === 1` packs the codepoint into the header\n * word's low 13 bits, where branch metadata also lives. Skip\n * the branch lookup on leaves so those value bits aren't\n * reinterpreted as branch offsets.\n */\n if (valueLength === 1) {\n return this.flushAndEmitLegacyOrReject(\n consumed,\n excess,\n char,\n valueLength,\n );\n }\n }\n\n // Value-bearing or dictionary node: dispatch through determineBranch.\n const next = determineBranch(\n decodeTree,\n current,\n treeIndex + (valueLength || 1),\n char,\n );\n\n if (next < 0) {\n return this.flushAndEmitLegacyOrReject(\n consumed,\n excess,\n char,\n valueLength,\n );\n }\n\n treeIndex = next;\n current = decodeTree[treeIndex];\n offset += 1;\n excess += 1;\n }\n\n /*\n * Chunk exhausted. Record a legacy match we may be sitting on, so a\n * subsequent `end()` emits it, then persist the walk state.\n */\n if (\n !isStrict &&\n current >>> 14 !== 0 &&\n (current & BinTrieFlags.FLAG13) === 0\n ) {\n this.result = treeIndex;\n consumed += excess - 1;\n excess = 1;\n }\n this.treeIndex = treeIndex;\n this.excess = excess;\n this.consumed = consumed;\n return -1;\n }\n\n /**\n * Emit a named entity that was not terminated with a semicolon.\n * @returns The number of characters consumed.\n */\n private emitNotTerminatedNamedEntity(): number {\n const { result, decodeTree } = this;\n\n const valueLength = decodeTree[result] >>> 14;\n\n this.emitNamedEntityData(result, valueLength, this.consumed);\n this.errors?.missingSemicolonAfterCharacterReference();\n\n return this.consumed;\n }\n\n /**\n * Emit a named entity.\n * @param result The index of the entity in the decode tree.\n * @param valueLength Encoded value length (header plus any value words).\n * @param consumed The number of characters consumed.\n * @returns The number of characters consumed.\n */\n private emitNamedEntityData(\n result: number,\n valueLength: number,\n consumed: number,\n ): number {\n const { decodeTree } = this;\n\n this.emitCodePoint(\n valueLength === 1\n ? decodeTree[result] & BinTrieFlags.VALUE_MASK\n : decodeTree[result + 1],\n consumed,\n );\n if (valueLength === 3) {\n // Emit the second UTF-16 code unit.\n this.emitCodePoint(decodeTree[result + 2], consumed);\n }\n\n return consumed;\n }\n\n /**\n * Signal to the parser that the end of the input was reached.\n *\n * Remaining data will be emitted and relevant errors will be produced.\n * @returns The number of characters consumed.\n */\n end(): number {\n switch (this.state) {\n case EntityDecoderState.NamedEntity: {\n // Emit a named entity if we have one.\n return this.result !== 0 &&\n (this.decodeMode !== DecodingMode.Attribute ||\n this.result === this.treeIndex)\n ? this.emitNotTerminatedNamedEntity()\n : 0;\n }\n // Otherwise, emit a numeric entity if we have one.\n case EntityDecoderState.NumericDecimal: {\n return this.emitNumericEntity(0, 2);\n }\n case EntityDecoderState.NumericHex: {\n return this.emitNumericEntity(0, 3);\n }\n case EntityDecoderState.NumericStart: {\n this.errors?.absenceOfDigitsInNumericCharacterReference(\n this.consumed,\n );\n return 0;\n }\n default: {\n // EntityStart or unknown \u2014 return 0.\n return 0;\n }\n }\n }\n}\n\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n *\n * See `BinTrieFlags` for the branch-data layouts handled here.\n * @param decodeTree The trie.\n * @param current The current node's header word.\n * @param nodeIndex Index of the node's first branch-data word (the header\n * plus any value words have been skipped by the caller).\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(\n decodeTree: Uint16Array,\n current: number,\n nodeIndex: number,\n char: number,\n): number {\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n\n // Case 1: Single branch or jump table (jumpOffset encodes the first/only char code).\n if (jumpOffset) {\n if (branchCount === 0) {\n // Single branch encoded inline in the jump offset bits.\n return char === jumpOffset ? nodeIndex : -1;\n }\n\n /*\n * Jump table: branchCount consecutive slots starting at jumpOffset.\n * Unsigned comparison handles both < 0 and >= branchCount in one check.\n */\n const slot = char - jumpOffset;\n if (slot >>> 0 >= branchCount) return -1;\n const stored = decodeTree[nodeIndex + slot];\n /*\n * 0 = empty slot (no branch); otherwise the child's offset from the\n * end of the branch array, +1 (end-relative pointers compress\n * better). `& 0xff_ff` mirrors the encoder's uint16 wrap for\n * backreferences to already-encoded nodes.\n */\n return stored === 0\n ? -1\n : (nodeIndex + branchCount + stored - 1) & 0xff_ff;\n }\n\n /*\n * Case 2: Packed dictionary. Linear scan \u2014 over 90% of dict nodes have\n * <= 4 branches in the HTML trie, where the constant-factor savings\n * dominate over binary search's asymptotic edge.\n */\n if (branchCount === 0) return -1;\n const packedKeySlots = (branchCount + 1) >> 1;\n const branchEnd = nodeIndex + packedKeySlots + branchCount;\n for (let index = 0; index < branchCount; index++) {\n const packed = decodeTree[nodeIndex + (index >> 1)];\n const key = (packed >> ((index & 1) << 3)) & 0xff;\n if (key === char) {\n const pointerIndex = nodeIndex + packedKeySlots + index;\n // Pointers are relative to the end of the branch data.\n return (branchEnd + decodeTree[pointerIndex]) & 0xff_ff;\n }\n // Keys are sorted; if we've passed `char`, no match is possible.\n if (key > char) return -1;\n }\n return -1;\n}\n\n/**\n * Read the decoded value from a trie node.\n * @param decodeTree The trie.\n * @param nodeIndex The index of the node.\n * @param valueLength The length of the value (1, 2, or 3).\n * @returns The decoded string.\n */\nfunction readTrieValue(\n decodeTree: Uint16Array,\n nodeIndex: number,\n valueLength: number,\n): string {\n if (valueLength === 1) {\n return String.fromCharCode(\n decodeTree[nodeIndex] & BinTrieFlags.VALUE_MASK,\n );\n }\n if (valueLength === 2) {\n return String.fromCharCode(decodeTree[nodeIndex + 1]);\n }\n return String.fromCharCode(\n decodeTree[nodeIndex + 1],\n decodeTree[nodeIndex + 2],\n );\n}\n\n/**\n * Parse a numeric entity (`&#DDD;` or `&#xHHH;`).\n *\n * Encodes the result as `(consumed << CONSUMED_SHIFT) | codepoint` (see\n * the packing comment at the top of the file; overlong entities spill\n * their length into `longNumericConsumed`). Returns 0 when no digits were\n * found.\n *\n * This is the sync counterpart of the streaming\n * `EntityDecoder#stateNumericDecimal` / `#stateNumericHex`. Digit parsing\n * matches those methods; only this packed result needs a value clamp.\n * @param input The input string.\n * @param numberStart Index of the `#` character.\n * @param inputLength Cached `input.length`.\n */\nfunction parseNumericEntity(\n input: string,\n numberStart: number,\n inputLength: number,\n): number {\n let offset = numberStart + 1; // Skip \"#\"\n let cp = 0;\n let digitStart = offset;\n\n /*\n * Separate decimal and hexadecimal loops: each multiplies by a constant\n * and runs a single digit test, instead of a per-character base check.\n */\n if (\n offset < inputLength &&\n (input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X\n ) {\n offset += 1;\n digitStart = offset;\n while (offset < inputLength) {\n const char = input.charCodeAt(offset);\n if (isNumber(char)) {\n cp = cp * 16 + (char - CharCodes.ZERO);\n } else if (isHexadecimalCharacter(char)) {\n cp = cp * 16 + ((char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10);\n } else {\n break;\n }\n offset += 1;\n }\n } else {\n while (offset < inputLength) {\n const digit = input.charCodeAt(offset) - CharCodes.ZERO;\n if (digit >>> 0 > 9) break;\n cp = cp * 10 + digit;\n offset += 1;\n }\n }\n\n if (offset === digitStart) return 0;\n\n // Include the semicolon in consumed when present.\n if (offset < inputLength && input.charCodeAt(offset) === CharCodes.SEMI) {\n offset += 1;\n }\n\n /*\n * Clamp out-of-range values to 0x110000 so they fit the 21-bit field\n * and decode to U+FFFD. Lengths at or above CONSUMED_OVERFLOW use the\n * side channel described with the packing constants.\n */\n if (cp > 0x10_ff_ff) cp = 0x11_00_00;\n let consumed = offset - numberStart;\n if (consumed >= CONSUMED_OVERFLOW) {\n // eslint-disable-next-line unicorn/no-top-level-assignment-in-function -- deliberate side channel, see `longNumericConsumed`\n longNumericConsumed = consumed;\n consumed = CONSUMED_OVERFLOW;\n }\n return (consumed << CONSUMED_SHIFT) | cp;\n}\n\n/**\n * Decode all entities in `input` using the HTML trie.\n *\n * Hard-wired to `htmlDecodeTree`: the inline root navigation below assumes\n * the HTML root's jump-table shape, so this must not be generalized to\n * other tries (the XML trie's dictionary root would silently match no\n * entities \u2014 `decodeXML` has its own hand-coded fast path instead).\n * @param input The string to decode.\n * @param isStrict Only match semicolon-terminated entities.\n * @param isAttribute Whether to apply attribute-specific parsing rules (disallowing certain non-semicolon terminators).\n * @returns The decoded string.\n */\nfunction decodeWithTrie(\n input: string,\n isStrict: boolean,\n isAttribute: boolean,\n): string {\n const decodeTree = htmlDecodeTree;\n // Fast path: no entities at all \u2014 return input without any allocation.\n let offset = input.indexOf(\"&\");\n if (offset < 0) return input;\n\n const inputLength = input.length;\n /*\n * `chunkStart` marks the start of the next pending slice. Rejected\n * entities don't advance it, so consecutive rejections are stitched\n * into a single `slice` once a real match (or end of input) is hit.\n */\n let chunkStart = 0;\n let result = \"\";\n\n /*\n * Root navigation fields, hoisted out of the per-entity loop. The HTML\n * root is a multi-branch jump-table covering [A-Za-z]; see the inline\n * first-iteration comment below.\n */\n const root = decodeTree[0];\n const rootJumpOffset = root & BinTrieFlags.JUMP_TABLE;\n const rootBranchCount = (root & BinTrieFlags.BRANCH_LENGTH) >> 7;\n\n do {\n const entityStart = offset + 1;\n\n // Quick check: entity names must start with [A-Za-z], numeric with #.\n const firstChar = input.charCodeAt(entityStart);\n let consumed: number;\n let value: string;\n if (firstChar === CharCodes.NUM) {\n const packed = parseNumericEntity(input, entityStart, inputLength);\n consumed = unpackConsumed(packed);\n // In strict mode, require semicolon termination.\n if (\n isStrict &&\n consumed > 0 &&\n input.charCodeAt(entityStart + consumed - 1) !== CharCodes.SEMI\n ) {\n consumed = 0;\n }\n value =\n consumed === 0\n ? \"\"\n : codePointToString(packed & CODE_POINT_MASK);\n } else if (isAlpha(firstChar)) {\n consumed = 0;\n value = \"\";\n\n /*\n * The generator guarantees a jump-table root. Consume the first\n * character directly, then walk from its child.\n */\n const rootSlotIndex = firstChar - rootJumpOffset;\n let nodeIndex: number;\n if (rootSlotIndex >>> 0 < rootBranchCount) {\n const stored = decodeTree[1 + rootSlotIndex];\n nodeIndex =\n stored === 0 ? -1 : (rootBranchCount + stored) & 0xff_ff;\n } else {\n nodeIndex = -1;\n }\n\n /*\n * Best legacy (no-semicolon) match so far, as trie coordinates.\n * Deferring `readTrieValue` to the end avoids allocating a\n * string for matches that longer matches supersede.\n */\n let bestNodeIndex = 0;\n let bestValueLength = 0;\n let current = nodeIndex < 0 ? 0 : decodeTree[nodeIndex];\n let index = entityStart + 1;\n\n /*\n * Walk the trie from the root child. The `trie` label lets the\n * inner descent and compact-run loops abandon the entity (and\n * fall through to the legacy/reject handling) directly.\n */\n trie: while (index < inputLength) {\n /*\n * Inline value-less jump tables and single branches. A miss\n * falls through to the recorded legacy match or rejection.\n */\n while (\n // Value-less, non-run node with a nonzero jump offset.\n (current &\n (BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)) ===\n 0 &&\n (current & BinTrieFlags.JUMP_TABLE) !== 0\n ) {\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n const branchCount =\n (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n if (branchCount === 0) {\n // Single branch encoded inline in the jump offset bits.\n if (input.charCodeAt(index) !== jumpOffset) break trie;\n nodeIndex += 1;\n } else {\n const slot = input.charCodeAt(index) - jumpOffset;\n if (slot >>> 0 >= branchCount) break trie;\n const stored = decodeTree[nodeIndex + 1 + slot];\n if (stored === 0) break trie;\n // End-relative: branch data ends at nodeIndex+1+branchCount.\n nodeIndex =\n (nodeIndex + branchCount + stored) & 0xff_ff;\n }\n current = decodeTree[nodeIndex];\n index += 1;\n /*\n * `charCodeAt` past the end returns NaN, which would\n * alias to slot 0 after `>>> 0` \u2014 bail out explicitly.\n */\n if (index >= inputLength) break trie;\n }\n\n // FLAG13 without a value marks a compact run.\n if (\n (current &\n (BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)) ===\n BinTrieFlags.FLAG13\n ) {\n const runLength =\n (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n\n // Check first char (stored in JUMP_TABLE bits).\n if (\n input.charCodeAt(index) !==\n (current & BinTrieFlags.JUMP_TABLE)\n ) {\n // eslint-disable-next-line unicorn/no-break-in-nested-loop\n break;\n }\n index += 1;\n\n // Check remaining characters (packed two per uint16 word).\n const remaining = runLength - 1;\n let wordIndex = nodeIndex + 1;\n let charIndexInPacked = 0;\n\n /*\n * Process pairs: read one packed word, compare low byte then high byte.\n * No explicit bounds check needed \u2014 charCodeAt returns NaN for OOB,\n * which never equals an integer, so the mismatch break fires naturally.\n */\n for (\n ;\n charIndexInPacked + 1 < remaining;\n charIndexInPacked += 2\n ) {\n const packed = decodeTree[wordIndex];\n if (input.charCodeAt(index) !== (packed & 0xff))\n break trie;\n index += 1;\n if (input.charCodeAt(index) !== ((packed >> 8) & 0xff))\n break trie;\n index += 1;\n wordIndex += 1;\n }\n // Handle odd trailing char.\n if (charIndexInPacked < remaining) {\n if (\n input.charCodeAt(index) !==\n (decodeTree[wordIndex] & 0xff)\n )\n // eslint-disable-next-line unicorn/no-break-in-nested-loop\n break;\n index += 1;\n }\n\n nodeIndex += 1 + (runLength >> 1);\n current = decodeTree[nodeIndex];\n // eslint-disable-next-line unicorn/no-break-in-nested-loop\n continue;\n }\n\n // Header plus out-of-line value words; 0 means no value.\n const valueLength = current >>> 14;\n const char = input.charCodeAt(index);\n\n /*\n * Check current node for a value before navigating.\n * This handles both: (a) values reached via compact runs on the\n * previous iteration, and (b) values at regular branch targets.\n */\n if (valueLength !== 0) {\n // If char is `;`, emit immediately.\n if (char === CharCodes.SEMI) {\n consumed = index - entityStart + 1;\n // Inline leaves carry the value in the low 13 bits.\n value =\n valueLength === 1\n ? String.fromCharCode(\n current & BinTrieFlags.VALUE_MASK,\n )\n : readTrieValue(\n decodeTree,\n nodeIndex,\n valueLength,\n );\n // eslint-disable-next-line unicorn/no-break-in-nested-loop\n break;\n }\n\n // Record non-terminated (legacy) match (FLAG13 clear = semicolon optional).\n if (!isStrict && (current & BinTrieFlags.FLAG13) === 0) {\n consumed = index - entityStart;\n bestNodeIndex = nodeIndex;\n bestValueLength = valueLength;\n }\n\n /*\n * A valueLength of 1 means the value is packed inline in the header\n * word \u2014 these are always leaf nodes with no branches, so we can\n * stop walking the trie.\n */\n // eslint-disable-next-line unicorn/no-break-in-nested-loop\n if (valueLength === 1) break;\n }\n\n // Navigate to the next node (valueLength || 1: skip past value words, minimum 1 for header).\n const next = determineBranch(\n decodeTree,\n current,\n nodeIndex + (valueLength || 1),\n char,\n );\n // eslint-disable-next-line unicorn/no-break-in-nested-loop\n if (next < 0) break;\n\n nodeIndex = next;\n current = decodeTree[nodeIndex];\n index += 1;\n }\n\n /*\n * Post-loop: if the semicolon path didn't set value,\n * check for a final legacy match. The last navigation may\n * have landed on a legacy node whose value hasn't been\n * recorded yet (loop exited before the top-of-loop check\n * could run).\n */\n if (value === \"\") {\n const finalVL = current >>> 14;\n if (\n finalVL !== 0 &&\n !isStrict &&\n (current & BinTrieFlags.FLAG13) === 0\n ) {\n consumed = index - entityStart;\n bestNodeIndex = nodeIndex;\n bestValueLength = finalVL;\n }\n if (consumed > 0) {\n value = readTrieValue(\n decodeTree,\n bestNodeIndex,\n bestValueLength,\n );\n }\n }\n } else {\n consumed = 0;\n value = \"\";\n }\n\n /*\n * The attribute end-char rule (HTML spec \u00A713.2.5.73) only applies to\n * unterminated *named* references. Semicolon-terminated entities and\n * numeric entities are always accepted, matching EntityDecoder behavior.\n *\n * When `attribute` is false (the common case), short-circuit skips all\n * the unterminated-named checks entirely.\n */\n if (\n consumed === 0 ||\n (isAttribute &&\n firstChar !== CharCodes.NUM &&\n input.charCodeAt(entityStart + consumed - 1) !==\n CharCodes.SEMI &&\n entityStart + consumed < inputLength &&\n isEntityInAttributeInvalidEnd(\n input.charCodeAt(entityStart + consumed),\n ))\n ) {\n // Rejected: leave `&` in the pending chunk, scan past it.\n offset = entityStart;\n } else {\n if (chunkStart < offset) {\n result += input.slice(chunkStart, offset);\n }\n result += value;\n offset = chunkStart = entityStart + consumed;\n }\n\n /*\n * Adjacent entities (`&x;&y;`) are common in entity-dense input;\n * checking the single character at `offset` first skips the\n * `indexOf` call (and its per-call overhead) for that case.\n */\n if (input.charCodeAt(offset) !== CharCodes.AMP) {\n offset = input.indexOf(\"&\", offset);\n }\n } while (offset >= 0);\n\n return result + input.slice(chunkStart);\n}\n\n/**\n * Decodes an HTML string.\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(\n htmlString: string,\n mode: DecodingMode = DecodingMode.Legacy,\n): string {\n return decodeWithTrie(\n htmlString,\n mode === DecodingMode.Strict,\n mode === DecodingMode.Attribute,\n );\n}\n\n/**\n * Decodes an HTML string in an attribute.\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute: string): string {\n return decodeWithTrie(htmlAttribute, false, true);\n}\n\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString: string): string {\n return decodeWithTrie(htmlString, true, false);\n}\n\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n *\n * Uses a hand-coded fast path for the 5 XML named entities (amp, lt, gt,\n * quot, apos) plus numeric entities, bypassing the trie entirely.\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString: string): string {\n let offset = xmlString.indexOf(\"&\");\n if (offset < 0) return xmlString;\n\n let lastIndex = 0;\n let result = \"\";\n\n do {\n const start = offset + 1;\n let consumed = 0;\n let value = \"\";\n\n const c1 = xmlString.charCodeAt(start);\n\n if (c1 === CharCodes.NUM) {\n const packed = parseNumericEntity(\n xmlString,\n start,\n xmlString.length,\n );\n consumed = unpackConsumed(packed);\n // XML is always strict \u2014 require semicolon.\n if (\n consumed === 0 ||\n xmlString.charCodeAt(start + consumed - 1) !== CharCodes.SEMI\n ) {\n consumed = 0;\n } else {\n const codePoint = packed & CODE_POINT_MASK;\n // Nonzero BMP values below the surrogate range need no replacement.\n value =\n (codePoint - 1) >>> 0 < 0xd7_ff\n ? String.fromCharCode(codePoint)\n : String.fromCodePoint(replaceCodePointXML(codePoint));\n }\n } else {\n /* eslint-disable unicorn/no-break-in-nested-loop -- Keep XML name dispatch inline with the decode loop. */\n switch (c1) {\n // < / >\n case 0x6c:\n case 0x67: {\n if (\n xmlString.charCodeAt(start + 1) === 0x74 &&\n xmlString.charCodeAt(start + 2) === CharCodes.SEMI\n ) {\n consumed = 3;\n value = c1 === 0x6c ? \"<\" : \">\";\n }\n break;\n }\n // & / '\n case 0x61: {\n const c2 = xmlString.charCodeAt(start + 1);\n if (\n c2 === 0x6d &&\n xmlString.charCodeAt(start + 2) === 0x70 &&\n xmlString.charCodeAt(start + 3) === CharCodes.SEMI\n ) {\n consumed = 4;\n value = \"&\";\n } else if (\n c2 === 0x70 &&\n xmlString.charCodeAt(start + 2) === 0x6f &&\n xmlString.charCodeAt(start + 3) === 0x73 &&\n xmlString.charCodeAt(start + 4) === CharCodes.SEMI\n ) {\n consumed = 5;\n value = \"'\";\n }\n break;\n }\n // "\n case 0x71: {\n if (\n xmlString.charCodeAt(start + 1) === 0x75 &&\n xmlString.charCodeAt(start + 2) === 0x6f &&\n xmlString.charCodeAt(start + 3) === 0x74 &&\n xmlString.charCodeAt(start + 4) === CharCodes.SEMI\n ) {\n consumed = 5;\n value = '\"';\n }\n break;\n }\n }\n /* eslint-enable unicorn/no-break-in-nested-loop */\n }\n\n if (consumed > 0) {\n if (lastIndex < offset)\n result += xmlString.slice(lastIndex, offset);\n result += value;\n offset = lastIndex = start + consumed;\n } else {\n offset = start;\n }\n /*\n * Adjacent entities (`&x;&y;`) are common in entity-dense input;\n * checking the single character at `lastIndex` first skips the\n * `indexOf` call (and its per-call overhead) for that case.\n */\n offset =\n xmlString.charCodeAt(offset) === CharCodes.AMP\n ? offset\n : xmlString.indexOf(\"&\", offset);\n } while (offset >= 0);\n\n return result + xmlString.slice(lastIndex);\n}\n\nexport {\n replaceCodePoint,\n replaceCodePointXML,\n} from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n", "import {\n DecodingMode,\n EntityDecoder,\n htmlDecodeTree,\n xmlDecodeTree,\n} from \"entities/decode\";\n\nconst enum CharCodes {\n Tab = 0x9, // \"\\t\"\n NewLine = 0xa, // \"\\n\"\n FormFeed = 0xc, // \"\\f\"\n CarriageReturn = 0xd, // \"\\r\"\n Space = 0x20, // \" \"\n ExclamationMark = 0x21, // \"!\"\n Number = 0x23, // \"#\"\n Amp = 0x26, // \"&\"\n SingleQuote = 0x27, // \"'\"\n DoubleQuote = 0x22, // '\"'\n Dash = 0x2d, // \"-\"\n Slash = 0x2f, // \"/\"\n Zero = 0x30, // \"0\"\n Nine = 0x39, // \"9\"\n Semi = 0x3b, // \";\"\n Lt = 0x3c, // \"<\"\n Eq = 0x3d, // \"=\"\n Gt = 0x3e, // \">\"\n Questionmark = 0x3f, // \"?\"\n UpperA = 0x41, // \"A\"\n LowerA = 0x61, // \"a\"\n UpperF = 0x46, // \"F\"\n LowerF = 0x66, // \"f\"\n UpperZ = 0x5a, // \"Z\"\n LowerZ = 0x7a, // \"z\"\n LowerX = 0x78, // \"x\"\n OpeningSquareBracket = 0x5b, // \"[\"\n}\n\n/** All the states the tokenizer can be in. */\nconst enum State {\n Text = 1,\n BeforeTagName, // After <\n InTagName,\n InSelfClosingTag,\n BeforeClosingTagName,\n InClosingTagName,\n AfterClosingTagName,\n\n // Attributes\n BeforeAttributeName,\n InAttributeName,\n AfterAttributeName,\n BeforeAttributeValue,\n InAttributeValueDq, // \"\n InAttributeValueSq, // '\n InAttributeValueNq,\n\n // Declarations\n BeforeDeclaration, // !\n InDeclaration,\n\n // Processing instructions\n InProcessingInstruction, // ?\n\n // Comments & CDATA\n BeforeComment,\n CDATASequence,\n DeclarationSequence,\n InSpecialComment,\n InCommentLike,\n\n // Special tags\n SpecialStartSequence,\n InSpecialTag,\n InPlainText,\n\n InEntity,\n}\n\nfunction isWhitespace(c: number): boolean {\n return (\n c === CharCodes.Space ||\n c === CharCodes.NewLine ||\n c === CharCodes.Tab ||\n c === CharCodes.FormFeed ||\n c === CharCodes.CarriageReturn\n );\n}\n\nfunction isEndOfTagSection(c: number): boolean {\n return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);\n}\n\nfunction isASCIIAlpha(c: number): boolean {\n return (\n (c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||\n (c >= CharCodes.UpperA && c <= CharCodes.UpperZ)\n );\n}\n\n/**\n * Quote style used for parsed attributes.\n */\nexport enum QuoteType {\n NoValue = 0,\n Unquoted = 1,\n Single = 2,\n Double = 3,\n}\n\n/**\n * Low-level tokenizer callback interface.\n */\nexport interface Callbacks {\n onattribdata(start: number, endIndex: number): void;\n onattribentity(codepoint: number): void;\n onattribend(quote: QuoteType, endIndex: number): void;\n onattribname(start: number, endIndex: number): void;\n oncdata(start: number, endIndex: number, endOffset: number): void;\n onclosetag(start: number, endIndex: number): void;\n oncomment(start: number, endIndex: number, endOffset: number): void;\n ondeclaration(start: number, endIndex: number): void;\n onend(): void;\n onopentagend(endIndex: number): void;\n onopentagname(start: number, endIndex: number): void;\n onprocessinginstruction(start: number, endIndex: number): void;\n onselfclosingtag(endIndex: number): void;\n ontext(start: number, endIndex: number): void;\n ontextentity(codepoint: number, endIndex: number): void;\n isInForeignContext?(): boolean;\n}\n\n/**\n * Sequences used to match longer strings.\n *\n * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End\n * sequences with an increased offset.\n */\nconst Sequences = {\n Empty: new Uint8Array(0),\n Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[\n CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]>\n CommentEnd: new Uint8Array([0x2d, 0x2d, 0x21, 0x3e]), // `--!>`\n Doctype: new Uint8Array([0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65]), // `doctype`\n IframeEnd: new Uint8Array([0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65]), // `</iframe`\n NoembedEnd: new Uint8Array([\n 0x3c, 0x2f, 0x6e, 0x6f, 0x65, 0x6d, 0x62, 0x65, 0x64,\n ]), // `</noembed`\n NoframesEnd: new Uint8Array([\n 0x3c, 0x2f, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73,\n ]), // `</noframes`\n Plaintext: new Uint8Array([\n 0x3c, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74,\n ]), // `</plaintext`\n ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script`\n StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style`\n TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title`\n TextareaEnd: new Uint8Array([\n 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,\n ]), // `</textarea`\n XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp`\n};\n\n/**\n * Maps the first lowercase character of an HTML tag name to the sequence\n * used for special-tag detection. All sequences share a common layout\n * where index 2 is the first tag-name character, so matching always\n * continues from offset 3.\n */\nconst specialStartSequences = new Map<number, Uint8Array>([\n [Sequences.IframeEnd[2], Sequences.IframeEnd],\n [Sequences.NoembedEnd[2], Sequences.NoembedEnd],\n [Sequences.Plaintext[2], Sequences.Plaintext],\n [Sequences.ScriptEnd[2], Sequences.ScriptEnd],\n [Sequences.TitleEnd[2], Sequences.TitleEnd],\n [Sequences.XmpEnd[2], Sequences.XmpEnd],\n]);\n\n/**\n * Tokenizer implementation used by `Parser`.\n */\nexport default class Tokenizer {\n /** The current state the tokenizer is in. */\n private state = State.Text;\n /** The read buffer. */\n private buffer = \"\";\n /** The beginning of the section that is currently being read. */\n private sectionStart = 0;\n /** The index within the buffer that we are currently looking at. */\n private index = 0;\n /** The start of the last entity. */\n private entityStart = 0;\n /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n private baseState = State.Text;\n /** For special parsing behavior inside of script and style tags. */\n private isSpecial = false;\n /** Indicates whether the tokenizer has been paused. */\n running = true;\n /** The offset of the current buffer. */\n private offset = 0;\n\n private readonly xmlMode: boolean;\n private readonly decodeEntities: boolean;\n private readonly recognizeSelfClosing: boolean;\n private readonly entityDecoder: EntityDecoder;\n\n constructor(\n {\n xmlMode = false,\n decodeEntities = true,\n recognizeSelfClosing = xmlMode,\n }: {\n xmlMode?: boolean;\n decodeEntities?: boolean;\n recognizeSelfClosing?: boolean;\n },\n private readonly cbs: Callbacks,\n ) {\n this.xmlMode = xmlMode;\n this.decodeEntities = decodeEntities;\n this.recognizeSelfClosing = recognizeSelfClosing;\n this.entityDecoder = new EntityDecoder(\n xmlMode ? xmlDecodeTree : htmlDecodeTree,\n (cp, consumed) => this.emitCodePoint(cp, consumed),\n );\n }\n\n reset(): void {\n this.state = State.Text;\n this.buffer = \"\";\n this.sectionStart = 0;\n this.index = 0;\n this.baseState = State.Text;\n this.isSpecial = false;\n this.currentSequence = Sequences.Empty;\n this.sequenceIndex = 0;\n this.running = true;\n this.offset = 0;\n }\n\n write(chunk: string): void {\n this.offset += this.buffer.length;\n this.buffer = chunk;\n this.parse();\n }\n\n end(): void {\n if (this.running) this.finish();\n }\n\n pause(): void {\n this.running = false;\n }\n\n resume(): void {\n this.running = true;\n if (this.index < this.buffer.length + this.offset) {\n this.parse();\n }\n }\n\n private stateText(c: number): void {\n if (\n c === CharCodes.Lt ||\n (!this.decodeEntities && this.fastForwardTo(CharCodes.Lt))\n ) {\n if (this.index > this.sectionStart) {\n this.cbs.ontext(this.sectionStart, this.index);\n }\n this.state = State.BeforeTagName;\n this.sectionStart = this.index;\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n\n private currentSequence: Uint8Array = Sequences.Empty;\n private sequenceIndex = 0;\n\n private enterTagBody(): void {\n if (this.currentSequence === Sequences.Plaintext) {\n this.currentSequence = Sequences.Empty;\n this.state = State.InPlainText;\n } else if (this.isSpecial) {\n this.state = State.InSpecialTag;\n this.sequenceIndex = 0;\n } else {\n this.state = State.Text;\n }\n }\n\n /**\n * Match the opening tag name against an HTML text-only tag sequence.\n *\n * Some tags share an initial prefix (`script`/`style`, `title`/`textarea`,\n * `noembed`/`noframes`), so we may switch to an alternate sequence at the\n * first distinguishing byte. On a successful full match we fall back to\n * the normal tag-name state; a later `>` will enter raw-text, RCDATA, or\n * plaintext mode based on `currentSequence` / `isSpecial`.\n * @param c Current character code point.\n */\n private stateSpecialStartSequence(c: number): void {\n const lower = c | 0x20;\n\n // Still matching \u2014 check for an alternate sequence at branch points.\n if (this.sequenceIndex < this.currentSequence.length) {\n if (lower === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex++;\n return;\n }\n\n if (this.sequenceIndex === 3) {\n if (\n this.currentSequence === Sequences.ScriptEnd &&\n lower === Sequences.StyleEnd[3]\n ) {\n this.currentSequence = Sequences.StyleEnd;\n this.sequenceIndex = 4;\n return;\n }\n\n if (\n this.currentSequence === Sequences.TitleEnd &&\n lower === Sequences.TextareaEnd[3]\n ) {\n this.currentSequence = Sequences.TextareaEnd;\n this.sequenceIndex = 4;\n return;\n }\n } else if (\n this.sequenceIndex === 4 &&\n this.currentSequence === Sequences.NoembedEnd &&\n lower === Sequences.NoframesEnd[4]\n ) {\n this.currentSequence = Sequences.NoframesEnd;\n this.sequenceIndex = 5;\n return;\n }\n } else if (isEndOfTagSection(c)) {\n // Full match on a valid tag boundary \u2014 keep the sequence.\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n return;\n }\n\n // No match \u2014 abandon special-tag detection.\n this.isSpecial = false;\n this.currentSequence = Sequences.Empty;\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n }\n\n private stateCDATASequence(c: number): void {\n if (c === Sequences.Cdata[this.sequenceIndex]) {\n if (++this.sequenceIndex === Sequences.Cdata.length) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CdataEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n } else {\n this.sequenceIndex = 0;\n if (this.xmlMode) {\n this.state = State.InDeclaration;\n this.stateInDeclaration(c); // Reconsume the character\n } else {\n this.state = State.InSpecialComment;\n this.stateInSpecialComment(c); // Reconsume the character\n }\n }\n }\n\n /**\n * When we wait for one specific character, we can speed things up\n * by skipping through the buffer until we find it.\n * @param c Current character code point.\n * @returns Whether the character was found.\n */\n private fastForwardTo(c: number): boolean {\n while (++this.index < this.buffer.length + this.offset) {\n if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n return true;\n }\n }\n\n /*\n * We increment the index at the end of the `parse` loop,\n * so set it to `buffer.length - 1` here.\n *\n * TODO: Refactor `parse` to increment index before calling states.\n */\n this.index = this.buffer.length + this.offset - 1;\n\n return false;\n }\n\n /**\n * Emit a comment token and return to the text state.\n * @param offset Number of characters in the end sequence that have already been matched.\n */\n private emitComment(offset: number): void {\n this.cbs.oncomment(this.sectionStart, this.index, offset);\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n\n /**\n * Comments and CDATA end with `-->` and `]]>`.\n *\n * Their common qualities are:\n * - Their end sequences have a distinct character they start with.\n * - That character is then repeated, so we have to check multiple repeats.\n * - All characters but the start character of the sequence can be skipped.\n * @param c Current character code point.\n */\n private stateInCommentLike(c: number): void {\n if (\n !this.xmlMode &&\n this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex <= 1 &&\n /*\n * We're still at the very start of the comment: the only\n * characters consumed since `<!--` are the dashes that\n * advanced sequenceIndex (0 for `<!-->`, 1 for `<!--->`).\n */\n this.index === this.sectionStart + this.sequenceIndex &&\n c === CharCodes.Gt\n ) {\n // Abruptly closed empty HTML comment.\n this.emitComment(this.sequenceIndex);\n } else if (\n this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex === 2 &&\n c === CharCodes.Gt\n ) {\n // `!` is optional here, so the same sequence also accepts `-->`.\n this.emitComment(2);\n } else if (\n this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex === this.currentSequence.length - 1 &&\n c !== CharCodes.Gt\n ) {\n this.sequenceIndex = Number(c === CharCodes.Dash);\n } else if (c === this.currentSequence[this.sequenceIndex]) {\n if (++this.sequenceIndex === this.currentSequence.length) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, this.index, 2);\n } else {\n this.cbs.oncomment(this.sectionStart, this.index, 3);\n }\n\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n } else if (this.sequenceIndex === 0) {\n // Fast-forward to the first character of the sequence\n if (this.fastForwardTo(this.currentSequence[0])) {\n this.sequenceIndex = 1;\n }\n } else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n // Allow long sequences, eg. --->, ]]]>\n this.sequenceIndex = 0;\n }\n }\n\n /**\n * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n *\n * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n * We allow anything that wouldn't end the tag.\n * @param c Current character code point.\n */\n private isTagStartChar(c: number) {\n return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n }\n\n /**\n * Scan raw-text / RCDATA content for the matching end tag.\n *\n * For RCDATA tags (`<title>`, `<textarea>`) entities are decoded inline.\n * For raw-text tags (`<script>`, `<style>`, etc.) we fast-forward to `<`.\n * @param c Current character code point.\n */\n private stateInSpecialTag(c: number): void {\n if (this.sequenceIndex === this.currentSequence.length) {\n if (isEndOfTagSection(c)) {\n const endOfText = this.index - this.currentSequence.length;\n\n if (this.sectionStart < endOfText) {\n // Spoof the index so that reported locations match up.\n const actualIndex = this.index;\n this.index = endOfText;\n this.cbs.ontext(this.sectionStart, endOfText);\n this.index = actualIndex;\n }\n\n this.isSpecial = false;\n this.sectionStart = endOfText + 2; // Skip over the `</`\n this.stateInClosingTagName(c);\n return; // We are done; skip the rest of the function.\n }\n\n this.sequenceIndex = 0;\n }\n\n if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n } else if (this.sequenceIndex === 0) {\n if (\n this.currentSequence === Sequences.TitleEnd ||\n this.currentSequence === Sequences.TextareaEnd\n ) {\n // RCDATA tags have to parse entities while still looking for their end tag.\n if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n } else if (this.fastForwardTo(CharCodes.Lt)) {\n // Outside of RCDATA tags, we can fast-forward.\n this.sequenceIndex = 1;\n }\n } else {\n // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`.\n this.sequenceIndex = Number(c === CharCodes.Lt);\n }\n }\n\n private stateBeforeTagName(c: number): void {\n if (c === CharCodes.ExclamationMark) {\n this.state = State.BeforeDeclaration;\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.Questionmark) {\n if (this.xmlMode) {\n this.state = State.InProcessingInstruction;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n } else {\n this.state = State.InSpecialComment;\n this.sectionStart = this.index;\n }\n } else if (this.isTagStartChar(c)) {\n this.sectionStart = this.index;\n\n const special =\n this.xmlMode || this.cbs.isInForeignContext?.()\n ? undefined\n : specialStartSequences.get(c | 0x20);\n\n if (special === undefined) {\n this.state = State.InTagName;\n } else {\n this.isSpecial = true;\n this.currentSequence = special;\n this.sequenceIndex = 3;\n this.state = State.SpecialStartSequence;\n }\n } else if (c === CharCodes.Slash) {\n this.state = State.BeforeClosingTagName;\n } else {\n this.state = State.Text;\n this.stateText(c);\n }\n }\n private stateInTagName(c: number): void {\n if (isEndOfTagSection(c)) {\n this.cbs.onopentagname(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n private stateBeforeClosingTagName(c: number): void {\n if (isWhitespace(c)) {\n if (this.xmlMode) {\n // Ignore\n } else {\n this.state = State.InSpecialComment;\n this.sectionStart = this.index;\n }\n } else if (c === CharCodes.Gt) {\n this.state = State.Text;\n if (!this.xmlMode) {\n this.sectionStart = this.index + 1;\n }\n } else {\n this.state = this.isTagStartChar(c)\n ? State.InClosingTagName\n : State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n private stateInClosingTagName(c: number): void {\n if (isEndOfTagSection(c)) {\n this.cbs.onclosetag(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.AfterClosingTagName;\n this.stateAfterClosingTagName(c);\n }\n }\n private stateAfterClosingTagName(c: number): void {\n // Skip everything until \">\"\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateBeforeAttributeName(c: number): void {\n if (c === CharCodes.Gt) {\n this.cbs.onopentagend(this.index);\n this.enterTagBody();\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.Slash) {\n this.state = State.InSelfClosingTag;\n } else if (!isWhitespace(c)) {\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n /**\n * Handle `/` before `>` in an opening tag.\n *\n * In HTML mode, text-only tags ignore the self-closing flag and still enter\n * their raw-text/RCDATA/plaintext state unless self-closing tags are being\n * recognized. In XML mode, or for ordinary tags, the tokenizer returns to\n * regular text parsing after emitting the self-closing callback.\n * @param c Current character code point.\n */\n private stateInSelfClosingTag(c: number): void {\n if (c === CharCodes.Gt) {\n this.cbs.onselfclosingtag(this.index);\n this.sectionStart = this.index + 1;\n\n if (!this.recognizeSelfClosing) {\n this.enterTagBody();\n return;\n }\n\n this.state = State.Text;\n this.isSpecial = false; // Reset special state, in case of self-closing special tags\n this.currentSequence = Sequences.Empty;\n } else if (!isWhitespace(c)) {\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n private stateInAttributeName(c: number): void {\n if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n this.cbs.onattribname(this.sectionStart, this.index);\n this.sectionStart = this.index;\n this.state = State.AfterAttributeName;\n this.stateAfterAttributeName(c);\n }\n }\n private stateAfterAttributeName(c: number): void {\n if (c === CharCodes.Eq) {\n this.state = State.BeforeAttributeValue;\n } else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n } else if (!isWhitespace(c)) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n private stateBeforeAttributeValue(c: number): void {\n if (c === CharCodes.DoubleQuote) {\n this.state = State.InAttributeValueDq;\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.SingleQuote) {\n this.state = State.InAttributeValueSq;\n this.sectionStart = this.index + 1;\n } else if (!isWhitespace(c)) {\n this.sectionStart = this.index;\n this.state = State.InAttributeValueNq;\n this.stateInAttributeValueNoQuotes(c); // Reconsume token\n }\n }\n private handleInAttributeValue(c: number, quote: number) {\n if (\n c === quote ||\n (!this.decodeEntities && this.fastForwardTo(quote))\n ) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(\n quote === CharCodes.DoubleQuote\n ? QuoteType.Double\n : QuoteType.Single,\n this.index + 1,\n );\n this.state = State.BeforeAttributeName;\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n private stateInAttributeValueDoubleQuotes(c: number): void {\n this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n }\n private stateInAttributeValueSingleQuotes(c: number): void {\n this.handleInAttributeValue(c, CharCodes.SingleQuote);\n }\n private stateInAttributeValueNoQuotes(c: number): void {\n if (isWhitespace(c) || c === CharCodes.Gt) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(QuoteType.Unquoted, this.index);\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n /**\n * Distinguish between CDATA, declarations, HTML comments, and HTML bogus\n * comments after `<!`.\n *\n * In HTML mode, only real comments and doctypes stay on declaration paths;\n * everything else becomes a bogus comment terminated by the next `>`.\n * @param c Current character code point.\n */\n private stateBeforeDeclaration(c: number): void {\n if (c === CharCodes.OpeningSquareBracket) {\n this.state = State.CDATASequence;\n this.sequenceIndex = 0;\n } else if (this.xmlMode) {\n this.state =\n c === CharCodes.Dash\n ? State.BeforeComment\n : State.InDeclaration;\n } else if ((c | 0x20) === Sequences.Doctype[0]) {\n this.state = State.DeclarationSequence;\n this.currentSequence = Sequences.Doctype;\n this.sequenceIndex = 1;\n } else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.Dash) {\n this.state = State.BeforeComment;\n } else {\n this.state = State.InSpecialComment;\n }\n }\n /**\n * Continue matching `doctype` after `<!d`.\n *\n * A full `doctype` match stays on the declaration path; any other name falls\n * back to an HTML bogus comment, which matches browser behavior for\n * non-doctype `<!...>` constructs.\n * @param c Current character code point.\n */\n private stateDeclarationSequence(c: number): void {\n if (this.sequenceIndex === this.currentSequence.length) {\n this.state = State.InDeclaration;\n this.stateInDeclaration(c);\n } else if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n } else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n } else {\n this.state = State.InSpecialComment;\n }\n }\n private stateInDeclaration(c: number): void {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.ondeclaration(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n /**\n * XML processing instructions (`<?...?>`).\n *\n * In HTML mode `<?` is routed to `InSpecialComment` instead, so this\n * state is only reachable in XML mode.\n * @param c Current character code point.\n */\n private stateInProcessingInstruction(c: number): void {\n if (c === CharCodes.Questionmark) {\n // Remember that we just consumed `?`, so the next `>` closes the PI.\n this.sequenceIndex = 1;\n } else if (c === CharCodes.Gt && this.sequenceIndex === 1) {\n this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1);\n this.sequenceIndex = 0;\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n } else {\n // Keep scanning for the next `?`, which can start a closing `?>`.\n this.sequenceIndex = Number(\n this.fastForwardTo(CharCodes.Questionmark),\n );\n }\n }\n private stateBeforeComment(c: number): void {\n if (c === CharCodes.Dash) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CommentEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n } else if (this.xmlMode) {\n this.state = State.InDeclaration;\n } else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n } else {\n this.state = State.InSpecialComment;\n }\n }\n private stateInSpecialComment(c: number): void {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n\n private startEntity() {\n this.baseState = this.state;\n this.state = State.InEntity;\n this.entityStart = this.index;\n this.entityDecoder.startEntity(\n this.xmlMode\n ? DecodingMode.Strict\n : this.baseState === State.Text ||\n this.baseState === State.InSpecialTag\n ? DecodingMode.Legacy\n : DecodingMode.Attribute,\n );\n }\n\n private stateInEntity(): void {\n const indexInBuffer = this.index - this.offset;\n const length = this.entityDecoder.write(this.buffer, indexInBuffer);\n\n // If `length` is positive, we are done with the entity.\n if (length >= 0) {\n this.state = this.baseState;\n\n if (length === 0) {\n this.index -= 1;\n }\n } else {\n if (\n indexInBuffer < this.buffer.length &&\n this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp\n ) {\n this.state = this.baseState;\n this.index -= 1;\n return;\n }\n\n // Mark buffer as consumed.\n this.index = this.offset + this.buffer.length - 1;\n }\n }\n\n /**\n * Remove data that has already been consumed from the buffer.\n */\n private cleanup() {\n // If we are inside of text or attributes, emit what we already have.\n if (this.running && this.sectionStart !== this.index) {\n if (\n this.state === State.Text ||\n this.state === State.InPlainText ||\n (this.state === State.InSpecialTag && this.sequenceIndex === 0)\n ) {\n this.cbs.ontext(this.sectionStart, this.index);\n this.sectionStart = this.index;\n } else if (\n this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueNq\n ) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n }\n }\n\n private shouldContinue() {\n return this.index < this.buffer.length + this.offset && this.running;\n }\n\n /**\n * Iterates through the buffer, calling the function corresponding to the current state.\n *\n * States that are more likely to be hit are higher up, as a performance improvement.\n */\n private parse() {\n while (this.shouldContinue()) {\n const c = this.buffer.charCodeAt(this.index - this.offset);\n switch (this.state) {\n case State.Text: {\n this.stateText(c);\n break;\n }\n case State.InPlainText: {\n // Skip to end of buffer; cleanup() emits the text.\n this.index = this.buffer.length + this.offset - 1;\n break;\n }\n case State.SpecialStartSequence: {\n this.stateSpecialStartSequence(c);\n break;\n }\n case State.InSpecialTag: {\n this.stateInSpecialTag(c);\n break;\n }\n case State.CDATASequence: {\n this.stateCDATASequence(c);\n break;\n }\n case State.DeclarationSequence: {\n this.stateDeclarationSequence(c);\n break;\n }\n case State.InAttributeValueDq: {\n this.stateInAttributeValueDoubleQuotes(c);\n break;\n }\n case State.InAttributeName: {\n this.stateInAttributeName(c);\n break;\n }\n case State.InCommentLike: {\n this.stateInCommentLike(c);\n break;\n }\n case State.InSpecialComment: {\n this.stateInSpecialComment(c);\n break;\n }\n case State.BeforeAttributeName: {\n this.stateBeforeAttributeName(c);\n break;\n }\n case State.InTagName: {\n this.stateInTagName(c);\n break;\n }\n case State.InClosingTagName: {\n this.stateInClosingTagName(c);\n break;\n }\n case State.BeforeTagName: {\n this.stateBeforeTagName(c);\n break;\n }\n case State.AfterAttributeName: {\n this.stateAfterAttributeName(c);\n break;\n }\n case State.InAttributeValueSq: {\n this.stateInAttributeValueSingleQuotes(c);\n break;\n }\n case State.BeforeAttributeValue: {\n this.stateBeforeAttributeValue(c);\n break;\n }\n case State.BeforeClosingTagName: {\n this.stateBeforeClosingTagName(c);\n break;\n }\n case State.AfterClosingTagName: {\n this.stateAfterClosingTagName(c);\n break;\n }\n case State.InAttributeValueNq: {\n this.stateInAttributeValueNoQuotes(c);\n break;\n }\n case State.InSelfClosingTag: {\n this.stateInSelfClosingTag(c);\n break;\n }\n case State.InDeclaration: {\n this.stateInDeclaration(c);\n break;\n }\n case State.BeforeDeclaration: {\n this.stateBeforeDeclaration(c);\n break;\n }\n case State.BeforeComment: {\n this.stateBeforeComment(c);\n break;\n }\n case State.InProcessingInstruction: {\n this.stateInProcessingInstruction(c);\n break;\n }\n case State.InEntity: {\n this.stateInEntity();\n break;\n }\n }\n this.index++;\n }\n this.cleanup();\n }\n\n private finish() {\n if (this.state === State.InEntity) {\n this.entityDecoder.end();\n this.state = this.baseState;\n }\n\n this.handleTrailingData();\n\n this.cbs.onend();\n }\n\n private handleTrailingCommentLikeData(endIndex: number): boolean {\n if (this.state !== State.InCommentLike) {\n return false;\n }\n\n if (this.currentSequence === Sequences.CdataEnd) {\n if (this.xmlMode) {\n if (this.sectionStart < endIndex) {\n this.cbs.oncdata(this.sectionStart, endIndex, 0);\n }\n } else {\n /* In HTML mode, unclosed CDATA is a bogus comment. */\n const cdataStart =\n this.sectionStart - Sequences.Cdata.length - 1;\n this.cbs.oncomment(cdataStart, endIndex, 0);\n }\n } else {\n const offset = this.xmlMode\n ? 0\n : Math.min(this.sequenceIndex, Sequences.CommentEnd.length - 1);\n this.cbs.oncomment(this.sectionStart, endIndex, offset);\n }\n\n return true;\n }\n\n private handleTrailingMarkupDeclaration(endIndex: number): boolean {\n if (this.xmlMode) {\n switch (this.state) {\n case State.InSpecialComment:\n case State.BeforeComment:\n case State.CDATASequence:\n case State.DeclarationSequence:\n case State.InDeclaration: {\n this.cbs.ontext(this.sectionStart, endIndex);\n return true;\n }\n default: {\n return false;\n }\n }\n }\n\n switch (this.state) {\n case State.BeforeDeclaration:\n case State.InSpecialComment:\n case State.BeforeComment:\n case State.CDATASequence: {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n return true;\n }\n case State.DeclarationSequence: {\n if (this.sequenceIndex !== Sequences.Doctype.length) {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n }\n return true;\n }\n case State.InDeclaration: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n\n /** Handle any trailing data. */\n private handleTrailingData() {\n const endIndex = this.buffer.length + this.offset;\n\n if (\n this.handleTrailingCommentLikeData(endIndex) ||\n this.handleTrailingMarkupDeclaration(endIndex)\n ) {\n return;\n }\n\n // If there is no remaining data, we are done.\n if (this.sectionStart >= endIndex) {\n return;\n }\n\n switch (this.state) {\n case State.InTagName:\n case State.BeforeAttributeName:\n case State.BeforeAttributeValue:\n case State.AfterAttributeName:\n case State.InAttributeName:\n case State.InAttributeValueSq:\n case State.InAttributeValueDq:\n case State.InAttributeValueNq:\n case State.InClosingTagName: {\n /*\n * If we are currently in an opening or closing tag, us not calling the\n * respective callback signals that the tag should be ignored.\n */\n break;\n }\n default: {\n this.cbs.ontext(this.sectionStart, endIndex);\n }\n }\n }\n\n private emitCodePoint(cp: number, consumed: number): void {\n if (\n this.baseState !== State.Text &&\n this.baseState !== State.InSpecialTag\n ) {\n if (this.sectionStart < this.entityStart) {\n this.cbs.onattribdata(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n\n this.cbs.onattribentity(cp);\n } else {\n if (this.sectionStart < this.entityStart) {\n this.cbs.ontext(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n\n this.cbs.ontextentity(cp, this.sectionStart);\n }\n }\n}\n", "const { fromCodePoint } = String;\n\nimport Tokenizer, { type Callbacks, QuoteType } from \"./Tokenizer.js\";\n\nconst formTags = new Set([\n \"input\",\n \"option\",\n \"optgroup\",\n \"select\",\n \"button\",\n \"datalist\",\n \"textarea\",\n]);\nconst pTag = new Set([\"p\"]);\nconst headingTags = new Set([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"p\"]);\nconst tableSectionTags = new Set([\"thead\", \"tbody\"]);\nconst ddtTags = new Set([\"dd\", \"dt\"]);\nconst rtpTags = new Set([\"rt\", \"rp\"]);\n\nconst openImpliesClose = new Map<string, Set<string>>([\n [\"tr\", new Set([\"tr\", \"th\", \"td\"])],\n [\"th\", new Set([\"th\"])],\n [\"td\", new Set([\"thead\", \"th\", \"td\"])],\n [\"body\", new Set([\"head\", \"link\", \"script\"])],\n [\"a\", new Set([\"a\"])],\n [\"li\", new Set([\"li\"])],\n [\"p\", pTag],\n [\"h1\", headingTags],\n [\"h2\", headingTags],\n [\"h3\", headingTags],\n [\"h4\", headingTags],\n [\"h5\", headingTags],\n [\"h6\", headingTags],\n [\"select\", formTags],\n [\"input\", formTags],\n [\"output\", formTags],\n [\"button\", formTags],\n [\"datalist\", formTags],\n [\"textarea\", formTags],\n [\"option\", new Set([\"option\"])],\n [\"optgroup\", new Set([\"optgroup\", \"option\"])],\n [\"dd\", ddtTags],\n [\"dt\", ddtTags],\n [\"address\", pTag],\n [\"article\", pTag],\n [\"aside\", pTag],\n [\"blockquote\", pTag],\n [\"details\", pTag],\n [\"div\", pTag],\n [\"dl\", pTag],\n [\"fieldset\", pTag],\n [\"figcaption\", pTag],\n [\"figure\", pTag],\n [\"footer\", pTag],\n [\"form\", pTag],\n [\"header\", pTag],\n [\"hr\", pTag],\n [\"main\", pTag],\n [\"nav\", pTag],\n [\"ol\", pTag],\n [\"pre\", pTag],\n [\"section\", pTag],\n [\"table\", pTag],\n [\"ul\", pTag],\n [\"rt\", rtpTags],\n [\"rp\", rtpTags],\n [\"tbody\", tableSectionTags],\n [\"tfoot\", tableSectionTags],\n]);\n\nconst DOCUMENT_TYPE = \"doctype\";\n\nconst voidElements = new Set([\n \"area\",\n \"base\",\n \"basefont\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nconst foreignContextElements = new Set([\"math\", \"svg\"]);\n\n/**\n * Elements that can be used to integrate HTML content within foreign namespaces (e.g., SVG or MathML).\n *\n * Entries must use the SVG-adjusted casing (e.g. \"foreignObject\" not\n * \"foreignobject\") since they are compared against adjusted tag names.\n */\nconst htmlIntegrationElements = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignObject\",\n \"desc\",\n \"title\",\n]);\n\nconst svgTagNameAdjustments = new Map<string, string>([\n [\"altglyph\", \"altGlyph\"],\n [\"altglyphdef\", \"altGlyphDef\"],\n [\"altglyphitem\", \"altGlyphItem\"],\n [\"animatecolor\", \"animateColor\"],\n [\"animatemotion\", \"animateMotion\"],\n [\"animatetransform\", \"animateTransform\"],\n [\"clippath\", \"clipPath\"],\n [\"feblend\", \"feBlend\"],\n [\"fecolormatrix\", \"feColorMatrix\"],\n [\"fecomponenttransfer\", \"feComponentTransfer\"],\n [\"fecomposite\", \"feComposite\"],\n [\"feconvolvematrix\", \"feConvolveMatrix\"],\n [\"fediffuselighting\", \"feDiffuseLighting\"],\n [\"fedisplacementmap\", \"feDisplacementMap\"],\n [\"fedistantlight\", \"feDistantLight\"],\n [\"fedropshadow\", \"feDropShadow\"],\n [\"feflood\", \"feFlood\"],\n [\"fefunca\", \"feFuncA\"],\n [\"fefuncb\", \"feFuncB\"],\n [\"fefuncg\", \"feFuncG\"],\n [\"fefuncr\", \"feFuncR\"],\n [\"fegaussianblur\", \"feGaussianBlur\"],\n [\"feimage\", \"feImage\"],\n [\"femerge\", \"feMerge\"],\n [\"femergenode\", \"feMergeNode\"],\n [\"femorphology\", \"feMorphology\"],\n [\"feoffset\", \"feOffset\"],\n [\"fepointlight\", \"fePointLight\"],\n [\"fespecularlighting\", \"feSpecularLighting\"],\n [\"fespotlight\", \"feSpotLight\"],\n [\"fetile\", \"feTile\"],\n [\"feturbulence\", \"feTurbulence\"],\n [\"foreignobject\", \"foreignObject\"],\n [\"glyphref\", \"glyphRef\"],\n [\"lineargradient\", \"linearGradient\"],\n [\"radialgradient\", \"radialGradient\"],\n [\"textpath\", \"textPath\"],\n]);\n\nconst enum ForeignContext {\n None,\n Svg,\n MathML,\n}\n\n/**\n * Options for the streaming HTML/XML parser.\n */\nexport interface ParserOptions {\n /**\n * Indicates whether special tags (`<script>`, `<style>`, and `<title>`) should get special treatment\n * and if \"empty\" tags (eg. `<br>`) can have children. If `false`, the content of special tags\n * will be text only. For feeds and other XML content (documents that don't consist of HTML),\n * set this to `true`.\n * @default false\n */\n xmlMode?: boolean;\n\n /**\n * Decode entities within the document.\n * @default true\n */\n decodeEntities?: boolean;\n\n /**\n * If set to true, all tags will be lowercased.\n * @default !xmlMode\n */\n lowerCaseTags?: boolean;\n\n /**\n * If set to `true`, all attribute names will be lowercased. This has noticeable impact on speed.\n * @default !xmlMode\n */\n lowerCaseAttributeNames?: boolean;\n\n /**\n * If set to true, CDATA sections will be recognized as text even if the xmlMode option is not enabled.\n * NOTE: If xmlMode is set to `true` then CDATA sections will always be recognized as text.\n * @default xmlMode\n */\n recognizeCDATA?: boolean;\n\n /**\n * If set to `true`, self-closing tags will trigger the onclosetag event even if xmlMode is not set to `true`.\n * NOTE: If xmlMode is set to `true` then self-closing tags will always be recognized.\n * @default xmlMode\n */\n recognizeSelfClosing?: boolean;\n\n /**\n * Allows the default tokenizer to be overwritten.\n */\n Tokenizer?: typeof Tokenizer;\n}\n\n/**\n * Parser callback interface used by the tokenizer.\n */\nexport interface Handler {\n onparserinit(parser: Parser): void;\n\n /**\n * Resets the handler back to starting state\n */\n onreset(): void;\n\n /**\n * Signals the handler that parsing is done\n */\n onend(): void;\n onerror(error: Error): void;\n onclosetag(name: string, isImplied: boolean): void;\n onopentagname(name: string): void;\n /**\n *\n * @param name Name of the attribute\n * @param value Value of the attribute.\n * @param quote Quotes used around the attribute. `null` if the attribute has no quotes around the value, `undefined` if the attribute has no value.\n */\n onattribute(\n name: string,\n value: string,\n quote?: string | undefined | null,\n ): void;\n onopentag(\n name: string,\n attribs: { [s: string]: string },\n isImplied: boolean,\n ): void;\n ontext(data: string): void;\n oncomment(data: string): void;\n oncdatastart(): void;\n oncdataend(): void;\n oncommentend(): void;\n onprocessinginstruction(name: string, data: string): void;\n}\n\nconst reNameEnd = /\\s|\\//;\n\n/**\n * Incremental parser implementation.\n */\nexport class Parser implements Callbacks {\n /** The start index of the last event. */\n startIndex = 0;\n /** The end index of the last event. */\n endIndex = 0;\n /**\n * Store the start index of the current open tag,\n * so we can update the start index for attributes.\n */\n private openTagStart = 0;\n\n private tagname = \"\";\n private attribname = \"\";\n private attribvalue = \"\";\n private attribs: null | { [key: string]: string } = null;\n private readonly stack: string[] = [];\n private readonly foreignContext: ForeignContext[];\n private readonly cbs: Partial<Handler>;\n private readonly lowerCaseTagNames: boolean;\n private readonly lowerCaseAttributeNames: boolean;\n private readonly recognizeSelfClosing: boolean;\n /** We are parsing HTML. Inverse of the `xmlMode` option. */\n private readonly htmlMode: boolean;\n private readonly tokenizer: Tokenizer;\n\n private readonly buffers: string[] = [];\n private bufferOffset = 0;\n /** The index of the last written buffer. Used when resuming after a `pause()`. */\n private writeIndex = 0;\n /** Indicates whether the parser has finished running / `.end` has been called. */\n private ended = false;\n\n constructor(\n cbs?: Partial<Handler> | null,\n private readonly options: ParserOptions = {},\n ) {\n this.cbs = cbs ?? {};\n this.htmlMode = !this.options.xmlMode;\n this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;\n this.lowerCaseAttributeNames =\n options.lowerCaseAttributeNames ?? this.htmlMode;\n this.recognizeSelfClosing =\n options.recognizeSelfClosing ?? !this.htmlMode;\n this.tokenizer = new (options.Tokenizer ?? Tokenizer)(\n this.options,\n this,\n );\n this.foreignContext = [ForeignContext.None];\n this.cbs.onparserinit?.(this);\n }\n\n // Tokenizer event handlers\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ontext(start: number, endIndex: number): void {\n const data = this.getSlice(start, endIndex);\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(data);\n this.startIndex = endIndex;\n }\n\n /**\n * @param cp Current Unicode code point.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ontextentity(cp: number, endIndex: number): void {\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(fromCodePoint(cp));\n this.startIndex = endIndex;\n }\n\n /** @internal */\n isInForeignContext(): boolean {\n return this.foreignContext[0] !== ForeignContext.None;\n }\n\n /**\n * Checks if the current tag is a void element. Override this if you want\n * to specify your own additional void elements.\n * @param name Name of the pseudo selector.\n */\n protected isVoidElement(name: string): boolean {\n return this.htmlMode && voidElements.has(name);\n }\n\n /**\n * Read a tag name from the buffer.\n *\n * When `lowerCaseTagNames` is enabled (the default in HTML mode), the name\n * is lowercased and may be adjusted for SVG casing or the `image` \u2192 `img`\n * alias.\n * @param start Start index of the tag name in the buffer.\n * @param endIndex End index of the tag name in the buffer.\n */\n private readTagName(start: number, endIndex: number): string {\n const name = this.lowerCaseTagNames\n ? this.getSlice(start, endIndex).toLowerCase()\n : this.getSlice(start, endIndex);\n\n if (!(this.lowerCaseTagNames && this.htmlMode)) {\n return name;\n }\n\n if (this.foreignContext[0] === ForeignContext.Svg) {\n return svgTagNameAdjustments.get(name) ?? name;\n }\n\n /*\n * Closing tags for SVG elements inside HTML integration points\n * (e.g. </foreignObject> while inside its own content) need case\n * adjustment so the name matches what was pushed to the stack.\n * `foreignContext.length > 1` means a foreign ancestor exists \u2014\n * the base [None] entry plus at least one pushed context.\n */\n if (this.foreignContext.length > 1) {\n const adjusted = svgTagNameAdjustments.get(name);\n if (adjusted !== undefined && this.stack.includes(adjusted)) {\n return adjusted;\n }\n }\n\n if (!this.isInForeignContext()) {\n return name === \"image\" ? \"img\" : name;\n }\n\n return name;\n }\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onopentagname(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n this.emitOpenTag(this.readTagName(start, endIndex));\n }\n\n private emitOpenTag(name: string) {\n this.openTagStart = this.startIndex;\n this.tagname = name;\n\n /*\n * The spec ignores a second <form> when one is already open.\n * Setting tagname to \"\" suppresses all downstream effects: attribs\n * stays null so endOpenTag is a no-op, and closeCurrentTag can't\n * match \"\" on the stack.\n */\n if (this.htmlMode && name === \"form\" && this.stack.includes(\"form\")) {\n this.tagname = \"\";\n return;\n }\n\n const impliesClose = this.htmlMode && openImpliesClose.get(name);\n\n if (impliesClose) {\n while (this.stack.length > 0 && impliesClose.has(this.stack[0])) {\n this.popElement(true);\n }\n }\n if (!this.isVoidElement(name)) {\n this.stack.unshift(name);\n\n if (this.htmlMode) {\n if (name === \"svg\") {\n this.foreignContext.unshift(ForeignContext.Svg);\n } else if (name === \"math\") {\n this.foreignContext.unshift(ForeignContext.MathML);\n } else if (htmlIntegrationElements.has(name)) {\n this.foreignContext.unshift(ForeignContext.None);\n }\n }\n }\n this.cbs.onopentagname?.(name);\n if (this.cbs.onopentag) this.attribs = {};\n }\n\n private endOpenTag(isImplied: boolean) {\n this.startIndex = this.openTagStart;\n\n if (this.attribs) {\n this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);\n this.attribs = null;\n }\n if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) {\n this.cbs.onclosetag(this.tagname, true);\n }\n\n this.tagname = \"\";\n }\n\n /**\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onopentagend(endIndex: number): void {\n this.endIndex = endIndex;\n this.endOpenTag(false);\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onclosetag(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n const name = this.readTagName(start, endIndex);\n\n if (!this.isVoidElement(name)) {\n const pos = this.stack.indexOf(name);\n if (pos !== -1) {\n for (let index = 0; index < pos; index++) {\n this.popElement(true);\n }\n this.popElement(false);\n } else if (this.htmlMode && name === \"p\") {\n // Implicit open before close\n this.emitOpenTag(\"p\");\n this.closeCurrentTag(true);\n }\n } else if (this.htmlMode && name === \"br\") {\n // We can't use `emitOpenTag` for implicit open, as `br` would be implicitly closed.\n this.cbs.onopentagname?.(\"br\");\n this.cbs.onopentag?.(\"br\", {}, true);\n this.cbs.onclosetag?.(\"br\", false);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /**\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onselfclosingtag(endIndex: number): void {\n this.endIndex = endIndex;\n if (this.recognizeSelfClosing || this.isInForeignContext()) {\n this.closeCurrentTag(false);\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n } else {\n // Ignore the fact that the tag is self-closing.\n this.onopentagend(endIndex);\n }\n }\n\n /**\n * Pop the top element off the stack, emit a close event, and maintain\n * the foreign context stack.\n * @param implied Whether this close is implied (not from an explicit end tag).\n */\n private popElement(implied: boolean): void {\n // biome-ignore lint/style/noNonNullAssertion: The element is guaranteed to exist.\n const element = this.stack.shift()!;\n if (\n this.htmlMode &&\n (foreignContextElements.has(element) ||\n htmlIntegrationElements.has(element))\n ) {\n this.foreignContext.shift();\n }\n this.cbs.onclosetag?.(element, implied);\n }\n\n private closeCurrentTag(isOpenImplied: boolean) {\n const name = this.tagname;\n this.endOpenTag(isOpenImplied);\n\n // Self-closing tags will be on the top of the stack\n if (this.stack[0] === name) {\n this.popElement(!isOpenImplied);\n }\n }\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribname(start: number, endIndex: number): void {\n this.startIndex = start;\n const name = this.getSlice(start, endIndex);\n\n this.attribname = this.lowerCaseAttributeNames\n ? name.toLowerCase()\n : name;\n }\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribdata(start: number, endIndex: number): void {\n this.attribvalue += this.getSlice(start, endIndex);\n }\n\n /**\n * @param cp Current Unicode code point.\n * @internal\n */\n onattribentity(cp: number): void {\n this.attribvalue += fromCodePoint(cp);\n }\n\n /**\n * @param quote Quote type used for the current attribute.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribend(quote: QuoteType, endIndex: number): void {\n this.endIndex = endIndex;\n\n this.cbs.onattribute?.(\n this.attribname,\n this.attribvalue,\n quote === QuoteType.Double\n ? '\"'\n : quote === QuoteType.Single\n ? \"'\"\n : quote === QuoteType.NoValue\n ? undefined\n : null,\n );\n\n if (this.attribs && !Object.hasOwn(this.attribs, this.attribname)) {\n this.attribs[this.attribname] = this.attribvalue;\n }\n this.attribvalue = \"\";\n }\n\n private getInstructionName(value: string) {\n const index = value.search(reNameEnd);\n let name = index < 0 ? value : value.substr(0, index);\n\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n\n return name;\n }\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ondeclaration(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n\n if (this.cbs.onprocessinginstruction) {\n /*\n * In HTML mode, ondeclaration is only reached for DOCTYPE\n * (the tokenizer routes everything else to bogus comments).\n */\n const name = this.htmlMode\n ? this.lowerCaseTagNames\n ? DOCUMENT_TYPE\n : value.slice(0, DOCUMENT_TYPE.length)\n : this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onprocessinginstruction(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n\n if (this.cbs.onprocessinginstruction) {\n const name = this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @param offset Offset applied when computing parser indices.\n * @internal\n */\n oncomment(start: number, endIndex: number, offset: number): void {\n this.endIndex = endIndex;\n\n this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));\n this.cbs.oncommentend?.();\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @param offset Offset applied when computing parser indices.\n * @internal\n */\n oncdata(start: number, endIndex: number, offset: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex - offset);\n\n if (!this.htmlMode || this.options.recognizeCDATA) {\n this.cbs.oncdatastart?.();\n this.cbs.ontext?.(value);\n this.cbs.oncdataend?.();\n } else if (this.isInForeignContext()) {\n this.cbs.ontext?.(value);\n } else {\n this.cbs.oncomment?.(`[CDATA[${value}]]`);\n this.cbs.oncommentend?.();\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onend(): void {\n if (this.cbs.onclosetag) {\n // Set the end index for all remaining tags\n this.endIndex = this.startIndex;\n for (let index = 0; index < this.stack.length; index++) {\n this.cbs.onclosetag(this.stack[index], true);\n }\n }\n this.cbs.onend?.();\n }\n\n /**\n * Resets the parser to a blank state, ready to parse a new HTML document\n */\n reset(): void {\n this.cbs.onreset?.();\n this.tokenizer.reset();\n this.tagname = \"\";\n this.attribname = \"\";\n this.attribvalue = \"\";\n this.attribs = null;\n this.stack.length = 0;\n this.startIndex = 0;\n this.endIndex = 0;\n this.cbs.onparserinit?.(this);\n this.buffers.length = 0;\n this.foreignContext.length = 0;\n this.foreignContext.unshift(ForeignContext.None);\n this.bufferOffset = 0;\n this.writeIndex = 0;\n this.ended = false;\n }\n\n /**\n * Resets the parser, then parses a complete document and\n * pushes it to the handler.\n * @param data Document to parse.\n */\n parseComplete(data: string): void {\n this.reset();\n this.end(data);\n }\n\n private getSlice(start: number, end: number) {\n if (start === end) {\n return \"\";\n }\n\n while (start - this.bufferOffset >= this.buffers[0].length) {\n this.shiftBuffer();\n }\n\n let slice = this.buffers[0].slice(\n start - this.bufferOffset,\n end - this.bufferOffset,\n );\n\n while (end - this.bufferOffset > this.buffers[0].length) {\n this.shiftBuffer();\n slice += this.buffers[0].slice(0, end - this.bufferOffset);\n }\n\n return slice;\n }\n\n private shiftBuffer(): void {\n this.bufferOffset += this.buffers[0].length;\n this.writeIndex--;\n this.buffers.shift();\n }\n\n /**\n * Parses a chunk of data and calls the corresponding callbacks.\n * @param chunk Chunk to parse.\n */\n write(chunk: string): void {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".write() after done!\"));\n return;\n }\n\n this.buffers.push(chunk);\n if (this.tokenizer.running) {\n this.tokenizer.write(chunk);\n this.writeIndex++;\n }\n }\n\n /**\n * Parses the end of the buffer and clears the stack, calls onend.\n * @param chunk Optional final chunk to parse.\n */\n end(chunk?: string): void {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".end() after done!\"));\n return;\n }\n\n if (chunk) this.write(chunk);\n this.ended = true;\n this.tokenizer.end();\n }\n\n /**\n * Pauses parsing. The parser won't emit events until `resume` is called.\n */\n pause(): void {\n this.tokenizer.pause();\n }\n\n /**\n * Resumes parsing after `pause` was called.\n */\n resume(): void {\n this.tokenizer.resume();\n\n while (\n this.tokenizer.running &&\n this.writeIndex < this.buffers.length\n ) {\n this.tokenizer.write(this.buffers[this.writeIndex++]);\n }\n\n if (this.ended) this.tokenizer.end();\n }\n}\n", "/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n /** Type for the root element of a document */\n ElementType[\"Root\"] = \"root\";\n /** Type for Text */\n ElementType[\"Text\"] = \"text\";\n /** Type for <? ... ?> */\n ElementType[\"Directive\"] = \"directive\";\n /** Type for <!-- ... --> */\n ElementType[\"Comment\"] = \"comment\";\n /** Type for <script> tags */\n ElementType[\"Script\"] = \"script\";\n /** Type for <style> tags */\n ElementType[\"Style\"] = \"style\";\n /** Type for Any tag */\n ElementType[\"Tag\"] = \"tag\";\n /** Type for <![CDATA[ ... ]]> */\n ElementType[\"CDATA\"] = \"cdata\";\n /** Type for <!doctype ...> */\n ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n * @param element Element to test\n * @param element.type Node type discriminator to check.\n */\nexport function isTag(element) {\n return (element.type === ElementType.Tag ||\n element.type === ElementType.Script ||\n element.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\n// eslint-disable-next-line prefer-destructuring\nexport const Root = ElementType.Root;\n/** Type for Text */\n// eslint-disable-next-line prefer-destructuring\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\n// eslint-disable-next-line prefer-destructuring\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\n// eslint-disable-next-line prefer-destructuring\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Style = ElementType.Style;\n/** Type for Any tag */\n// eslint-disable-next-line prefer-destructuring\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\n// eslint-disable-next-line prefer-destructuring\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\n// eslint-disable-next-line prefer-destructuring\nexport const Doctype = ElementType.Doctype;\n", "import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n /** Parent of the node */\n parent = null;\n /** Previous sibling */\n prev = null;\n /** Next sibling */\n next = null;\n /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n startIndex = null;\n /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n endIndex = null;\n // Read-write aliases for properties\n /**\n * Same as {@link parent}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get parentNode() {\n return this.parent;\n }\n set parentNode(parent) {\n this.parent = parent;\n }\n /**\n * Same as {@link prev}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get previousSibling() {\n return this.prev;\n }\n set previousSibling(previous) {\n this.prev = previous;\n }\n /**\n * Same as {@link next}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nextSibling() {\n return this.next;\n }\n set nextSibling(next) {\n this.next = next;\n }\n /**\n * Clone this node, and optionally its children.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\n cloneNode(recursive = false) {\n return cloneNode(this, recursive);\n }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n data;\n /**\n * @param data The content of the data node\n */\n constructor(data) {\n super();\n this.data = data;\n }\n /**\n * Same as {@link data}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nodeValue() {\n return this.data;\n }\n set nodeValue(data) {\n this.data = data;\n }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n type = ElementType.Text;\n get nodeType() {\n return 3;\n }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n type = ElementType.Comment;\n get nodeType() {\n return 8;\n }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n type = ElementType.Directive;\n name;\n constructor(name, data) {\n super(data);\n this.name = name;\n }\n get nodeType() {\n return 1;\n }\n /** If this is a doctype, the document type name (parse5 only). */\n \"x-name\";\n /** If this is a doctype, the document type public identifier (parse5 only). */\n \"x-publicId\";\n /** If this is a doctype, the document type system identifier (parse5 only). */\n \"x-systemId\";\n}\n/**\n * A node that can have children.\n */\nexport class NodeWithChildren extends Node {\n children;\n /**\n * @param children Children of the node. Only certain node types can have children.\n */\n constructor(children) {\n super();\n this.children = children;\n }\n // Aliases\n /** First child of the node. */\n get firstChild() {\n return this.children[0] ?? null;\n }\n /** Last child of the node. */\n get lastChild() {\n return this.children.length > 0\n ? this.children[this.children.length - 1]\n : null;\n }\n /**\n * Same as {@link children}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get childNodes() {\n return this.children;\n }\n set childNodes(children) {\n this.children = children;\n }\n}\n/**\n * CDATA nodes.\n */\nexport class CDATA extends NodeWithChildren {\n type = ElementType.CDATA;\n get nodeType() {\n return 4;\n }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n type = ElementType.Root;\n get nodeType() {\n return 9;\n }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n name;\n attribs;\n type;\n /**\n * @param name Name of the tag, eg. `div`, `span`.\n * @param attribs Object mapping attribute names to attribute values.\n * @param children Children of the node.\n * @param type Node type used for the new node instance.\n */\n constructor(name, attribs, children = [], type = name === \"script\"\n ? ElementType.Script\n : name === \"style\"\n ? ElementType.Style\n : ElementType.Tag) {\n super(children);\n this.name = name;\n this.attribs = attribs;\n this.type = type;\n }\n get nodeType() {\n return 1;\n }\n // DOM Level 1 aliases\n /**\n * Same as {@link name}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get tagName() {\n return this.name;\n }\n set tagName(name) {\n this.name = name;\n }\n get attributes() {\n return Object.keys(this.attribs).map((name) => ({\n name,\n value: this.attribs[name],\n namespace: this[\"x-attribsNamespace\"]?.[name],\n prefix: this[\"x-attribsPrefix\"]?.[name],\n }));\n }\n /** Element namespace (parse5 only). */\n namespace;\n /** Element attribute namespaces (parse5 only). */\n \"x-attribsNamespace\";\n /** Element attribute namespace-related prefixes (parse5 only). */\n \"x-attribsPrefix\";\n}\n/**\n * Checks if `node` is an element node.\n * @param node Node to check.\n * @returns `true` if the node is an element node.\n */\nexport function isTag(node) {\n return isTagRaw(node);\n}\n/**\n * Checks if `node` is a CDATA node.\n * @param node Node to check.\n * @returns `true` if the node is a CDATA node.\n */\nexport function isCDATA(node) {\n return node.type === ElementType.CDATA;\n}\n/**\n * Checks if `node` is a text node.\n * @param node Node to check.\n * @returns `true` if the node is a text node.\n */\nexport function isText(node) {\n return node.type === ElementType.Text;\n}\n/**\n * Checks if `node` is a comment node.\n * @param node Node to check.\n * @returns `true` if the node is a comment node.\n */\nexport function isComment(node) {\n return node.type === ElementType.Comment;\n}\n/**\n * Checks if `node` is a directive node.\n * @param node Node to check.\n * @returns `true` if the node is a directive node.\n */\nexport function isDirective(node) {\n return node.type === ElementType.Directive;\n}\n/**\n * Checks if `node` is a document node.\n * @param node Node to check.\n * @returns `true` if the node is a document node.\n */\nexport function isDocument(node) {\n return node.type === ElementType.Root;\n}\n/**\n * Checks if `node` has children.\n * @param node Node to check.\n * @returns `true` if the node has children.\n */\nexport function hasChildren(node) {\n return Object.hasOwn(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n * @param node Node to clone.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n let result;\n if (isText(node)) {\n result = new Text(node.data);\n }\n else if (isComment(node)) {\n result = new Comment(node.data);\n }\n else if (isTag(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Element(node.name, { ...node.attribs }, children);\n for (const child of children) {\n child.parent = clone;\n }\n if (node.namespace != null) {\n clone.namespace = node.namespace;\n }\n if (node[\"x-attribsNamespace\"]) {\n clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n }\n if (node[\"x-attribsPrefix\"]) {\n clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n }\n result = clone;\n }\n else if (isCDATA(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new CDATA(children);\n for (const child of children) {\n child.parent = clone;\n }\n result = clone;\n }\n else if (isDocument(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Document(children);\n for (const child of children) {\n child.parent = clone;\n }\n if (node[\"x-mode\"]) {\n clone[\"x-mode\"] = node[\"x-mode\"];\n }\n result = clone;\n }\n else if (isDirective(node)) {\n const instruction = new ProcessingInstruction(node.name, node.data);\n if (node[\"x-name\"] != null) {\n instruction[\"x-name\"] = node[\"x-name\"];\n instruction[\"x-publicId\"] = node[\"x-publicId\"];\n instruction[\"x-systemId\"] = node[\"x-systemId\"];\n }\n result = instruction;\n }\n else {\n throw new Error(`Not implemented yet: ${node.type}`);\n }\n result.startIndex = node.startIndex;\n result.endIndex = node.endIndex;\n if (node.sourceCodeLocation != null) {\n result.sourceCodeLocation = node.sourceCodeLocation;\n }\n return result;\n}\n/**\n * Clone a list of child nodes.\n * @param childs The child nodes to clone.\n * @returns A list of cloned child nodes.\n */\nfunction cloneChildren(childs) {\n const children = childs.map((child) => cloneNode(child, true));\n for (let index = 1; index < children.length; index++) {\n children[index].prev = children[index - 1];\n children[index - 1].next = children[index];\n }\n return children;\n}\n", "import { ElementType } from \"domelementtype\";\nimport { CDATA, Comment, Document, Element, ProcessingInstruction, Text, } from \"./node.js\";\nexport * from \"./node.js\";\n// Default options\nconst defaultOptions = {\n withStartIndices: false,\n withEndIndices: false,\n xmlMode: false,\n};\n/**\n * Event-based handler that builds a DOM tree from parser callbacks.\n */\nexport class DomHandler {\n /** The elements of the DOM */\n dom = [];\n /** The root element for the DOM */\n root = new Document(this.dom);\n /** Called once parsing has completed. */\n callback;\n /** Settings for the handler. */\n options;\n /** Callback whenever a tag is closed. */\n elementCB;\n /** Indicated whether parsing has been completed. */\n done = false;\n /** Stack of open tags. */\n tagStack = [this.root];\n /** A data node that is still being written to. */\n lastNode = null;\n /** Reference to the parser instance. Used for location information. */\n parser = null;\n /**\n * @param callback Called once parsing has completed.\n * @param options Settings for the handler.\n * @param elementCB Callback whenever a tag is closed.\n */\n constructor(callback, options, elementCB) {\n // Make it possible to skip arguments, for backwards-compatibility\n if (typeof options === \"function\") {\n elementCB = options;\n options = defaultOptions;\n }\n if (typeof callback === \"object\") {\n options = callback;\n callback = undefined;\n }\n this.callback = callback ?? null;\n this.options = options ?? defaultOptions;\n this.elementCB = elementCB ?? null;\n }\n onparserinit(parser) {\n this.parser = parser;\n }\n // Resets the handler back to starting state\n onreset() {\n this.dom = [];\n this.root = new Document(this.dom);\n this.done = false;\n this.tagStack = [this.root];\n this.lastNode = null;\n this.parser = null;\n }\n // Signals the handler that parsing is done\n onend() {\n if (this.done)\n return;\n this.done = true;\n this.parser = null;\n this.handleCallback(null);\n }\n onerror(error) {\n this.handleCallback(error);\n }\n onclosetag() {\n this.lastNode = null;\n const element = this.tagStack.pop();\n if (this.options.withEndIndices && this.parser) {\n element.endIndex = this.parser.endIndex;\n }\n if (this.elementCB)\n this.elementCB(element);\n }\n onopentag(name, attribs) {\n const type = this.options.xmlMode ? ElementType.Tag : undefined;\n const element = new Element(name, attribs, undefined, type);\n this.addNode(element);\n this.tagStack.push(element);\n }\n ontext(data) {\n const { lastNode } = this;\n if (lastNode && lastNode.type === ElementType.Text) {\n lastNode.data += data;\n if (this.options.withEndIndices && this.parser) {\n lastNode.endIndex = this.parser.endIndex;\n }\n }\n else {\n const node = new Text(data);\n this.addNode(node);\n this.lastNode = node;\n }\n }\n oncomment(data) {\n if (this.lastNode && this.lastNode.type === ElementType.Comment) {\n this.lastNode.data += data;\n return;\n }\n const node = new Comment(data);\n this.addNode(node);\n this.lastNode = node;\n }\n oncommentend() {\n this.lastNode = null;\n }\n oncdatastart() {\n const text = new Text(\"\");\n const node = new CDATA([text]);\n this.addNode(node);\n text.parent = node;\n this.lastNode = text;\n }\n oncdataend() {\n this.lastNode = null;\n }\n onprocessinginstruction(name, data) {\n const node = new ProcessingInstruction(name, data);\n this.addNode(node);\n }\n handleCallback(error) {\n if (typeof this.callback === \"function\") {\n this.callback(error, this.dom);\n }\n else if (error) {\n throw error;\n }\n }\n addNode(node) {\n const parent = this.tagStack[this.tagStack.length - 1];\n const previousSibling = parent.children[parent.children.length - 1];\n if (this.options.withStartIndices && this.parser) {\n node.startIndex = this.parser.startIndex;\n }\n if (this.options.withEndIndices && this.parser) {\n node.endIndex = this.parser.endIndex;\n }\n parent.children.push(node);\n if (previousSibling) {\n node.prev = previousSibling;\n previousSibling.next = node;\n }\n node.parent = parent;\n this.lastNode = null;\n }\n}\nexport default DomHandler;\n", "import {\n type AnyNode,\n type Element,\n hasChildren,\n isTag,\n type ParentNode,\n} from \"domhandler\";\n\n/**\n * Search a node and its children for nodes passing a test function. If `node` is not an array, it will be wrapped in one.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param node Node to search. Will be included in the result set if it matches.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nexport function filter(\n test: (element: AnyNode) => boolean,\n node: AnyNode | AnyNode[],\n recurse = true,\n limit: number = Number.POSITIVE_INFINITY,\n): AnyNode[] {\n return find(test, Array.isArray(node) ? node : [node], recurse, limit);\n}\n\n/**\n * Search an array of nodes and their children for nodes passing a test function.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes passing `test`.\n */\nexport function find(\n test: (element: AnyNode) => boolean,\n nodes: AnyNode[] | ParentNode,\n recurse: boolean,\n limit: number,\n): AnyNode[] {\n const result: AnyNode[] = [];\n /** Stack of the arrays we are looking at. */\n const nodeStack: AnyNode[][] = [Array.isArray(nodes) ? nodes : [nodes]];\n /** Stack of the indices within the arrays. */\n const indexStack = [0];\n\n for (;;) {\n // First, check if the current array has any more elements to look at.\n if (indexStack[0] >= nodeStack[0].length) {\n // If we have no more arrays to look at, we are done.\n if (indexStack.length === 1) {\n return result;\n }\n\n // Otherwise, remove the current array from the stack.\n nodeStack.shift();\n indexStack.shift();\n\n // Loop back to the start to continue with the next array.\n continue;\n }\n\n const element = nodeStack[0][indexStack[0]++];\n\n if (test(element)) {\n result.push(element);\n if (--limit <= 0) return result;\n }\n\n if (recurse && hasChildren(element) && element.children.length > 0) {\n /*\n * Add the children to the stack. We are depth-first, so this is\n * the next array we look at.\n */\n indexStack.unshift(0);\n nodeStack.unshift(element.children);\n }\n }\n}\n\n/**\n * Finds one element in a tree that passes a test.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Node or array of nodes to search.\n * @param recurse Also consider child nodes.\n * @returns The first node that passes `test`.\n */\nexport function findOne(\n test: (element: Element) => boolean,\n nodes: AnyNode[] | ParentNode,\n recurse = true,\n): Element | null {\n const searchedNodes = Array.isArray(nodes) ? nodes : [nodes];\n for (const node of searchedNodes) {\n if (isTag(node) && test(node)) {\n return node;\n }\n if (recurse && hasChildren(node) && node.children.length > 0) {\n const found = findOne(test, node.children, true);\n if (found) return found;\n }\n }\n\n return null;\n}\n\n/**\n * Checks if a tree of nodes contains at least one node passing a test.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns Whether a tree of nodes contains at least one node passing the test.\n */\nexport function existsOne(\n test: (element: Element) => boolean,\n nodes: AnyNode[] | ParentNode,\n): boolean {\n return (Array.isArray(nodes) ? nodes : [nodes]).some(\n (node) =>\n (isTag(node) && test(node)) ||\n (hasChildren(node) && existsOne(test, node.children)),\n );\n}\n\n/**\n * Search an array of nodes and their children for elements passing a test function.\n *\n * Same as `find`, but limited to elements and with less options, leading to reduced complexity.\n *\n * @category Querying\n * @param test Function to test nodes on.\n * @param nodes Array of nodes to search.\n * @returns All nodes passing `test`.\n */\nexport function findAll(\n test: (element: Element) => boolean,\n nodes: AnyNode[] | ParentNode,\n): Element[] {\n const result = [];\n const nodeStack = [Array.isArray(nodes) ? nodes : [nodes]];\n const indexStack = [0];\n\n for (;;) {\n if (indexStack[0] >= nodeStack[0].length) {\n if (nodeStack.length === 1) {\n return result;\n }\n\n // Otherwise, remove the current array from the stack.\n nodeStack.shift();\n indexStack.shift();\n\n // Loop back to the start to continue with the next array.\n continue;\n }\n\n const element = nodeStack[0][indexStack[0]++];\n\n if (isTag(element) && test(element)) result.push(element);\n\n if (hasChildren(element) && element.children.length > 0) {\n indexStack.unshift(0);\n nodeStack.unshift(element.children);\n }\n }\n}\n", "import type { ElementType } from \"domelementtype\";\nimport { type AnyNode, type Element, isTag, isText } from \"domhandler\";\nimport { filter, findOne } from \"./querying.js\";\n\ntype TestType = (element: AnyNode) => boolean;\n\n/**\n * An object with keys to check elements against. If a key is `tag_name`,\n * `tag_type` or `tag_contains`, it will check the value against that specific\n * value. Otherwise, it will check an attribute with the key's name.\n *\n * @category Legacy Query Functions\n */\n// eslint-disable-next-line unicorn/prevent-abbreviations -- Keep the exported API name for backwards compatibility.\nexport interface TestElementOpts {\n tag_name?: string | ((name: string) => boolean);\n tag_type?: string | ((name: string) => boolean);\n tag_contains?: string | ((data?: string) => boolean);\n [attributeName: string]:\n | undefined\n | string\n | ((attributeValue: string) => boolean);\n}\n\n/**\n * A map of functions to check nodes against.\n */\nconst Checks: Record<\n string,\n (value: string | undefined | ((inputString: string) => boolean)) => TestType\n> = {\n tag_name(name) {\n if (typeof name === \"function\") {\n return (element: AnyNode) => isTag(element) && name(element.name);\n }\n if (name === \"*\") {\n return isTag;\n }\n return (element: AnyNode) => isTag(element) && element.name === name;\n },\n tag_type(type) {\n if (typeof type === \"function\") {\n return (element: AnyNode) => type(element.type);\n }\n return (element: AnyNode) => element.type === type;\n },\n tag_contains(data) {\n if (typeof data === \"function\") {\n return (element: AnyNode) => isText(element) && data(element.data);\n }\n return (element: AnyNode) => isText(element) && element.data === data;\n },\n};\n\n/**\n * Returns a function to check whether a node has an attribute with a particular\n * value.\n *\n * @param attrib Attribute to check.\n * @param value Attribute value to look for.\n * @returns A function to check whether the a node has an attribute with a\n * particular value.\n */\nfunction getAttribCheck(\n attrib: string,\n value: undefined | string | ((value: string) => boolean),\n): TestType {\n if (typeof value === \"function\") {\n return (element: AnyNode) =>\n isTag(element) && value(element.attribs[attrib]);\n }\n return (element: AnyNode) =>\n isTag(element) && element.attribs[attrib] === value;\n}\n\n/**\n * Returns a function that returns `true` if either of the input functions\n * returns `true` for a node.\n *\n * @param a First function to combine.\n * @param b Second function to combine.\n * @returns A function taking a node and returning `true` if either of the input\n * functions returns `true` for the node.\n */\nfunction combineFuncs(a: TestType, b: TestType): TestType {\n return (element: AnyNode) => a(element) || b(element);\n}\n\n/**\n * Returns a function that executes all checks in `options` and returns `true`\n * if any of them match a node.\n *\n * @param options An object describing nodes to look for.\n * @returns A function that executes all checks in `options` and returns `true`\n * if any of them match a node.\n */\nfunction compileTest(options: TestElementOpts): TestType | null {\n const funcs = Object.keys(options).map((key) => {\n const value = options[key];\n return Object.hasOwn(Checks, key)\n ? Checks[key](value)\n : getAttribCheck(key, value);\n });\n\n return funcs.length === 0 ? null : funcs.reduce(combineFuncs);\n}\n\n/**\n * Checks whether a node matches the description in `options`.\n *\n * @category Legacy Query Functions\n * @param options An object describing nodes to look for.\n * @param node The element to test.\n * @returns Whether the element matches the description in `options`.\n */\nexport function testElement(options: TestElementOpts, node: AnyNode): boolean {\n const test = compileTest(options);\n return test ? test(node) : true;\n}\n\n/**\n * Returns all nodes that match `options`.\n *\n * @category Legacy Query Functions\n * @param options An object describing nodes to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes that match `options`.\n */\nexport function getElements(\n options: TestElementOpts,\n nodes: AnyNode | AnyNode[],\n recurse: boolean,\n limit: number = Number.POSITIVE_INFINITY,\n): AnyNode[] {\n const test = compileTest(options);\n return test ? filter(test, nodes, recurse, limit) : [];\n}\n\n/**\n * Returns the node with the supplied ID.\n *\n * @category Legacy Query Functions\n * @param id The unique ID attribute value to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @returns The node with the supplied ID.\n */\nexport function getElementById(\n id: string | ((id: string) => boolean),\n nodes: AnyNode | AnyNode[],\n recurse = true,\n): Element | null {\n if (!Array.isArray(nodes)) nodes = [nodes];\n return findOne(getAttribCheck(\"id\", id), nodes, recurse);\n}\n\n/**\n * Returns all nodes with the supplied `tagName`.\n *\n * @category Legacy Query Functions\n * @param tagName Tag name to search for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `tagName`.\n */\nexport function getElementsByTagName(\n tagName: string | ((name: string) => boolean),\n nodes: AnyNode | AnyNode[],\n recurse = true,\n limit: number = Number.POSITIVE_INFINITY,\n): Element[] {\n return filter(\n Checks[\"tag_name\"](tagName),\n nodes,\n recurse,\n limit,\n ) as Element[];\n}\n\n/**\n * Returns all nodes with the supplied `className`.\n *\n * @category Legacy Query Functions\n * @param className Class name to search for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `className`.\n */\nexport function getElementsByClassName(\n className: string | ((name: string) => boolean),\n nodes: AnyNode | AnyNode[],\n recurse = true,\n limit: number = Number.POSITIVE_INFINITY,\n): Element[] {\n return filter(\n getAttribCheck(\"class\", className),\n nodes,\n recurse,\n limit,\n ) as Element[];\n}\n\n/**\n * Returns all nodes with the supplied `type`.\n *\n * @category Legacy Query Functions\n * @param type Element type to look for.\n * @param nodes Nodes to search through.\n * @param recurse Also consider child nodes.\n * @param limit Maximum number of nodes to return.\n * @returns All nodes with the supplied `type`.\n */\nexport function getElementsByTagType(\n type: ElementType | ((type: ElementType) => boolean),\n nodes: AnyNode | AnyNode[],\n recurse = true,\n limit: number = Number.POSITIVE_INFINITY,\n): AnyNode[] {\n return filter(Checks[\"tag_type\"](type as string), nodes, recurse, limit);\n}\n", "/**\n * Get the named reference for an XML special character or U+00A0.\n * @param char Code unit matched by one of the escape regexes.\n */\nfunction getEscape(char: number): string {\n return char === 34\n ? \""\"\n : char === 38\n ? \"&\"\n : char === 39\n ? \"'\"\n : char === 60\n ? \"<\"\n : char === 62\n ? \">\"\n : \" \";\n}\n\n/**\n * Read a code point at a given index.\n * @param input String to read the code point from.\n * @param index Current read position in the input string.\n * @returns The code point at `index`, or `undefined` if `index` is out of range.\n * @deprecated Use `String.prototype.codePointAt` directly instead; this export\n * will be removed in the next major.\n */\nexport const getCodePoint: (input: string, index: number) => number = (\n input: string,\n index: number,\n): number => input.codePointAt(index)!;\n\n/**\n * Bitset for ASCII characters that need to be escaped in XML.\n */\nexport const XML_BITSET_VALUE = 0x50_00_00_c4; // 32..63 -> 34 (\"),38 (&),39 ('),60 (<),62 (>)\n\n/**\n * Matches exactly the characters `encodeXML` escapes: the five XML special\n * characters plus every non-ASCII code unit (lone surrogates included \u2014 no\n * `u` flag). Kept in sync with `XML_BITSET_VALUE`.\n *\n * Shared with `encodeNonAsciiHTML` in `encode.ts`. Because the regex is\n * stateful (`g` flag), every call site must set `lastIndex` before use.\n */\n// eslint-disable-next-line unicorn/prefer-unicode-code-point-escapes -- the `\\u{...}` form requires the `u` flag, which we deliberately omit so lone surrogates match by code unit\nexport const xmlEncodeRegex: RegExp = /[\"&'<>\\u0080-\\uFFFF]/g;\n\n/**\n * Whether `code` (a UTF-16 code unit) is escaped by {@link encodeXML}: a\n * non-ASCII unit, or one of the five XML specials flagged in\n * `XML_BITSET_VALUE` (which is only meaningful for code units 32-63).\n * @param code Code unit to test.\n */\nfunction isXmlEscapable(code: number): boolean {\n return (\n code >= 0x80 ||\n (code >= 32 && code < 64 && ((XML_BITSET_VALUE >>> code) & 1) === 1)\n );\n}\n\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using XML entities.\n *\n * If a character has no equivalent entity, a numeric hexadecimal reference\n * (eg. `ü`) will be used.\n * @param input Input string to encode.\n */\nexport function encodeXML(input: string): string {\n const { length } = input;\n let out: string | undefined;\n let last = 0;\n let index = 0;\n\n while (index < length) {\n const char = input.charCodeAt(index);\n\n /*\n * Find the next character to escape: scan a short window inline\n * (escapable characters cluster in markup-heavy input), then fall\n * back to the regex, which skips clean spans in native code.\n */\n if (!isXmlEscapable(char)) {\n const bound = Math.min(index + 32, length);\n let next = index + 1;\n while (next < bound && !isXmlEscapable(input.charCodeAt(next))) {\n next++;\n }\n if (next < bound) {\n index = next;\n continue;\n }\n if (next >= length) break;\n xmlEncodeRegex.lastIndex = next;\n if (!xmlEncodeRegex.test(input)) break;\n index = xmlEncodeRegex.lastIndex - 1;\n continue;\n }\n\n if (out === undefined) out = input.substring(0, index);\n else if (last !== index) out += input.substring(last, index);\n\n if (char < 64) {\n // Known replacement\n out += getEscape(char);\n last = index += 1;\n continue;\n }\n\n // Non-ASCII: encode as numeric entity (handle surrogate pair)\n const cp = input.codePointAt(index)!;\n out += `&#x${cp.toString(16)};`;\n if (cp !== char) index++; // Skip trailing surrogate\n last = index += 1;\n }\n\n if (out === undefined) return input;\n if (last < length) out += input.substr(last);\n return out;\n}\n\n/**\n * Encodes all non-ASCII characters, as well as characters not valid in XML\n * documents using numeric hexadecimal reference (eg. `ü`).\n *\n * Have a look at `escapeUTF8` if you want a more concise output at the expense\n * of reduced transportability.\n * @param data String to escape.\n */\nexport const escape: typeof encodeXML = encodeXML;\n\n/**\n * Escape `data` using `re`, mapping each matched character to its entity.\n * Every match is one UTF-16 code unit, so its index is `lastIndex - 1`.\n * @param re Global regex matching exactly the characters to escape\n * (`\"`, `&`, `'`, `<`, `>`, `\\u00A0` at most).\n * @param data String to escape.\n */\nfunction escapeWithRegex(re: RegExp, data: string): string {\n re.lastIndex = 0;\n if (!re.test(data)) return data;\n\n let out = \"\";\n let last = 0;\n do {\n const index = re.lastIndex - 1;\n if (last !== index) out += data.substring(last, index);\n const char = data.charCodeAt(index);\n out += getEscape(char);\n last = index + 1;\n } while (re.test(data));\n\n return out + data.substring(last);\n}\n\nconst xmlEscapeRegex = /[\"&'<>]/g;\n/**\n * Encodes all characters not valid in XML documents using XML entities.\n *\n * Note that the output will be character-set dependent.\n * @param data String to escape.\n */\nexport function escapeUTF8(data: string): string {\n return escapeWithRegex(xmlEscapeRegex, data);\n}\n\nconst attributeEscapeRegex = /[\"&\\u{A0}]/gu;\n\n/**\n * Encodes all characters that have to be escaped in HTML attributes,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n * @param data String to escape.\n */\nexport function escapeAttribute(data: string): string {\n return escapeWithRegex(attributeEscapeRegex, data);\n}\n\nconst textEscapeRegex = /[&<>\\u{A0}]/gu;\n\n/**\n * Encodes all characters that have to be escaped in HTML text,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n * @param data String to escape.\n */\nexport function escapeText(data: string): string {\n return escapeWithRegex(textEscapeRegex, data);\n}\n", "import { type DecodingMode, decodeHTML, decodeXML } from \"./decode.js\";\nimport { encodeHTML, encodeNonAsciiHTML } from \"./encode.js\";\nimport {\n encodeXML,\n escapeAttribute,\n escapeText,\n escapeUTF8,\n} from \"./escape.js\";\n\n/** The level of entities to support. */\nexport enum EntityLevel {\n /** Support only XML entities. */\n XML = 0,\n /** Support HTML entities, which are a superset of XML entities. */\n HTML = 1,\n}\n\n/**\n * Encoding strategy used by `encode`.\n */\nexport enum EncodingMode {\n /**\n * The output is UTF-8 encoded. Only characters that need escaping within\n * XML will be escaped.\n */\n UTF8,\n /**\n * The output consists only of ASCII characters. Characters that need\n * escaping within HTML, and characters that aren't ASCII characters will\n * be escaped.\n */\n ASCII,\n /**\n * Encode all characters that have an equivalent entity, as well as all\n * characters that are not ASCII characters.\n */\n Extensive,\n /**\n * Encode all characters that have to be escaped in HTML attributes,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n */\n Attribute,\n /**\n * Encode all characters that have to be escaped in HTML text,\n * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}.\n */\n Text,\n}\n\n/**\n * Options for `decode`.\n */\nexport interface DecodingOptions {\n /**\n * The level of entities to support.\n * @default {@link EntityLevel.XML}\n */\n level?: EntityLevel;\n /**\n * Decoding mode. If `Legacy`, will support legacy entities not terminated\n * with a semicolon (`;`).\n *\n * Always `Strict` for XML. For HTML, set this to\n * {@link DecodingMode.Attribute} if you are parsing an attribute value.\n * @default {@link DecodingMode.Legacy}\n */\n mode?: DecodingMode | undefined;\n}\n\n/**\n * Decodes a string with entities.\n * @param input String to decode.\n * @param options Decoding options.\n */\nexport function decode(\n input: string,\n options: DecodingOptions | EntityLevel = EntityLevel.XML,\n): string {\n const level = typeof options === \"number\" ? options : options.level;\n\n if (level === EntityLevel.HTML) {\n const mode = typeof options === \"object\" ? options.mode : undefined;\n return decodeHTML(input, mode);\n }\n\n return decodeXML(input);\n}\n\n/**\n * Options for `encode`.\n */\nexport interface EncodingOptions {\n /**\n * The level of entities to support.\n * @default {@link EntityLevel.XML}\n */\n level?: EntityLevel;\n /**\n * Output format.\n * @default {@link EncodingMode.Extensive}\n */\n mode?: EncodingMode;\n}\n\n/**\n * Encodes a string with entities.\n * @param input String to encode.\n * @param options Encoding options.\n */\nexport function encode(\n input: string,\n options: EncodingOptions | EntityLevel = EntityLevel.XML,\n): string {\n const { mode = EncodingMode.Extensive, level = EntityLevel.XML } =\n typeof options === \"number\" ? { level: options } : options;\n\n switch (mode) {\n case EncodingMode.UTF8: {\n return escapeUTF8(input);\n }\n case EncodingMode.Attribute: {\n return escapeAttribute(input);\n }\n case EncodingMode.Text: {\n return escapeText(input);\n }\n case EncodingMode.ASCII: {\n return (\n level === EntityLevel.HTML ? encodeNonAsciiHTML : encodeXML\n )(input);\n }\n // biome-ignore lint/complexity/noUselessSwitchCase: we get an error for the switch not being exhaustive\n case EncodingMode.Extensive:\n default: {\n return (level === EntityLevel.HTML ? encodeHTML : encodeXML)(input);\n }\n }\n}\n\nexport {\n DecodingMode,\n decodeHTML,\n decodeHTMLAttribute,\n decodeHTMLStrict,\n decodeXML,\n decodeXML as decodeXMLStrict,\n EntityDecoder,\n} from \"./decode.js\";\n\nexport {\n encodeHTML,\n encodeNonAsciiHTML,\n} from \"./encode.js\";\nexport {\n encodeXML,\n escape,\n escapeAttribute,\n escapeText,\n escapeUTF8,\n} from \"./escape.js\";\n", "/**\n * Mixed-case SVG and MathML element names recognized in foreign content.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nexport const elementNames = new Map<string, string>(\n \"altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feDropShadow feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath\"\n .split(\" \")\n .map((name) => [name.toLowerCase(), name]),\n);\n\n/**\n * Mixed-case SVG and MathML attribute names recognized in foreign content.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nexport const attributeNames = new Map<string, string>(\n \"definitionURL attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits diffuseConstant edgeMode filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan\"\n .split(\" \")\n .map((name) => [name.toLowerCase(), name]),\n);\n", "import * as ElementType from \"domelementtype\";\nimport type {\n AnyNode,\n CDATA,\n Comment,\n Element,\n ProcessingInstruction,\n Text,\n} from \"domhandler\";\nimport { encodeXML, escapeAttribute, escapeText } from \"entities\";\nimport { attributeNames, elementNames } from \"./foreign-names.js\";\n\n/**\n * Options for DOM serialization.\n */\nexport interface DomSerializerOptions {\n /**\n * Print an empty attribute's value.\n * @default xmlMode\n * @example With <code>emptyAttrs: false</code>: <code><input checked></code>\n * @example With <code>emptyAttrs: true</code>: <code><input checked=\"\"></code>\n */\n emptyAttrs?: boolean;\n /**\n * Print self-closing tags for tags without contents. If `xmlMode` is set,\n * this will apply to all tags. Otherwise, only tags that are defined as\n * self-closing in the HTML specification will be printed as such.\n * @default xmlMode\n * @example With <code>selfClosingTags: false</code>: <code><foo></foo><br></br></code>\n * @example With <code>xmlMode: true</code> and <code>selfClosingTags: true</code>: <code><foo/><br/></code>\n * @example With <code>xmlMode: false</code> and <code>selfClosingTags: true</code>: <code><foo></foo><br /></code>\n */\n selfClosingTags?: boolean;\n /**\n * Treat the input as an XML document; enables the `emptyAttrs` and\n * `selfClosingTags` options.\n *\n * If the value is `\"foreign\"`, it will try to correct mixed-case attribute\n * names.\n * @default false\n */\n xmlMode?: boolean | \"foreign\";\n /**\n * Encode characters reserved in HTML or XML in text and attribute values.\n *\n * If `xmlMode` is set or the value is not `'utf8'`, characters outside the\n * ASCII range will also be encoded as numeric entities.\n *\n * **Security:** Setting this to `false` disables encoding of `<`, `>`, `&`,\n * and (in attribute values) `'` \u2014 only `\"` in attribute values is escaped.\n * This is safe for the round-trip case (DOM was parsed with\n * `decodeEntities: false`, so any markup characters in text or attribute\n * values exist only as entity references), and unsafe otherwise. If text\n * or attribute values in the DOM contain raw `<`, `>`, or `&`, those\n * characters will appear literally in the output.\n * @default `decodeEntities`\n */\n encodeEntities?: boolean | \"utf8\";\n /**\n * Default for `encodeEntities`. Named to match the parser option of the\n * same name so a single options object can be threaded through parse and\n * serialize for a faithful round-trip \u2014 for example, cheerio parses with\n * `decodeEntities: false` to preserve entity references and passes the\n * same option here so they are not re-encoded.\n *\n * Despite the name, on the serializer this option controls *encoding*.\n * Setting it to `false` carries the same caveat as `encodeEntities: false`\n * \u2014 see that option.\n * @default true\n */\n decodeEntities?: boolean;\n}\n\n// \u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Elements whose text content is never entity-encoded. */\nconst unencodedElements = new Set(\n \"style script xmp iframe noembed noframes plaintext noscript\".split(\" \"),\n);\n\n/** HTML void elements \u2014 they cannot have children. */\nconst voidElements = new Set(\n \"area base basefont br col command embed frame hr img input isindex keygen link meta param source track wbr\".split(\n \" \",\n ),\n);\n\n/** Elements that switch the parser into foreign (XML-like) mode. */\nconst foreignElements = new Set([\"svg\", \"math\"]);\n\n/**\n * Foreign-mode integration points: children of these elements are parsed\n * as HTML again, not as foreign content.\n */\nconst foreignModeIntegrationPoints = new Set(\n \"mi mo mn ms mtext annotation-xml foreignObject desc title\".split(\" \"),\n);\n\n// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed\n * node(s).\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nexport function render(\n node: AnyNode | ArrayLike<AnyNode>,\n options: DomSerializerOptions = {},\n): string {\n const nodes = \"length\" in node ? node : [node];\n\n /*\n * `xmlMode` is threaded as a separate argument through the internal\n * functions so that foreign-mode transitions (svg/mathml \u2194 html) can\n * adjust it without copying the options object on every element.\n */\n const xmlMode = options.xmlMode ?? false;\n\n let output = \"\";\n // eslint-disable-next-line unicorn/no-for-loop\n for (let index = 0; index < nodes.length; index++) {\n output += renderNode(nodes[index], options, xmlMode);\n }\n\n return output;\n}\n\nexport default render;\n\n// \u2500\u2500 Internal rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Render an array of child nodes (skips the single-node wrapping in `render`).\n * @param children The child nodes to render.\n * @param options The serialization options.\n * @param xmlMode The XML mode to use.\n */\nfunction renderChildren(\n children: ArrayLike<AnyNode>,\n options: DomSerializerOptions,\n xmlMode: boolean | \"foreign\",\n): string {\n let output = \"\";\n // eslint-disable-next-line unicorn/no-for-loop\n for (let index = 0; index < children.length; index++) {\n output += renderNode(children[index], options, xmlMode);\n }\n return output;\n}\n\nfunction renderNode(\n node: AnyNode,\n options: DomSerializerOptions,\n xmlMode: boolean | \"foreign\",\n): string {\n switch (node.type) {\n case ElementType.Root: {\n return renderChildren(node.children, options, xmlMode);\n }\n\n case ElementType.Directive: {\n return `<${(node as ProcessingInstruction).data}>`;\n }\n\n case ElementType.Comment: {\n return `<!--${(node as Comment).data}-->`;\n }\n\n case ElementType.CDATA: {\n return `<![CDATA[${((node as CDATA).children[0] as Text).data}]]>`;\n }\n\n case ElementType.Script:\n case ElementType.Style:\n case ElementType.Tag: {\n return renderTag(node as Element, options, xmlMode);\n }\n\n case ElementType.Text: {\n const element = node as Text;\n const data = element.data || \"\";\n\n /*\n * Skip encoding when entities weren't decoded on input, or when\n * inside a raw-text element (script, style, etc.) in HTML mode.\n */\n if (\n (options.encodeEntities ?? options.decodeEntities) !== false &&\n !(\n !xmlMode &&\n element.parent &&\n unencodedElements.has((element.parent as Element).name)\n )\n ) {\n // `xmlMode: \"foreign\"` is truthy\n return xmlMode || options.encodeEntities !== \"utf8\"\n ? encodeXML(data)\n : escapeText(data);\n }\n\n return data;\n }\n }\n}\n\nfunction renderTag(\n element: Element,\n options: DomSerializerOptions,\n xmlMode: boolean | \"foreign\",\n) {\n if (xmlMode === \"foreign\") {\n // Correct lowercase element names back to their canonical mixed-case form\n element.name = elementNames.get(element.name) ?? element.name;\n\n // Integration points exit foreign mode: their children are HTML\n if (\n element.parent &&\n foreignModeIntegrationPoints.has((element.parent as Element).name)\n ) {\n xmlMode = false;\n }\n }\n\n if (!xmlMode && foreignElements.has(element.name)) {\n xmlMode = \"foreign\";\n }\n\n const { name, children } = element;\n\n // Cache the void-element check \u2014 used for both self-closing and closing-tag logic\n const isVoid = !xmlMode && voidElements.has(name);\n\n let tag = `<${name}${formatAttributes(element.attribs, options, xmlMode)}`;\n\n if (\n children.length === 0 &&\n (xmlMode\n ? options.selfClosingTags !== false\n : options.selfClosingTags && isVoid)\n ) {\n // XML: `<br/>`, HTML: `<br />`\n tag += xmlMode ? \"/>\" : \" />\";\n } else {\n tag += \">\";\n\n if (children.length > 0) {\n tag += renderChildren(children, options, xmlMode);\n }\n\n if (!isVoid) {\n tag += `</${name}>`;\n }\n }\n\n return tag;\n}\n\n// \u2500\u2500 Attribute formatting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction replaceQuotes(value: string): string {\n return value.replaceAll('\"', \""\");\n}\n\n/**\n * Serialize an element's attribute map to a string.\n *\n * Returns a string with a leading space before each attribute, or an\n * empty string if there are no attributes. This convention lets the\n * caller unconditionally concatenate the result onto the tag name.\n * @param attributes\n * @param options\n * @param xmlMode\n */\nfunction formatAttributes(\n attributes: Record<string, unknown> | undefined,\n options: DomSerializerOptions,\n xmlMode: boolean | \"foreign\",\n) {\n if (!attributes) return \"\";\n\n /*\n * Pick the right encoder:\n * - Encoding disabled \u2192 only escape double-quotes (for valid attributes)\n * - XML / non-utf8 \u2192 full numeric entity encoding (encodeXML)\n * - HTML + utf8 \u2192 minimal escaping (escapeAttribute)\n */\n const encode =\n (options.encodeEntities ?? options.decodeEntities) === false\n ? replaceQuotes\n : xmlMode || options.encodeEntities !== \"utf8\"\n ? encodeXML\n : escapeAttribute;\n\n const isForeign = xmlMode === \"foreign\";\n const showEmpty = !!(options.emptyAttrs ?? xmlMode);\n\n let result = \"\";\n\n for (const key in attributes) {\n if (!Object.hasOwn(attributes, key)) continue;\n\n const value = attributes[key];\n const k = isForeign ? (attributeNames.get(key) ?? key) : key;\n\n result +=\n !showEmpty && (value == null || value === \"\")\n ? ` ${k}`\n : ` ${k}=\"${encode(value == null ? \"\" : String(value))}\"`;\n }\n\n return result;\n}\n", "import renderHTML, { type DomSerializerOptions } from \"dom-serializer\";\nimport { ElementType } from \"domelementtype\";\nimport {\n type AnyNode,\n hasChildren,\n isCDATA,\n isComment,\n isTag,\n isText,\n} from \"domhandler\";\n\n/**\n * @category Stringify\n * @deprecated Use the `dom-serializer` module directly.\n * @param node Node to get the outer HTML of.\n * @param options Options for serialization.\n * @returns `node`'s outer HTML.\n */\nexport function getOuterHTML(\n node: AnyNode | ArrayLike<AnyNode>,\n options?: DomSerializerOptions,\n): string {\n return renderHTML(node, options);\n}\n\n/**\n * @category Stringify\n * @deprecated Use the `dom-serializer` module directly.\n * @param node Node to get the inner HTML of.\n * @param options Options for serialization.\n * @returns `node`'s inner HTML.\n */\nexport function getInnerHTML(\n node: AnyNode,\n options?: DomSerializerOptions,\n): string {\n return hasChildren(node)\n ? node.children.map((node) => getOuterHTML(node, options)).join(\"\")\n : \"\";\n}\n\n/**\n * Get a node's inner text. Same as `textContent`, but inserts newlines for `<br>` tags. Ignores comments.\n *\n * @category Stringify\n * @deprecated Use `textContent` instead.\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n */\nexport function getText(node: AnyNode | AnyNode[]): string {\n if (Array.isArray(node)) return node.map(getText).join(\"\");\n if (isTag(node)) return node.name === \"br\" ? \"\\n\" : getText(node.children);\n if (isCDATA(node)) return getText(node.children);\n if (isText(node)) return node.data;\n return \"\";\n}\n\n/**\n * Get a node's text content. Ignores comments.\n *\n * @category Stringify\n * @param node Node to get the text content of.\n * @returns `node`'s text content.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent}\n */\nexport function textContent(node: AnyNode | AnyNode[]): string {\n if (Array.isArray(node)) return node.map(textContent).join(\"\");\n if (hasChildren(node) && !isComment(node)) {\n return textContent(node.children);\n }\n if (isText(node)) return node.data;\n return \"\";\n}\n\n/**\n * Get a node's inner text, ignoring `<script>` and `<style>` tags. Ignores comments.\n *\n * @category Stringify\n * @param node Node to get the inner text of.\n * @returns `node`'s inner text.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Node/innerText}\n */\nexport function innerText(node: AnyNode | AnyNode[]): string {\n if (Array.isArray(node)) return node.map(innerText).join(\"\");\n if (hasChildren(node) && (node.type === ElementType.Tag || isCDATA(node))) {\n return innerText(node.children);\n }\n if (isText(node)) return node.data;\n return \"\";\n}\n", "import type { AnyNode, Element } from \"domhandler\";\nimport { getElementsByTagName } from \"./legacy.js\";\nimport { textContent } from \"./stringify.js\";\n\n/**\n * The medium of a media item.\n *\n * @category Feeds\n */\nexport type FeedItemMediaMedium =\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"document\"\n | \"executable\";\n\n/**\n * The type of a media item.\n *\n * @category Feeds\n */\nexport type FeedItemMediaExpression = \"sample\" | \"full\" | \"nonstop\";\n\n/**\n * A media item of a feed entry.\n *\n * @category Feeds\n */\nexport interface FeedItemMedia {\n medium: FeedItemMediaMedium | undefined;\n isDefault: boolean;\n url?: string;\n fileSize?: number;\n type?: string;\n expression?: FeedItemMediaExpression;\n bitrate?: number;\n framerate?: number;\n samplingrate?: number;\n channels?: number;\n duration?: number;\n height?: number;\n width?: number;\n lang?: string;\n}\n\n/**\n * An entry of a feed.\n *\n * @category Feeds\n */\nexport interface FeedItem {\n id?: string;\n title?: string;\n link?: string;\n description?: string;\n pubDate?: Date;\n media: FeedItemMedia[];\n}\n\n/**\n * The root of a feed.\n *\n * @category Feeds\n */\nexport interface Feed {\n type: string;\n id?: string;\n title?: string;\n link?: string;\n description?: string;\n updated?: Date;\n author?: string;\n items: FeedItem[];\n}\n\n/**\n * Get the feed object from the root of a DOM tree.\n *\n * @category Feeds\n * @param document The DOM to extract the feed from.\n * @returns The feed.\n */\nexport function getFeed(document: AnyNode[]): Feed | null {\n const feedRoot = getOneElement(isValidFeed, document);\n\n return feedRoot\n ? feedRoot.name === \"feed\"\n ? getAtomFeed(feedRoot)\n : getRssFeed(feedRoot)\n : null;\n}\n\n/**\n * Parse an Atom feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getAtomFeed(feedRoot: Element) {\n const childs = feedRoot.children;\n\n const feed: Feed = {\n type: \"atom\",\n items: getElementsByTagName(\"entry\", childs).map((item) => {\n const { children } = item;\n const entry: FeedItem = { media: getMediaElements(children) };\n\n addConditionally(entry, \"id\", \"id\", children);\n addConditionally(entry, \"title\", \"title\", children);\n\n const href = getOneElement(\"link\", children)?.attribs[\"href\"];\n if (href) {\n entry.link = href;\n }\n\n const description =\n fetch(\"summary\", children) || fetch(\"content\", children);\n if (description) {\n entry.description = description;\n }\n\n const pubDate = fetch(\"updated\", children);\n if (pubDate) {\n entry.pubDate = new Date(pubDate);\n }\n\n return entry;\n }),\n };\n\n addConditionally(feed, \"id\", \"id\", childs);\n addConditionally(feed, \"title\", \"title\", childs);\n const href = getOneElement(\"link\", childs)?.attribs[\"href\"];\n if (href) {\n feed.link = href;\n }\n addConditionally(feed, \"description\", \"subtitle\", childs);\n\n const updated = fetch(\"updated\", childs);\n if (updated) {\n feed.updated = new Date(updated);\n }\n\n addConditionally(feed, \"author\", \"email\", childs, true);\n\n return feed;\n}\n\n/**\n * Parse a RSS feed.\n *\n * @param feedRoot The root of the feed.\n * @returns The parsed feed.\n */\nfunction getRssFeed(feedRoot: Element) {\n const childs = getOneElement(\"channel\", feedRoot.children)?.children ?? [];\n\n const feed: Feed = {\n type: feedRoot.name.substr(0, 3),\n id: \"\",\n items: getElementsByTagName(\"item\", feedRoot.children).map(\n (item: Element) => {\n const { children } = item;\n const entry: FeedItem = { media: getMediaElements(children) };\n addConditionally(entry, \"id\", \"guid\", children);\n addConditionally(entry, \"title\", \"title\", children);\n addConditionally(entry, \"link\", \"link\", children);\n addConditionally(entry, \"description\", \"description\", children);\n const pubDate =\n fetch(\"pubDate\", children) || fetch(\"dc:date\", children);\n if (pubDate) entry.pubDate = new Date(pubDate);\n\n return entry;\n },\n ),\n };\n\n addConditionally(feed, \"title\", \"title\", childs);\n addConditionally(feed, \"link\", \"link\", childs);\n addConditionally(feed, \"description\", \"description\", childs);\n\n const updated = fetch(\"lastBuildDate\", childs);\n if (updated) {\n feed.updated = new Date(updated);\n }\n\n addConditionally(feed, \"author\", \"managingEditor\", childs, true);\n\n return feed;\n}\n\nconst MEDIA_KEYS_STRING = [\"url\", \"type\", \"lang\"] as const;\nconst MEDIA_KEYS_INT = [\n \"fileSize\",\n \"bitrate\",\n \"framerate\",\n \"samplingrate\",\n \"channels\",\n \"duration\",\n \"height\",\n \"width\",\n] as const;\n\n/**\n * Get all media elements of a feed item.\n *\n * @param where Nodes to search in.\n * @returns Media elements.\n */\nfunction getMediaElements(where: AnyNode[]): FeedItemMedia[] {\n return getElementsByTagName(\"media:content\", where).map((element) => {\n const { attribs } = element;\n\n const media: FeedItemMedia = {\n medium: attribs[\"medium\"] as unknown as\n | FeedItemMediaMedium\n | undefined,\n isDefault: !!attribs[\"isDefault\"],\n };\n\n for (const attrib of MEDIA_KEYS_STRING) {\n if (attribs[attrib]) {\n media[attrib] = attribs[attrib];\n }\n }\n\n for (const attrib of MEDIA_KEYS_INT) {\n if (attribs[attrib]) {\n media[attrib] = Number.parseInt(attribs[attrib], 10);\n }\n }\n\n if (attribs[\"expression\"]) {\n media.expression = attribs[\n \"expression\"\n ] as unknown as FeedItemMediaExpression;\n }\n\n return media;\n });\n}\n\n/**\n * Get one element by tag name.\n *\n * @param tagName Tag name to look for\n * @param node Node to search in\n * @returns The element or null\n */\nfunction getOneElement(\n tagName: string | ((name: string) => boolean),\n node: AnyNode[],\n): Element | null {\n return getElementsByTagName(tagName, node, true, 1)[0];\n}\n\n/**\n * Get the text content of an element with a certain tag name.\n *\n * @param tagName Tag name to look for.\n * @param where Node to search in.\n * @param recurse Whether to recurse into child nodes.\n * @returns The text content of the element.\n */\nfunction fetch(\n tagName: string,\n where: AnyNode | AnyNode[],\n recurse = false,\n): string {\n return textContent(getElementsByTagName(tagName, where, recurse, 1)).trim();\n}\n\n/**\n * Adds a property to an object if it has a value.\n *\n * @param object Object to be extended.\n * @param property Property name.\n * @param tagName Tag name that contains the conditionally added property.\n * @param where Element to search for the property.\n * @param recurse Whether to recurse into child nodes.\n */\nfunction addConditionally<T>(\n object: T,\n property: keyof T,\n tagName: string,\n where: AnyNode[],\n recurse = false,\n) {\n const value = fetch(tagName, where, recurse);\n if (value) object[property] = value as unknown as T[keyof T];\n}\n\n/**\n * Checks if an element is a feed root node.\n *\n * @param value The name of the element to check.\n * @returns Whether an element is a feed root node.\n */\nfunction isValidFeed(value: string) {\n return value === \"rss\" || value === \"feed\" || value === \"rdf:RDF\";\n}\n", "import { type AnyNode, hasChildren, type ParentNode } from \"domhandler\";\n\n/**\n * Given an array of nodes, remove any member that is contained by another\n * member.\n *\n * @category Helpers\n * @param nodes Nodes to filter.\n * @returns Remaining nodes that aren't contained by other nodes.\n */\nexport function removeSubsets(nodes: AnyNode[]): AnyNode[] {\n let index = nodes.length;\n\n /*\n * Check if each node (or one of its ancestors) is already contained in the\n * array.\n */\n while (--index >= 0) {\n const node = nodes[index];\n\n /*\n * Remove the node if it is not unique.\n * We are going through the array from the end, so we only\n * have to check nodes that preceed the node under consideration in the array.\n */\n if (index > 0 && nodes.lastIndexOf(node, index - 1) >= 0) {\n nodes.splice(index, 1);\n continue;\n }\n\n for (let ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n if (nodes.includes(ancestor)) {\n nodes.splice(index, 1);\n break;\n }\n }\n }\n\n return nodes;\n}\n/**\n * @category Helpers\n * @see {@link http://dom.spec.whatwg.org/#dom-node-comparedocumentposition}\n */\nexport const enum DocumentPosition {\n DISCONNECTED = 1,\n PRECEDING = 2,\n FOLLOWING = 4,\n CONTAINS = 8,\n CONTAINED_BY = 16,\n}\n\n/**\n * Compare the position of one node against another node in any other document,\n * returning a bitmask with the values from {@link DocumentPosition}.\n *\n * Document order:\n * > There is an ordering, document order, defined on all the nodes in the\n * > document corresponding to the order in which the first character of the\n * > XML representation of each node occurs in the XML representation of the\n * > document after expansion of general entities. Thus, the document element\n * > node will be the first node. Element nodes occur before their children.\n * > Thus, document order orders element nodes in order of the occurrence of\n * > their start-tag in the XML (after expansion of entities). The attribute\n * > nodes of an element occur after the element and before its children. The\n * > relative order of attribute nodes is implementation-dependent.\n *\n * Source:\n * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order\n *\n * @category Helpers\n * @param nodeA The first node to use in the comparison\n * @param nodeB The second node to use in the comparison\n * @returns A bitmask describing the input nodes' relative position.\n *\n * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for\n * a description of these values.\n */\nexport function compareDocumentPosition(\n nodeA: AnyNode,\n nodeB: AnyNode,\n): number {\n const aParents: ParentNode[] = [];\n const bParents: ParentNode[] = [];\n\n if (nodeA === nodeB) {\n return 0;\n }\n\n let current = hasChildren(nodeA) ? nodeA : nodeA.parent;\n while (current) {\n aParents.unshift(current);\n current = current.parent;\n }\n current = hasChildren(nodeB) ? nodeB : nodeB.parent;\n while (current) {\n bParents.unshift(current);\n current = current.parent;\n }\n\n const maxIndex = Math.min(aParents.length, bParents.length);\n let index = 0;\n while (index < maxIndex && aParents[index] === bParents[index]) {\n index++;\n }\n\n if (index === 0) {\n return DocumentPosition.DISCONNECTED;\n }\n\n const sharedParent = aParents[index - 1];\n const siblings: AnyNode[] = sharedParent.children;\n const aSibling = aParents[index];\n const bSibling = bParents[index];\n\n if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {\n if (sharedParent === nodeB) {\n return DocumentPosition.FOLLOWING | DocumentPosition.CONTAINED_BY;\n }\n return DocumentPosition.FOLLOWING;\n }\n if (sharedParent === nodeA) {\n return DocumentPosition.PRECEDING | DocumentPosition.CONTAINS;\n }\n return DocumentPosition.PRECEDING;\n}\n\n/**\n * Sort an array of nodes based on their relative position in the document,\n * removing any duplicate nodes. If the array contains nodes that do not belong\n * to the same document, sort order is unspecified.\n *\n * @category Helpers\n * @param nodes Array of DOM nodes.\n * @returns Collection of unique nodes, sorted in document order.\n */\nexport function uniqueSort<T extends AnyNode>(nodes: T[]): T[] {\n nodes = nodes.filter(\n (node, index, array) => !array.includes(node, index + 1),\n );\n\n nodes.sort((a, b) => {\n const relative = compareDocumentPosition(a, b);\n if (relative & DocumentPosition.PRECEDING) {\n return -1;\n }\n if (relative & DocumentPosition.FOLLOWING) {\n return 1;\n }\n return 0;\n });\n\n return nodes;\n}\n", "import type { ChildNode, ParentNode } from \"domhandler\";\n\n/**\n * Remove an element from the dom\n *\n * @category Manipulation\n * @param element The element to be removed.\n */\nexport function removeElement(element: ChildNode): void {\n if (element.prev) element.prev.next = element.next;\n if (element.next) element.next.prev = element.prev;\n\n if (element.parent) {\n const childs = element.parent.children;\n const childsIndex = childs.lastIndexOf(element);\n if (childsIndex !== -1) {\n childs.splice(childsIndex, 1);\n }\n }\n element.next = null;\n element.prev = null;\n element.parent = null;\n}\n\n/**\n * Replace an element in the dom\n *\n * @category Manipulation\n * @param element The element to be replaced.\n * @param replacement The element to be added\n */\nexport function replaceElement(\n element: ChildNode,\n replacement: ChildNode,\n): void {\n replacement.prev = element.prev;\n if (replacement.prev) {\n replacement.prev.next = replacement;\n }\n\n replacement.next = element.next;\n if (replacement.next) {\n replacement.next.prev = replacement;\n }\n\n replacement.parent = element.parent;\n if (replacement.parent) {\n const { children } = replacement.parent;\n const elementIndex = children.lastIndexOf(element);\n if (elementIndex === -1) {\n return;\n }\n\n children[elementIndex] = replacement;\n element.parent = null;\n }\n}\n\n/**\n * Append a child to an element.\n *\n * @category Manipulation\n * @param parent The element to append to.\n * @param child The element to be added as a child.\n */\nexport function appendChild(parent: ParentNode, child: ChildNode): void {\n removeElement(child);\n\n child.next = null;\n child.parent = parent;\n\n if (parent.children.push(child) > 1) {\n const sibling = parent.children[parent.children.length - 2];\n sibling.next = child;\n child.prev = sibling;\n } else {\n child.prev = null;\n }\n}\n\n/**\n * Append an element after another.\n *\n * @category Manipulation\n * @param element The element to append after.\n * @param next The element be added.\n */\nexport function append(element: ChildNode, next: ChildNode): void {\n removeElement(next);\n\n const { parent } = element;\n const currentNext = element.next;\n\n next.next = currentNext;\n next.prev = element;\n element.next = next;\n next.parent = parent;\n\n if (currentNext) {\n currentNext.prev = next;\n if (parent) {\n const childs = parent.children;\n childs.splice(childs.lastIndexOf(currentNext), 0, next);\n }\n } else if (parent) {\n parent.children.push(next);\n }\n}\n\n/**\n * Prepend a child to an element.\n *\n * @category Manipulation\n * @param parent The element to prepend before.\n * @param child The element to be added as a child.\n */\nexport function prependChild(parent: ParentNode, child: ChildNode): void {\n removeElement(child);\n\n child.parent = parent;\n child.prev = null;\n\n if (parent.children.unshift(child) === 1) {\n child.next = null;\n } else {\n const sibling = parent.children[1];\n sibling.prev = child;\n child.next = sibling;\n }\n}\n\n/**\n * Prepend an element before another.\n *\n * @category Manipulation\n * @param element The element to prepend before.\n * @param previous The element to be added.\n */\nexport function prepend(element: ChildNode, previous: ChildNode): void {\n removeElement(previous);\n\n const { parent } = element;\n if (parent) {\n const childs = parent.children;\n childs.splice(childs.indexOf(element), 0, previous);\n }\n\n if (element.prev) {\n element.prev.next = previous;\n }\n\n previous.parent = parent;\n previous.prev = element.prev;\n previous.next = element;\n element.prev = previous;\n}\n", "import {\n type AnyNode,\n type ChildNode,\n type Element,\n hasChildren,\n isTag,\n type ParentNode,\n} from \"domhandler\";\n\n/**\n * Get a node's children.\n *\n * @category Traversal\n * @param element Node to get the children of.\n * @returns `element`'s children, or an empty array.\n */\nexport function getChildren(element: AnyNode): ChildNode[] {\n return hasChildren(element) ? element.children : [];\n}\n\n/**\n * Get a node's parent.\n *\n * @category Traversal\n * @param element Node to get the parent of.\n * @returns `element`'s parent node, or `null` if `element` is a root node.\n */\nexport function getParent(element: AnyNode): ParentNode | null;\nexport function getParent(element: AnyNode): ParentNode | null {\n return element.parent || null;\n}\n\n/**\n * Gets an elements siblings, including the element itself.\n *\n * Attempts to get the children through the element's parent first. If we don't\n * have a parent (the element is a root node), we walk the element's `prev` &\n * `next` to get all remaining nodes.\n *\n * @category Traversal\n * @param element Element to get the siblings of.\n * @returns `element`'s siblings, including `element`.\n */\nexport function getSiblings(element: AnyNode): AnyNode[] {\n const parent = getParent(element);\n if (parent != null) return getChildren(parent);\n\n const siblings = [element];\n let { prev, next } = element;\n while (prev != null) {\n siblings.unshift(prev);\n ({ prev } = prev);\n }\n while (next != null) {\n siblings.push(next);\n ({ next } = next);\n }\n return siblings;\n}\n\n/**\n * Gets an attribute from an element.\n *\n * @category Traversal\n * @param element Element to check.\n * @param name Attribute name to retrieve.\n * @returns The element's attribute value, or `undefined`.\n */\nexport function getAttributeValue(\n element: Element,\n name: string,\n): string | undefined {\n const { attribs } = element as {\n attribs?: Record<string, string | undefined>;\n };\n return attribs?.[name];\n}\n\n/**\n * Checks whether an element has an attribute.\n *\n * @category Traversal\n * @param element Element to check.\n * @param name Attribute name to look for.\n * @returns Returns whether `element` has the attribute `name`.\n */\nexport function hasAttrib(element: Element, name: string): boolean {\n const { attribs } = element as { attribs?: Record<string, string | null> };\n return (\n attribs != null && Object.hasOwn(attribs, name) && attribs[name] != null\n );\n}\n\n/**\n * Get the tag name of an element.\n *\n * @category Traversal\n * @param element The element to get the name for.\n * @returns The tag name of `element`.\n */\nexport function getName(element: Element): string {\n return element.name;\n}\n\n/**\n * Returns the next element sibling of a node.\n *\n * @category Traversal\n * @param element The element to get the next sibling of.\n * @returns `element`'s next sibling that is a tag, or `null` if there is no next\n * sibling.\n */\nexport function nextElementSibling(element: AnyNode): Element | null {\n let { next } = element;\n while (next !== null && !isTag(next)) ({ next } = next);\n return next;\n}\n\n/**\n * Returns the previous element sibling of a node.\n *\n * @category Traversal\n * @param element The element to get the previous sibling of.\n * @returns `element`'s previous sibling that is a tag, or `null` if there is no\n * previous sibling.\n */\n// eslint-disable-next-line unicorn/prevent-abbreviations -- Keep public API name for backwards compatibility.\nexport function prevElementSibling(element: AnyNode): Element | null {\n let { prev } = element;\n while (prev !== null && !isTag(prev)) ({ prev } = prev);\n return prev;\n}\n", "export * from \"./feeds.js\";\nexport * from \"./helpers.js\";\nexport * from \"./legacy.js\";\nexport * from \"./manipulation.js\";\nexport * from \"./querying.js\";\nexport * from \"./stringify.js\";\nexport * from \"./traversal.js\";\n", "import { Parser, type ParserOptions } from \"./Parser.js\";\n\nexport type { Handler, ParserOptions } from \"./Parser.js\";\nexport { Parser } from \"./Parser.js\";\n\nimport {\n type Document,\n DomHandler,\n type DomHandlerOptions,\n type Element,\n} from \"domhandler\";\n\nexport {\n DomHandler,\n // Old name for DomHandler\n DomHandler as DefaultHandler,\n type DomHandlerOptions,\n} from \"domhandler\";\n\n/**\n * Combined parser and handler options.\n */\nexport type Options = ParserOptions & DomHandlerOptions;\n\n// Helper methods\n\n/**\n * Parses the data, returns the resulting document.\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n */\nexport function parseDocument(data: string, options?: Options): Document {\n const handler = new DomHandler(undefined, options);\n new Parser(handler, options).end(data);\n return handler.root;\n}\n\n/**\n * Creates a parser instance, with an attached DOM handler.\n * @param callback A callback that will be called once parsing has been completed, with the resulting document.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nexport function createDocumentStream(\n callback: (error: Error | null, document: Document) => void,\n options?: Options,\n elementCallback?: (element: Element) => void,\n): Parser {\n const handler: DomHandler = new DomHandler(\n (error: Error | null) => callback(error, handler.root),\n options,\n elementCallback,\n );\n return new Parser(handler, options);\n}\n\n/*\n * All of the following exports exist for backwards-compatibility.\n * They should probably be removed eventually.\n */\nexport * as ElementType from \"domelementtype\";\nexport {\n type Callbacks as TokenizerCallbacks,\n default as Tokenizer,\n QuoteType,\n} from \"./Tokenizer.js\";\n\nimport { type Feed, getFeed } from \"domutils\";\n\nexport { type Feed, getFeed } from \"domutils\";\n\nconst parseFeedDefaultOptions = { xmlMode: true };\n\n/**\n * Parse a feed.\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`.\n */\nexport function parseFeed(\n feed: string,\n options: Options = parseFeedDefaultOptions,\n): Feed | null {\n return getFeed(parseDocument(feed, options).children);\n}\n\nexport * as DomUtils from \"domutils\";\n", "'use strict';\n\nmodule.exports = string => {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it\u2019s always valid, and a \\unnnn escape when the simpler form would be disallowed by Unicode patterns\u2019 stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n};\n", "'use strict';\n\n/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nfunction isPlainObject(o) {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n\nexports.isPlainObject = isPlainObject;\n", "/**\n * Srcset Parser\n *\n * By Alex Bell | MIT License\n *\n * JS Parser for the string value that appears in markup <img srcset=\"here\">\n *\n * @returns Array [{url: _, d: _, w: _, h:_}, ...]\n *\n * Based super duper closely on the reference algorithm at:\n * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute\n *\n * Most comments are copied in directly from the spec\n * (except for comments in parens).\n */\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], factory);\n\t} else if (typeof module === 'object' && module.exports) {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like environments that support module.exports,\n\t\t// like Node.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.parseSrcset = factory();\n\t}\n}(this, function () {\n\n\t// 1. Let input be the value passed to this algorithm.\n\treturn function (input) {\n\n\t\t// UTILITY FUNCTIONS\n\n\t\t// Manual is faster than RegEx\n\t\t// http://bjorn.tipling.com/state-and-regular-expressions-in-javascript\n\t\t// http://jsperf.com/whitespace-character/5\n\t\tfunction isSpace(c) {\n\t\t\treturn (c === \"\\u0020\" || // space\n\t\t\tc === \"\\u0009\" || // horizontal tab\n\t\t\tc === \"\\u000A\" || // new line\n\t\t\tc === \"\\u000C\" || // form feed\n\t\t\tc === \"\\u000D\"); // carriage return\n\t\t}\n\n\t\tfunction collectCharacters(regEx) {\n\t\t\tvar chars,\n\t\t\t\tmatch = regEx.exec(input.substring(pos));\n\t\t\tif (match) {\n\t\t\t\tchars = match[ 0 ];\n\t\t\t\tpos += chars.length;\n\t\t\t\treturn chars;\n\t\t\t}\n\t\t}\n\n\t\tvar inputLength = input.length,\n\n\t\t\t// (Don't use \\s, to avoid matching non-breaking space)\n\t\t\tregexLeadingSpaces = /^[ \\t\\n\\r\\u000c]+/,\n\t\t\tregexLeadingCommasOrSpaces = /^[, \\t\\n\\r\\u000c]+/,\n\t\t\tregexLeadingNotSpaces = /^[^ \\t\\n\\r\\u000c]+/,\n\t\t\tregexTrailingCommas = /[,]+$/,\n\t\t\tregexNonNegativeInteger = /^\\d+$/,\n\n\t\t\t// ( Positive or negative or unsigned integers or decimals, without or without exponents.\n\t\t\t// Must include at least one digit.\n\t\t\t// According to spec tests any decimal point must be followed by a digit.\n\t\t\t// No leading plus sign is allowed.)\n\t\t\t// https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number\n\t\t\tregexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,\n\n\t\t\turl,\n\t\t\tdescriptors,\n\t\t\tcurrentDescriptor,\n\t\t\tstate,\n\t\t\tc,\n\n\t\t\t// 2. Let position be a pointer into input, initially pointing at the start\n\t\t\t// of the string.\n\t\t\tpos = 0,\n\n\t\t\t// 3. Let candidates be an initially empty source set.\n\t\t\tcandidates = [];\n\n\t\t// 4. Splitting loop: Collect a sequence of characters that are space\n\t\t// characters or U+002C COMMA characters. If any U+002C COMMA characters\n\t\t// were collected, that is a parse error.\n\t\twhile (true) {\n\t\t\tcollectCharacters(regexLeadingCommasOrSpaces);\n\n\t\t\t// 5. If position is past the end of input, return candidates and abort these steps.\n\t\t\tif (pos >= inputLength) {\n\t\t\t\treturn candidates; // (we're done, this is the sole return path)\n\t\t\t}\n\n\t\t\t// 6. Collect a sequence of characters that are not space characters,\n\t\t\t// and let that be url.\n\t\t\turl = collectCharacters(regexLeadingNotSpaces);\n\n\t\t\t// 7. Let descriptors be a new empty list.\n\t\t\tdescriptors = [];\n\n\t\t\t// 8. If url ends with a U+002C COMMA character (,), follow these substeps:\n\t\t\t//\t\t(1). Remove all trailing U+002C COMMA characters from url. If this removed\n\t\t\t// more than one character, that is a parse error.\n\t\t\tif (url.slice(-1) === \",\") {\n\t\t\t\turl = url.replace(regexTrailingCommas, \"\");\n\t\t\t\t// (Jump ahead to step 9 to skip tokenization and just push the candidate).\n\t\t\t\tparseDescriptors();\n\n\t\t\t\t//\tOtherwise, follow these substeps:\n\t\t\t} else {\n\t\t\t\ttokenize();\n\t\t\t} // (close else of step 8)\n\n\t\t\t// 16. Return to the step labeled splitting loop.\n\t\t} // (Close of big while loop.)\n\n\t\t/**\n\t\t * Tokenizes descriptor properties prior to parsing\n\t\t * Returns undefined.\n\t\t */\n\t\tfunction tokenize() {\n\n\t\t\t// 8.1. Descriptor tokeniser: Skip whitespace\n\t\t\tcollectCharacters(regexLeadingSpaces);\n\n\t\t\t// 8.2. Let current descriptor be the empty string.\n\t\t\tcurrentDescriptor = \"\";\n\n\t\t\t// 8.3. Let state be in descriptor.\n\t\t\tstate = \"in descriptor\";\n\n\t\t\twhile (true) {\n\n\t\t\t\t// 8.4. Let c be the character at position.\n\t\t\t\tc = input.charAt(pos);\n\n\t\t\t\t// Do the following depending on the value of state.\n\t\t\t\t// For the purpose of this step, \"EOF\" is a special character representing\n\t\t\t\t// that position is past the end of input.\n\n\t\t\t\t// In descriptor\n\t\t\t\tif (state === \"in descriptor\") {\n\t\t\t\t\t// Do the following, depending on the value of c:\n\n\t\t\t\t\t// Space character\n\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t// descriptors and let current descriptor be the empty string.\n\t\t\t\t\t// Set state to after descriptor.\n\t\t\t\t\tif (isSpace(c)) {\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t\tcurrentDescriptor = \"\";\n\t\t\t\t\t\t\tstate = \"after descriptor\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// U+002C COMMA (,)\n\t\t\t\t\t\t// Advance position to the next character in input. If current descriptor\n\t\t\t\t\t\t// is not empty, append current descriptor to descriptors. Jump to the step\n\t\t\t\t\t\t// labeled descriptor parser.\n\t\t\t\t\t} else if (c === \",\") {\n\t\t\t\t\t\tpos += 1;\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// U+0028 LEFT PARENTHESIS (()\n\t\t\t\t\t\t// Append c to current descriptor. Set state to in parens.\n\t\t\t\t\t} else if (c === \"\\u0028\") {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t\tstate = \"in parens\";\n\n\t\t\t\t\t\t// EOF\n\t\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t\t// descriptors. Jump to the step labeled descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t}\n\t\t\t\t\t// (end \"in descriptor\"\n\n\t\t\t\t\t// In parens\n\t\t\t\t} else if (state === \"in parens\") {\n\n\t\t\t\t\t// U+0029 RIGHT PARENTHESIS ())\n\t\t\t\t\t// Append c to current descriptor. Set state to in descriptor.\n\t\t\t\t\tif (c === \")\") {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t\tstate = \"in descriptor\";\n\n\t\t\t\t\t\t// EOF\n\t\t\t\t\t\t// Append current descriptor to descriptors. Jump to the step labeled\n\t\t\t\t\t\t// descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t}\n\n\t\t\t\t\t// After descriptor\n\t\t\t\t} else if (state === \"after descriptor\") {\n\n\t\t\t\t\t// Do the following, depending on the value of c:\n\t\t\t\t\t// Space character: Stay in this state.\n\t\t\t\t\tif (isSpace(c)) {\n\n\t\t\t\t\t\t// EOF: Jump to the step labeled descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Set state to in descriptor. Set position to the previous character in input.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = \"in descriptor\";\n\t\t\t\t\t\tpos -= 1;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Advance position to the next character in input.\n\t\t\t\tpos += 1;\n\n\t\t\t\t// Repeat this step.\n\t\t\t} // (close while true loop)\n\t\t}\n\n\t\t/**\n\t\t * Adds descriptor properties to a candidate, pushes to the candidates array\n\t\t * @return undefined\n\t\t */\n\t\t// Declared outside of the while loop so that it's only created once.\n\t\tfunction parseDescriptors() {\n\n\t\t\t// 9. Descriptor parser: Let error be no.\n\t\t\tvar pError = false,\n\n\t\t\t\t// 10. Let width be absent.\n\t\t\t\t// 11. Let density be absent.\n\t\t\t\t// 12. Let future-compat-h be absent. (We're implementing it now as h)\n\t\t\t\tw, d, h, i,\n\t\t\t\tcandidate = {},\n\t\t\t\tdesc, lastChar, value, intVal, floatVal;\n\n\t\t\t// 13. For each descriptor in descriptors, run the appropriate set of steps\n\t\t\t// from the following list:\n\t\t\tfor (i = 0 ; i < descriptors.length; i++) {\n\t\t\t\tdesc = descriptors[ i ];\n\n\t\t\t\tlastChar = desc[ desc.length - 1 ];\n\t\t\t\tvalue = desc.substring(0, desc.length - 1);\n\t\t\t\tintVal = parseInt(value, 10);\n\t\t\t\tfloatVal = parseFloat(value);\n\n\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t// a U+0077 LATIN SMALL LETTER W character\n\t\t\t\tif (regexNonNegativeInteger.test(value) && (lastChar === \"w\")) {\n\n\t\t\t\t\t// If width and density are not both absent, then let error be yes.\n\t\t\t\t\tif (w || d) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t\t// If the result is zero, let error be yes.\n\t\t\t\t\t// Otherwise, let width be the result.\n\t\t\t\t\tif (intVal === 0) {pError = true;} else {w = intVal;}\n\n\t\t\t\t\t// If the descriptor consists of a valid floating-point number followed by\n\t\t\t\t\t// a U+0078 LATIN SMALL LETTER X character\n\t\t\t\t} else if (regexFloatingPoint.test(value) && (lastChar === \"x\")) {\n\n\t\t\t\t\t// If width, density and future-compat-h are not all absent, then let error\n\t\t\t\t\t// be yes.\n\t\t\t\t\tif (w || d || h) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing floating-point number values to the descriptor.\n\t\t\t\t\t// If the result is less than zero, let error be yes. Otherwise, let density\n\t\t\t\t\t// be the result.\n\t\t\t\t\tif (floatVal < 0) {pError = true;} else {d = floatVal;}\n\n\t\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t\t// a U+0068 LATIN SMALL LETTER H character\n\t\t\t\t} else if (regexNonNegativeInteger.test(value) && (lastChar === \"h\")) {\n\n\t\t\t\t\t// If height and density are not both absent, then let error be yes.\n\t\t\t\t\tif (h || d) {pError = true;}\n\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t\t// If the result is zero, let error be yes. Otherwise, let future-compat-h\n\t\t\t\t\t// be the result.\n\t\t\t\t\tif (intVal === 0) {pError = true;} else {h = intVal;}\n\n\t\t\t\t\t// Anything else, Let error be yes.\n\t\t\t\t} else {pError = true;}\n\t\t\t} // (close step 13 for loop)\n\n\t\t\t// 15. If error is still no, then append a new image source to candidates whose\n\t\t\t// URL is url, associated with a width width if not absent and a pixel\n\t\t\t// density density if not absent. Otherwise, there is a parse error.\n\t\t\tif (!pError) {\n\t\t\t\tcandidate.url = url;\n\t\t\t\tif (w) { candidate.w = w;}\n\t\t\t\tif (d) { candidate.d = d;}\n\t\t\t\tif (h) { candidate.h = h;}\n\t\t\t\tcandidates.push(candidate);\n\t\t\t} else if (console && console.log) {\n\t\t\t\tconsole.log(\"Invalid srcset descriptor found in '\" +\n\t\t\t\t\tinput + \"' at '\" + desc + \"'.\");\n\t\t\t}\n\t\t} // (close parseDescriptors fn)\n\n\t}\n}));\n", "var x=String;\nvar create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x,blackBright:x,redBright:x,greenBright:x,yellowBright:x,blueBright:x,magentaBright:x,cyanBright:x,whiteBright:x,bgBlackBright:x,bgRedBright:x,bgGreenBright:x,bgYellowBright:x,bgBlueBright:x,bgMagentaBright:x,bgCyanBright:x,bgWhiteBright:x}};\nmodule.exports=create();\nmodule.exports.createColors = create;\n", "'use strict'\n\nlet pico = require('picocolors')\n\nlet terminalHighlight = require('./terminal-highlight')\n\nclass CssSyntaxError extends Error {\n constructor(message, line, column, source, file, plugin) {\n super(message)\n this.name = 'CssSyntaxError'\n this.reason = message\n\n if (file) {\n this.file = file\n }\n if (source) {\n this.source = source\n }\n if (plugin) {\n this.plugin = plugin\n }\n if (typeof line !== 'undefined' && typeof column !== 'undefined') {\n if (typeof line === 'number') {\n this.line = line\n this.column = column\n } else {\n this.line = line.line\n this.column = line.column\n this.endLine = column.line\n this.endColumn = column.column\n }\n }\n\n this.setMessage()\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CssSyntaxError)\n }\n }\n\n setMessage() {\n this.message = this.plugin ? this.plugin + ': ' : ''\n this.message += this.file ? this.file : '<css input>'\n if (typeof this.line !== 'undefined') {\n this.message += ':' + this.line + ':' + this.column\n }\n this.message += ': ' + this.reason\n }\n\n showSourceCode(color) {\n if (!this.source) return ''\n\n let css = this.source\n if (color == null) color = pico.isColorSupported\n\n let aside = text => text\n let mark = text => text\n let highlight = text => text\n if (color) {\n let { bold, gray, red } = pico.createColors(true)\n mark = text => bold(red(text))\n aside = text => gray(text)\n if (terminalHighlight) {\n highlight = text => terminalHighlight(text)\n }\n }\n\n let lines = css.split(/\\r?\\n/)\n let start = Math.max(this.line - 3, 0)\n let end = Math.min(this.line + 2, lines.length)\n let maxWidth = String(end).length\n\n return lines\n .slice(start, end)\n .map((line, index) => {\n let number = start + 1 + index\n let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '\n if (number === this.line) {\n if (line.length > 160) {\n let padding = 20\n let subLineStart = Math.max(0, this.column - padding)\n let subLineEnd = Math.max(\n this.column + padding,\n this.endColumn + padding\n )\n let subLine = line.slice(subLineStart, subLineEnd)\n\n let spacing =\n aside(gutter.replace(/\\d/g, ' ')) +\n line\n .slice(0, Math.min(this.column - 1, padding - 1))\n .replace(/[^\\t]/g, ' ')\n\n return (\n mark('>') +\n aside(gutter) +\n highlight(subLine) +\n '\\n ' +\n spacing +\n mark('^')\n )\n }\n\n let spacing =\n aside(gutter.replace(/\\d/g, ' ')) +\n line.slice(0, this.column - 1).replace(/[^\\t]/g, ' ')\n\n return (\n mark('>') +\n aside(gutter) +\n highlight(line) +\n '\\n ' +\n spacing +\n mark('^')\n )\n }\n\n return ' ' + aside(gutter) + highlight(line)\n })\n .join('\\n')\n }\n\n toString() {\n let code = this.showSourceCode()\n if (code) {\n code = '\\n\\n' + code + '\\n'\n }\n return this.name + ': ' + this.message + code\n }\n}\n\nmodule.exports = CssSyntaxError\nCssSyntaxError.default = CssSyntaxError\n", "'use strict'\n\n// Characters that end an at-rule name, mirroring RE_AT_END in the tokenizer.\n// Params starting with anything else need a space to stay separate tokens.\nconst AT_NAME_END = /[\\t\\n\\f\\r \"#'()/;[\\\\\\]{}]/\n\nconst DEFAULT_RAW = {\n after: '\\n',\n beforeClose: '\\n',\n beforeComment: '\\n',\n beforeDecl: '\\n',\n beforeOpen: ' ',\n beforeRule: '\\n',\n colon: ': ',\n commentLeft: ' ',\n commentRight: ' ',\n emptyBody: '',\n indent: ' ',\n semicolon: false\n}\n\nfunction capitalize(str) {\n return str[0].toUpperCase() + str.slice(1)\n}\n\nfunction atruleStart(str, node) {\n let name = '@' + node.name\n let params = node.params ? str.rawValue(node, 'params') : ''\n let afterName = node.raws.afterName\n\n if (typeof afterName === 'undefined') {\n afterName = params ? ' ' : ''\n } else if (afterName === '' && params && !AT_NAME_END.test(params[0])) {\n afterName = ' '\n }\n\n return name + afterName + params\n}\n\n// `*--x` is not a custom property: the parser checks the first token, and the\n// `*`/`_` hack prefix moves from `prop` into `before` only after that. A free\n// semicolon in front of the declaration also ends up in `before`.\nfunction isCustomProperty(node) {\n if (!node.prop.startsWith('--')) return false\n let before = node.raws.before\n return typeof before === 'undefined' || !/[^\\s;]$/.test(before)\n}\n\nfunction pushBody(str, stack, node) {\n let nodes = node.nodes\n let last = nodes.length - 1\n while (last > 0) {\n if (nodes[last].type !== 'comment') break\n last -= 1\n }\n\n let semicolon = str.raw(node, 'semicolon')\n let isDocument = node.type === 'document'\n for (let i = nodes.length - 1; i >= 0; i--) {\n let child = nodes[i]\n let childSemicolon = last !== i || semicolon\n // A childless at-rule or a custom property declaration that still has\n // following siblings must be terminated. Without the semicolon those\n // trailing comments are folded into the at-rule's prelude or the custom\n // property's value and disappear when the output is re-parsed.\n if (\n !childSemicolon &&\n i < nodes.length - 1 &&\n ((child.type === 'atrule' && !child.nodes) ||\n (child.type === 'decl' && isCustomProperty(child)))\n ) {\n childSemicolon = true\n }\n stack.push({\n document: isDocument,\n node: child,\n semicolon: childSemicolon\n })\n }\n}\n\nfunction pushBlock(str, stack, node, start) {\n let between = str.raw(node, 'between', 'beforeOpen')\n str.builder(start + between + '{', node, 'start')\n\n let hasNodes = node.nodes && node.nodes.length\n let close = () => {\n let after = hasNodes\n ? str.raw(node, 'after')\n : str.raw(node, 'after', 'emptyBody')\n if (after) str.builder(after)\n str.builder('}', node, 'end')\n if (node.type === 'rule' && node.raws.ownSemicolon) {\n str.builder(node.raws.ownSemicolon, node, 'end')\n }\n }\n\n if (hasNodes) {\n stack.push(close)\n pushBody(str, stack, node)\n } else {\n close()\n }\n}\n\nclass Stringifier {\n constructor(builder) {\n this.builder = builder\n }\n\n atrule(node, semicolon) {\n let start = atruleStart(this, node)\n if (node.nodes) {\n this.block(node, start)\n } else {\n let end = (node.raws.between || '') + (semicolon ? ';' : '')\n this.builder(start + end, node)\n }\n }\n\n beforeAfter(node, detect) {\n let value\n if (node.type === 'decl') {\n value = this.raw(node, null, 'beforeDecl')\n } else if (node.type === 'comment') {\n value = this.raw(node, null, 'beforeComment')\n } else if (detect === 'before') {\n value = this.raw(node, null, 'beforeRule')\n } else {\n value = this.raw(node, null, 'beforeClose')\n }\n\n let buf = node.parent\n let depth = 0\n while (buf && buf.type !== 'root') {\n depth += 1\n buf = buf.parent\n }\n\n if (value.includes('\\n')) {\n let indent = this.raw(node, null, 'indent')\n if (indent.length) {\n for (let step = 0; step < depth; step++) value += indent\n }\n }\n\n return value\n }\n\n block(node, start) {\n let between = this.raw(node, 'between', 'beforeOpen')\n this.builder(start + between + '{', node, 'start')\n\n let after\n if (node.nodes && node.nodes.length) {\n this.body(node)\n after = this.raw(node, 'after')\n } else {\n after = this.raw(node, 'after', 'emptyBody')\n }\n\n if (after) this.builder(after)\n this.builder('}', node, 'end')\n }\n\n body(node) {\n // Rules and at-rules are expanded into an explicit stack instead of\n // recursive `stringify()` calls to survive deeply nested trees.\n // If a subclass changes the traversal methods, its children go\n // through `stringify()` to keep the override in charge.\n let proto = Stringifier.prototype\n let expandable = ['atrule', 'block', 'body', 'rule', 'stringify'].every(\n method => this[method] === proto[method]\n )\n\n let stack = []\n pushBody(this, stack, node)\n\n while (stack.length > 0) {\n let entry = stack.pop()\n if (typeof entry === 'function') {\n entry()\n continue\n }\n\n let child = entry.node\n let before = this.raw(child, 'before')\n if (before) {\n this.builder(before)\n }\n\n if (expandable && child.type === 'rule') {\n pushBlock(this, stack, child, this.rawValue(child, 'selector'))\n } else if (expandable && child.type === 'atrule' && child.nodes) {\n pushBlock(this, stack, child, atruleStart(this, child))\n } else {\n this.stringify(child, entry.semicolon)\n }\n }\n }\n\n comment(node) {\n let left = this.raw(node, 'left', 'commentLeft')\n let right = this.raw(node, 'right', 'commentRight')\n this.builder('/*' + left + node.text + right + '*/', node)\n }\n\n decl(node, semicolon) {\n let raws = node.raws\n let between = this.raw(node, 'between', 'colon')\n\n let string = node.prop + between + this.rawValue(node, 'value')\n\n if (node.important) {\n string += raws.important || ' !important'\n }\n\n if (semicolon) string += ';'\n this.builder(string, node)\n }\n\n document(node) {\n this.body(node)\n }\n\n raw(node, own, detect) {\n let value\n if (!detect) detect = own\n\n // Already had\n if (own) {\n value = node.raws[own]\n if (typeof value !== 'undefined') return value\n }\n\n let parent = node.parent\n\n if (detect === 'before') {\n // Hack for first rule in CSS\n if (!parent || (parent.type === 'root' && parent.first === node)) {\n return ''\n }\n\n // `root` nodes in `document` should use only their own raws\n if (parent && parent.type === 'document') {\n return ''\n }\n }\n\n // Floating child without parent\n if (!parent) return DEFAULT_RAW[detect]\n\n // Detect style by other nodes\n let root = node.root()\n let cache = root.rawCache || (root.rawCache = {})\n if (typeof cache[detect] !== 'undefined') {\n return cache[detect]\n }\n\n if (detect === 'before' || detect === 'after') {\n return this.beforeAfter(node, detect)\n } else {\n let method = 'raw' + capitalize(detect)\n if (this[method]) {\n value = this[method](root, node)\n } else {\n root.walk(i => {\n value = i.raws[own]\n if (typeof value !== 'undefined') return false\n })\n }\n }\n\n if (typeof value === 'undefined') value = DEFAULT_RAW[detect]\n\n cache[detect] = value\n return value\n }\n\n rawBeforeClose(root) {\n let value\n root.walk(i => {\n if (i.nodes && i.nodes.length > 0) {\n if (typeof i.raws.after !== 'undefined') {\n value = i.raws.after\n if (value.includes('\\n')) {\n value = value.replace(/[^\\n]+$/, '')\n }\n return false\n }\n }\n })\n if (value) value = value.replace(/\\S/g, '')\n return value\n }\n\n rawBeforeComment(root, node) {\n let value\n root.walkComments(i => {\n if (typeof i.raws.before !== 'undefined') {\n value = i.raws.before\n if (value.includes('\\n')) {\n value = value.replace(/[^\\n]+$/, '')\n }\n return false\n }\n })\n if (typeof value === 'undefined') {\n value = this.raw(node, null, 'beforeDecl')\n } else if (value) {\n value = value.replace(/\\S/g, '')\n }\n return value\n }\n\n rawBeforeDecl(root, node) {\n let value\n root.walkDecls(i => {\n if (typeof i.raws.before !== 'undefined') {\n value = i.raws.before\n if (value.includes('\\n')) {\n value = value.replace(/[^\\n]+$/, '')\n }\n return false\n }\n })\n if (typeof value === 'undefined') {\n value = this.raw(node, null, 'beforeRule')\n } else if (value) {\n value = value.replace(/\\S/g, '')\n }\n return value\n }\n\n rawBeforeOpen(root) {\n let value\n root.walk(i => {\n if (i.type !== 'decl') {\n value = i.raws.between\n if (typeof value !== 'undefined') return false\n }\n })\n return value\n }\n\n rawBeforeRule(root) {\n let value\n root.walk(i => {\n if (i.nodes && (i.parent !== root || root.first !== i)) {\n if (typeof i.raws.before !== 'undefined') {\n value = i.raws.before\n if (value.includes('\\n')) {\n value = value.replace(/[^\\n]+$/, '')\n }\n return false\n }\n }\n })\n if (value) value = value.replace(/\\S/g, '')\n return value\n }\n\n rawColon(root) {\n let value\n root.walkDecls(i => {\n if (typeof i.raws.between !== 'undefined') {\n value = i.raws.between.replace(/[^\\s:]/g, '')\n return false\n }\n })\n return value\n }\n\n rawEmptyBody(root) {\n let value\n root.walk(i => {\n if (i.nodes && i.nodes.length === 0) {\n value = i.raws.after\n if (typeof value !== 'undefined') return false\n }\n })\n return value\n }\n\n rawIndent(root) {\n if (root.raws.indent) return root.raws.indent\n let value\n root.walk(i => {\n let p = i.parent\n if (p && p !== root && p.parent && p.parent === root) {\n if (typeof i.raws.before !== 'undefined') {\n let parts = i.raws.before.split('\\n')\n value = parts[parts.length - 1]\n value = value.replace(/\\S/g, '')\n return false\n }\n }\n })\n return value\n }\n\n rawSemicolon(root) {\n let value\n root.walk(i => {\n if (i.nodes && i.nodes.length && i.last.type === 'decl') {\n value = i.raws.semicolon\n if (typeof value !== 'undefined') return false\n }\n })\n return value\n }\n\n rawValue(node, prop) {\n let value = node[prop]\n let raw = node.raws[prop]\n if (raw && raw.value === value) {\n return raw.raw\n }\n\n return value\n }\n\n root(node) {\n let inDocument = node.parent && node.parent.type === 'document'\n if (!inDocument && node.source && node.source.input.hasBOM) {\n this.builder('\\uFEFF', node, 'start')\n }\n this.body(node)\n if (node.raws.after) {\n this.builder(node.raws.after)\n }\n }\n\n rule(node) {\n this.block(node, this.rawValue(node, 'selector'))\n if (node.raws.ownSemicolon) {\n this.builder(node.raws.ownSemicolon, node, 'end')\n }\n }\n\n stringify(node, semicolon) {\n /* c8 ignore start */\n if (!this[node.type]) {\n throw new Error(\n 'Unknown AST node type ' +\n node.type +\n '. ' +\n 'Maybe you need to change PostCSS stringifier.'\n )\n }\n /* c8 ignore stop */\n this[node.type](node, semicolon)\n }\n}\n\nmodule.exports = Stringifier\nStringifier.default = Stringifier\n", "'use strict'\n\nlet Stringifier = require('./stringifier')\n\nconst STYLE_TAG = /(<)(\\/?style\\b)/gi\nconst COMMENT_OPEN = /(<)(!--)/g\n\nfunction escapeHTMLInCSS(str) {\n if (!str.includes('<')) return str\n return str.replace(STYLE_TAG, '\\\\3c $2').replace(COMMENT_OPEN, '\\\\3c $2')\n}\n\nclass SafeStringifier extends Stringifier {\n escapeHTML(node, print) {\n let builder = this.builder\n let chunks, css\n this.builder = (str, child, type) => {\n if (chunks) {\n css += str\n chunks.push(str, child, type)\n } else if (str.includes('<')) {\n // Dangerous sequences start with `<`, so everything before\n // the first `<` is safe to pass through. The rest is buffered\n // to escape it as a whole.\n css = str\n chunks = [str, child, type]\n } else {\n builder(str, child, type)\n }\n }\n print()\n this.builder = builder\n if (!chunks) return\n\n let escaped = escapeHTMLInCSS(css)\n if (escaped === css) {\n // Keep the chunks to get a precise source map\n for (let i = 0; i < chunks.length; i += 3) {\n builder(chunks[i], chunks[i + 1], chunks[i + 2])\n }\n } else {\n // Escaping happens only on a hack attempt, source map is not important\n builder(escaped, node)\n }\n }\n\n root(node) {\n if (node.parent && node.parent.type === 'document') {\n // Document raws around the Root hold markup and are kept as is since CSS in Document can be marked with <style>\n this.escapeHTML(node, () => this.body(node))\n if (node.raws.after) this.builder(node.raws.after)\n } else {\n this.escapeHTML(node, () => super.root(node))\n }\n }\n}\n\nfunction stringify(node, builder) {\n let str = new SafeStringifier(builder)\n // Root escapes its own output and keeps markup in Document raws\n if (node.type === 'root' || node.type === 'document') {\n str.stringify(node)\n } else {\n str.escapeHTML(node, () => str.stringify(node))\n }\n}\n\nmodule.exports = stringify\nstringify.default = stringify\n", "'use strict'\n\nmodule.exports.isClean = Symbol('isClean')\n\nmodule.exports.my = Symbol('my')\n", "'use strict'\n\nlet CssSyntaxError = require('./css-syntax-error')\nlet Stringifier = require('./stringifier')\nlet stringify = require('./stringify')\nlet { isClean, my } = require('./symbols')\n\nfunction cloneNode(obj, parent) {\n let cloned = new obj.constructor()\n // An explicit stack instead of recursive calls to survive deeply\n // nested trees. Each entry is [source, its clone, clone's parent].\n let stack = [[obj, cloned, parent]]\n\n while (stack.length > 0) {\n let [source, target, targetParent] = stack.pop()\n for (let i in source) {\n if (!Object.prototype.hasOwnProperty.call(source, i)) {\n /* c8 ignore next 2 */\n continue\n }\n if (i === 'proxyCache') continue\n let value = source[i]\n let type = typeof value\n\n if (i === 'parent' && type === 'object') {\n if (targetParent) target[i] = targetParent\n } else if (i === 'source') {\n target[i] = value\n } else if (Array.isArray(value)) {\n let children = []\n target[i] = children\n for (let j of value) {\n let childClone = new j.constructor()\n children.push(childClone)\n stack.push([j, childClone, target])\n }\n } else {\n if (type === 'object' && value !== null) {\n let valueClone = new value.constructor()\n stack.push([value, valueClone, undefined])\n value = valueClone\n }\n target[i] = value\n }\n }\n }\n\n return cloned\n}\n\nfunction sourceOffset(inputCSS, position) {\n // Not all custom syntaxes support `offset` in `source.start` and `source.end`\n if (position && typeof position.offset !== 'undefined') {\n return position.offset\n }\n\n let column = 1\n let line = 1\n let offset = 0\n\n for (let i = 0; i < inputCSS.length; i++) {\n if (line === position.line && column === position.column) {\n offset = i\n break\n }\n\n if (inputCSS[i] === '\\n') {\n column = 1\n line += 1\n } else {\n column += 1\n }\n }\n\n return offset\n}\n\nclass Node {\n get proxyOf() {\n return this\n }\n\n constructor(defaults = {}) {\n this.raws = {}\n this[isClean] = false\n this[my] = true\n\n for (let name of Object.keys(defaults)) {\n if (name === '__proto__') continue\n if (name === 'nodes') {\n this.nodes = []\n for (let node of defaults[name]) {\n // Clone only nodes that already belong to another tree, so passing a\n // freshly created (parent-less) node adopts that instance instead of\n // a copy and keeps the caller's reference usable. See #1987.\n if (typeof node.clone === 'function' && node.parent) {\n this.append(node.clone())\n } else {\n this.append(node)\n }\n }\n } else {\n this[name] = defaults[name]\n }\n }\n }\n\n addToError(error) {\n error.postcssNode = this\n if (error.stack && this.source && /\\n\\s{4}at /.test(error.stack)) {\n let s = this.source\n error.stack = error.stack.replace(\n /\\n\\s{4}at /,\n `$&${s.input.from}:${s.start.line}:${s.start.column}$&`\n )\n }\n return error\n }\n\n after(add) {\n this.parent.insertAfter(this, add)\n return this\n }\n\n assign(overrides = {}) {\n for (let name in overrides) {\n this[name] = overrides[name]\n }\n return this\n }\n\n before(add) {\n this.parent.insertBefore(this, add)\n return this\n }\n\n cleanRaws(keepBetween) {\n delete this.raws.before\n delete this.raws.after\n if (!keepBetween) delete this.raws.between\n }\n\n clone(overrides = {}) {\n let cloned = cloneNode(this)\n for (let name in overrides) {\n cloned[name] = overrides[name]\n }\n return cloned\n }\n\n cloneAfter(overrides = {}) {\n let cloned = this.clone(overrides)\n this.parent.insertAfter(this, cloned)\n return cloned\n }\n\n cloneBefore(overrides = {}) {\n let cloned = this.clone(overrides)\n this.parent.insertBefore(this, cloned)\n return cloned\n }\n\n error(message, opts = {}) {\n if (this.source) {\n let { end, start } = this.rangeBy(opts)\n return this.source.input.error(\n message,\n { column: start.column, line: start.line },\n { column: end.column, line: end.line },\n opts\n )\n }\n return new CssSyntaxError(message)\n }\n\n getProxyProcessor() {\n return {\n get(node, prop) {\n if (prop === 'proxyOf') {\n return node\n } else if (prop === 'root') {\n return () => node.root().toProxy()\n } else {\n return node[prop]\n }\n },\n\n set(node, prop, value) {\n if (node[prop] === value) return true\n node[prop] = value\n if (\n prop === 'prop' ||\n prop === 'value' ||\n prop === 'name' ||\n prop === 'params' ||\n prop === 'important' ||\n /* c8 ignore next */\n prop === 'text'\n ) {\n node.markDirty()\n }\n return true\n }\n }\n }\n\n /* c8 ignore next 3 */\n markClean() {\n this[isClean] = true\n }\n\n markDirty() {\n if (this[isClean]) {\n this[isClean] = false\n let next = this\n while ((next = next.parent)) {\n next[isClean] = false\n }\n }\n }\n\n next() {\n if (!this.parent) return undefined\n let index = this.parent.index(this)\n return this.parent.nodes[index + 1]\n }\n\n positionBy(opts = {}) {\n let inputString =\n 'document' in this.source.input\n ? this.source.input.document\n : this.source.input.css\n let pos = {\n column: this.source.start.column,\n line: this.source.start.line,\n offset: sourceOffset(inputString, this.source.start)\n }\n if (opts.index) {\n pos = this.positionInside(opts.index)\n } else if (opts.word) {\n let stringRepresentation = inputString.slice(\n sourceOffset(inputString, this.source.start),\n sourceOffset(inputString, this.source.end)\n )\n let index = stringRepresentation.indexOf(opts.word)\n if (index !== -1) pos = this.positionInside(index)\n }\n return pos\n }\n\n positionInside(index) {\n let column = this.source.start.column\n let line = this.source.start.line\n let inputString =\n 'document' in this.source.input\n ? this.source.input.document\n : this.source.input.css\n let offset = sourceOffset(inputString, this.source.start)\n let end = offset + index\n\n for (let i = offset; i < end; i++) {\n if (inputString[i] === '\\n') {\n column = 1\n line += 1\n } else {\n column += 1\n }\n }\n\n return { column, line, offset: end }\n }\n\n prev() {\n if (!this.parent) return undefined\n let index = this.parent.index(this)\n return this.parent.nodes[index - 1]\n }\n\n rangeBy(opts = {}) {\n let inputString =\n 'document' in this.source.input\n ? this.source.input.document\n : this.source.input.css\n let start = {\n column: this.source.start.column,\n line: this.source.start.line,\n offset: sourceOffset(inputString, this.source.start)\n }\n let end = this.source.end\n ? {\n column: this.source.end.column + 1,\n line: this.source.end.line,\n offset:\n typeof this.source.end.offset === 'number'\n ? // `source.end.offset` is exclusive, so we don't need to add 1\n this.source.end.offset\n : // Since line/column in this.source.end is inclusive,\n // the `sourceOffset(... , this.source.end)` returns an inclusive offset.\n // So, we add 1 to convert it to exclusive.\n sourceOffset(inputString, this.source.end) + 1\n }\n : {\n column: start.column + 1,\n line: start.line,\n offset: start.offset + 1\n }\n\n if (opts.word) {\n let stringRepresentation = inputString.slice(\n sourceOffset(inputString, this.source.start),\n sourceOffset(inputString, this.source.end)\n )\n let index = stringRepresentation.indexOf(opts.word)\n if (index !== -1) {\n start = this.positionInside(index)\n end = this.positionInside(index + opts.word.length)\n }\n } else {\n if (opts.start) {\n start = {\n column: opts.start.column,\n line: opts.start.line,\n offset: sourceOffset(inputString, opts.start)\n }\n } else if (typeof opts.index === 'number') {\n start = this.positionInside(opts.index)\n }\n\n if (opts.end) {\n end = {\n column: opts.end.column,\n line: opts.end.line,\n offset: sourceOffset(inputString, opts.end)\n }\n } else if (typeof opts.endIndex === 'number') {\n end = this.positionInside(opts.endIndex)\n } else if (typeof opts.index === 'number') {\n end = this.positionInside(opts.index + 1)\n }\n }\n\n if (\n end.line < start.line ||\n (end.line === start.line && end.column <= start.column)\n ) {\n end = {\n column: start.column + 1,\n line: start.line,\n offset: start.offset + 1\n }\n }\n\n return { end, start }\n }\n\n raw(prop, defaultType) {\n let str = new Stringifier()\n return str.raw(this, prop, defaultType)\n }\n\n remove() {\n if (this.parent) {\n this.parent.removeChild(this)\n }\n this.parent = undefined\n return this\n }\n\n replaceWith(...nodes) {\n if (this.parent) {\n let bookmark = this\n let foundSelf = false\n for (let node of nodes) {\n if (node === this) {\n foundSelf = true\n } else if (foundSelf) {\n this.parent.insertAfter(bookmark, node)\n bookmark = node\n } else {\n this.parent.insertBefore(bookmark, node)\n }\n }\n\n if (!foundSelf) {\n this.remove()\n }\n }\n\n return this\n }\n\n root() {\n let result = this\n while (result.parent && result.parent.type !== 'document') {\n result = result.parent\n }\n return result\n }\n\n toJSON(_, inputs) {\n let emitInputs = inputs == null\n inputs = inputs || new Map()\n\n // A worklist instead of recursive `toJSON()` calls to survive deeply\n // nested trees. Each entry converts one node and writes the result\n // into the already converted parent by [holder, key].\n let holderOfRoot = []\n let queue = [[this, holderOfRoot, 0]]\n\n for (let step = 0; step < queue.length; step++) {\n let [node, holder, key] = queue[step]\n let fixed = {}\n holder[key] = fixed\n\n for (let name in node) {\n if (!Object.prototype.hasOwnProperty.call(node, name)) {\n /* c8 ignore next 2 */\n continue\n }\n if (name === 'parent' || name === 'proxyCache') continue\n let value = node[name]\n\n if (Array.isArray(value)) {\n let fixedArray = []\n fixed[name] = fixedArray\n for (let i = 0; i < value.length; i++) {\n let item = value[i]\n if (typeof item === 'object' && item.toJSON) {\n if (item.toJSON === Node.prototype.toJSON) {\n queue.push([item, fixedArray, i])\n } else {\n fixedArray[i] = item.toJSON(null, inputs)\n }\n } else {\n fixedArray[i] = item\n }\n }\n } else if (typeof value === 'object' && value.toJSON) {\n if (value.toJSON === Node.prototype.toJSON) {\n queue.push([value, fixed, name])\n } else {\n fixed[name] = value.toJSON(null, inputs)\n }\n } else if (name === 'source') {\n if (value == null) continue\n let inputId = inputs.get(value.input)\n if (inputId == null) {\n inputId = inputs.size\n inputs.set(value.input, inputId)\n }\n fixed[name] = {\n end: value.end,\n inputId,\n start: value.start\n }\n } else {\n fixed[name] = value\n }\n }\n }\n\n let fixed = holderOfRoot[0]\n if (emitInputs) {\n fixed.inputs = [...inputs.keys()].map(input => input.toJSON())\n }\n\n return fixed\n }\n\n toProxy() {\n if (!this.proxyCache) {\n this.proxyCache = new Proxy(this, this.getProxyProcessor())\n }\n return this.proxyCache\n }\n\n toString(stringifier = stringify) {\n if (stringifier.stringify) stringifier = stringifier.stringify\n let result = ''\n stringifier(this, i => {\n result += i\n })\n return result\n }\n\n warn(result, text, opts = {}) {\n let data = { node: this }\n for (let i in opts) data[i] = opts[i]\n return result.warn(text, data)\n }\n}\n\nmodule.exports = Node\nNode.default = Node\n", "'use strict'\n\nlet Node = require('./node')\n\nclass Comment extends Node {\n constructor(defaults) {\n super(defaults)\n this.type = 'comment'\n }\n}\n\nmodule.exports = Comment\nComment.default = Comment\n", "'use strict'\n\nlet Node = require('./node')\n\nclass Declaration extends Node {\n get variable() {\n return this.prop.startsWith('--') || this.prop[0] === '$'\n }\n\n constructor(defaults) {\n if (\n defaults &&\n typeof defaults.value !== 'undefined' &&\n typeof defaults.value !== 'string'\n ) {\n defaults = { ...defaults, value: String(defaults.value) }\n }\n super(defaults)\n this.type = 'decl'\n }\n}\n\nmodule.exports = Declaration\nDeclaration.default = Declaration\n", "'use strict'\n\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Node = require('./node')\nlet { isClean, my } = require('./symbols')\n\nlet AtRule, parse, Root, Rule\n\nfunction cleanSource(nodes) {\n let stack = nodes.slice()\n while (stack.length > 0) {\n let node = stack.pop()\n delete node.source\n if (node.nodes) {\n node.nodes = node.nodes.slice()\n for (let i of node.nodes) stack.push(i)\n }\n }\n return nodes.slice()\n}\n\nfunction markTreeDirty(node) {\n let stack = [node]\n while (stack.length > 0) {\n let next = stack.pop()\n next[isClean] = false\n if (next.proxyOf.nodes) {\n for (let i of next.proxyOf.nodes) stack.push(i)\n }\n }\n}\n\nclass Container extends Node {\n get first() {\n if (!this.proxyOf.nodes) return undefined\n return this.proxyOf.nodes[0]\n }\n\n get last() {\n if (!this.proxyOf.nodes) return undefined\n return this.proxyOf.nodes[this.proxyOf.nodes.length - 1]\n }\n\n append(...children) {\n for (let child of children) {\n let nodes = this.normalize(child, this.last)\n for (let node of nodes) this.proxyOf.nodes.push(node)\n }\n\n this.markDirty()\n\n return this\n }\n\n cleanRaws(keepBetween) {\n let stack = [this]\n while (stack.length > 0) {\n let node = stack.pop()\n if (node !== this && node.cleanRaws !== Container.prototype.cleanRaws) {\n // Subclass with own logic; let it handle its subtree\n node.cleanRaws(keepBetween)\n continue\n }\n Node.prototype.cleanRaws.call(node, keepBetween)\n if (node.nodes) {\n for (let child of node.nodes) stack.push(child)\n }\n }\n }\n\n each(callback) {\n if (!this.proxyOf.nodes) return undefined\n let iterator = this.getIterator()\n\n let index, result\n while (this.indexes[iterator] < this.proxyOf.nodes.length) {\n index = this.indexes[iterator]\n result = callback(this.proxyOf.nodes[index], index)\n if (result === false) break\n\n this.indexes[iterator] += 1\n }\n\n delete this.indexes[iterator]\n return result\n }\n\n every(condition) {\n return this.nodes.every(condition)\n }\n\n getIterator() {\n if (!this.lastEach) this.lastEach = 0\n if (!this.indexes) this.indexes = {}\n\n this.lastEach += 1\n let iterator = this.lastEach\n this.indexes[iterator] = 0\n\n return iterator\n }\n\n getProxyProcessor() {\n return {\n get(node, prop) {\n if (prop === 'proxyOf') {\n return node\n } else if (!node[prop]) {\n return node[prop]\n } else if (\n prop === 'each' ||\n (typeof prop === 'string' && prop.startsWith('walk'))\n ) {\n return (...args) => {\n return node[prop](\n ...args.map(i => {\n if (typeof i === 'function') {\n return (child, index) => i(child.toProxy(), index)\n } else {\n return i\n }\n })\n )\n }\n } else if (prop === 'every' || prop === 'some') {\n return cb => {\n return node[prop]((child, ...other) =>\n cb(child.toProxy(), ...other)\n )\n }\n } else if (prop === 'root') {\n return () => node.root().toProxy()\n } else if (prop === 'nodes') {\n return node.nodes.map(i => i.toProxy())\n } else if (prop === 'first' || prop === 'last') {\n return node[prop].toProxy()\n } else {\n return node[prop]\n }\n },\n\n set(node, prop, value) {\n if (node[prop] === value) return true\n node[prop] = value\n if (prop === 'name' || prop === 'params' || prop === 'selector') {\n node.markDirty()\n }\n return true\n }\n }\n }\n\n index(child) {\n if (typeof child === 'number') return child\n if (child.proxyOf) child = child.proxyOf\n return this.proxyOf.nodes.indexOf(child)\n }\n\n insertAfter(exist, add) {\n let existIndex = this.index(exist)\n let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse()\n existIndex = this.index(exist)\n for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node)\n\n let index\n for (let id in this.indexes) {\n index = this.indexes[id]\n if (existIndex < index) {\n this.indexes[id] = index + nodes.length\n }\n }\n\n this.markDirty()\n\n return this\n }\n\n insertBefore(exist, add) {\n let existIndex = this.index(exist)\n let type = existIndex === 0 ? 'prepend' : false\n let nodes = this.normalize(\n add,\n this.proxyOf.nodes[existIndex],\n type\n ).reverse()\n existIndex = this.index(exist)\n for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node)\n\n let index\n for (let id in this.indexes) {\n index = this.indexes[id]\n if (existIndex <= index) {\n this.indexes[id] = index + nodes.length\n }\n }\n\n this.markDirty()\n\n return this\n }\n\n normalize(nodes, sample) {\n if (typeof nodes === 'string') {\n nodes = cleanSource(parse(nodes).nodes)\n } else if (typeof nodes === 'undefined') {\n nodes = []\n } else if (Array.isArray(nodes)) {\n nodes = nodes.slice(0)\n for (let i of nodes) {\n if (i.parent) i.parent.removeChild(i, 'ignore')\n }\n } else if (nodes.type === 'root' && this.type !== 'document') {\n nodes = nodes.nodes.slice(0)\n for (let i of nodes) {\n if (i.parent) i.parent.removeChild(i, 'ignore')\n }\n } else if (nodes.type) {\n nodes = [nodes]\n } else if (nodes.prop) {\n if (typeof nodes.value === 'undefined') {\n throw new Error('Value field is missed in node creation')\n } else if (typeof nodes.value !== 'string') {\n nodes.value = String(nodes.value)\n }\n nodes = [new Declaration(nodes)]\n } else if (nodes.selector || nodes.selectors) {\n nodes = [new Rule(nodes)]\n } else if (nodes.name) {\n nodes = [new AtRule(nodes)]\n } else if (nodes.text) {\n nodes = [new Comment(nodes)]\n } else {\n throw new Error('Unknown node type in node creation')\n }\n\n let processed = nodes.map(i => {\n /* c8 ignore next */\n if (!i[my]) Container.rebuild(i)\n i = i.proxyOf\n if (i.parent) i.parent.removeChild(i)\n if (i[isClean]) markTreeDirty(i)\n\n if (!i.raws) i.raws = {}\n if (typeof i.raws.before === 'undefined') {\n if (sample && typeof sample.raws.before !== 'undefined') {\n i.raws.before = sample.raws.before.replace(/\\S/g, '')\n }\n }\n i.parent = this.proxyOf\n return i\n })\n\n return processed\n }\n\n prepend(...children) {\n children = children.reverse()\n for (let child of children) {\n let nodes = this.normalize(child, this.first, 'prepend').reverse()\n for (let node of nodes) this.proxyOf.nodes.unshift(node)\n for (let id in this.indexes) {\n this.indexes[id] = this.indexes[id] + nodes.length\n }\n }\n\n this.markDirty()\n\n return this\n }\n\n push(child) {\n child.parent = this\n this.proxyOf.nodes.push(child)\n return this\n }\n\n removeAll() {\n for (let node of this.proxyOf.nodes) node.parent = undefined\n this.proxyOf.nodes = []\n\n this.markDirty()\n\n return this\n }\n\n removeChild(child) {\n child = this.index(child)\n this.proxyOf.nodes[child].parent = undefined\n this.proxyOf.nodes.splice(child, 1)\n\n let index\n for (let id in this.indexes) {\n index = this.indexes[id]\n if (index >= child) {\n this.indexes[id] = index - 1\n }\n }\n\n this.markDirty()\n\n return this\n }\n\n replaceValues(pattern, opts, callback) {\n if (!callback) {\n callback = opts\n opts = {}\n }\n\n this.walkDecls(decl => {\n if (opts.props && !opts.props.includes(decl.prop)) return\n if (opts.fast && !decl.value.includes(opts.fast)) return\n\n decl.value = decl.value.replace(pattern, callback)\n })\n\n this.markDirty()\n\n return this\n }\n\n some(condition) {\n return this.nodes.some(condition)\n }\n\n walk(callback) {\n if (!this.proxyOf.nodes) return undefined\n\n // An explicit stack instead of recursive `each()` calls to survive\n // deeply nested trees. Each frame keeps a live `indexes` slot, so\n // insertion and removal during the walk behave like `each()`: the\n // slot stays at the current child until its subtree is finished.\n let stack = [{ iterator: this.getIterator(), node: this.proxyOf }]\n\n while (stack.length > 0) {\n let { iterator, node } = stack[stack.length - 1]\n let index = node.indexes[iterator]\n\n if (index >= node.proxyOf.nodes.length) {\n delete node.indexes[iterator]\n stack.pop()\n let parent = stack[stack.length - 1]\n // Finish the parent\u2019s step for the child subtree we just left\n if (parent) parent.node.indexes[parent.iterator] += 1\n continue\n }\n\n let child = node.proxyOf.nodes[index]\n let result\n try {\n result = callback(child, index)\n } catch (e) {\n throw child.addToError(e)\n }\n if (result === false) {\n for (let opened of stack) {\n delete opened.node.indexes[opened.iterator]\n }\n return false\n }\n if (child.walk && child.proxyOf.nodes) {\n stack.push({ iterator: child.getIterator(), node: child })\n } else {\n node.indexes[iterator] += 1\n }\n }\n\n return undefined\n }\n\n walkAtRules(name, callback) {\n if (!callback) {\n callback = name\n return this.walk((child, i) => {\n if (child.type === 'atrule') {\n return callback(child, i)\n }\n })\n }\n if (name instanceof RegExp) {\n return this.walk((child, i) => {\n if (child.type === 'atrule' && name.test(child.name)) {\n return callback(child, i)\n }\n })\n }\n return this.walk((child, i) => {\n if (child.type === 'atrule' && child.name === name) {\n return callback(child, i)\n }\n })\n }\n\n walkComments(callback) {\n return this.walk((child, i) => {\n if (child.type === 'comment') {\n return callback(child, i)\n }\n })\n }\n\n walkDecls(prop, callback) {\n if (!callback) {\n callback = prop\n return this.walk((child, i) => {\n if (child.type === 'decl') {\n return callback(child, i)\n }\n })\n }\n if (prop instanceof RegExp) {\n return this.walk((child, i) => {\n if (child.type === 'decl' && prop.test(child.prop)) {\n return callback(child, i)\n }\n })\n }\n return this.walk((child, i) => {\n if (child.type === 'decl' && child.prop === prop) {\n return callback(child, i)\n }\n })\n }\n\n walkRules(selector, callback) {\n if (!callback) {\n callback = selector\n\n return this.walk((child, i) => {\n if (child.type === 'rule') {\n return callback(child, i)\n }\n })\n }\n if (selector instanceof RegExp) {\n return this.walk((child, i) => {\n if (child.type === 'rule' && selector.test(child.selector)) {\n return callback(child, i)\n }\n })\n }\n return this.walk((child, i) => {\n if (child.type === 'rule' && child.selector === selector) {\n return callback(child, i)\n }\n })\n }\n}\n\nContainer.registerParse = dependant => {\n parse = dependant\n}\n\nContainer.registerRule = dependant => {\n Rule = dependant\n}\n\nContainer.registerAtRule = dependant => {\n AtRule = dependant\n}\n\nContainer.registerRoot = dependant => {\n Root = dependant\n}\n\nmodule.exports = Container\nContainer.default = Container\n\n/* c8 ignore start */\nContainer.rebuild = node => {\n let stack = [node]\n while (stack.length > 0) {\n let next = stack.pop()\n if (next.type === 'atrule') {\n Object.setPrototypeOf(next, AtRule.prototype)\n } else if (next.type === 'rule') {\n Object.setPrototypeOf(next, Rule.prototype)\n } else if (next.type === 'decl') {\n Object.setPrototypeOf(next, Declaration.prototype)\n } else if (next.type === 'comment') {\n Object.setPrototypeOf(next, Comment.prototype)\n } else if (next.type === 'root') {\n Object.setPrototypeOf(next, Root.prototype)\n }\n\n next[my] = true\n\n if (next.nodes) {\n for (let child of next.nodes) stack.push(child)\n }\n }\n}\n/* c8 ignore stop */\n", "'use strict'\n\nlet Container = require('./container')\n\nclass AtRule extends Container {\n constructor(defaults) {\n super(defaults)\n this.type = 'atrule'\n }\n\n append(...children) {\n if (!this.proxyOf.nodes) this.nodes = []\n return super.append(...children)\n }\n\n prepend(...children) {\n if (!this.proxyOf.nodes) this.nodes = []\n return super.prepend(...children)\n }\n}\n\nmodule.exports = AtRule\nAtRule.default = AtRule\n\nContainer.registerAtRule(AtRule)\n", "'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Document extends Container {\n constructor(defaults) {\n // type needs to be passed to super, otherwise child roots won't be normalized correctly\n super({ type: 'document', ...defaults })\n\n if (!this.nodes) {\n this.nodes = []\n }\n }\n\n toResult(opts = {}) {\n let lazy = new LazyResult(new Processor(), this, opts)\n\n return lazy.stringify()\n }\n}\n\nDocument.registerLazyResult = dependant => {\n LazyResult = dependant\n}\n\nDocument.registerProcessor = dependant => {\n Processor = dependant\n}\n\nmodule.exports = Document\nDocument.default = Document\n", "let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n return (size = defaultSize) => {\n let id = ''\n let i = size | 0\n while (i-- > 0) {\n id += alphabet[(Math.random() * alphabet.length) | 0]\n }\n return id\n }\n}\n\nlet nanoid = (size = 21) => {\n let id = ''\n let i = size | 0\n while (i-- > 0) {\n id += urlAlphabet[(Math.random() * 64) | 0]\n }\n return id\n}\n\nmodule.exports = { nanoid, customAlphabet }\n", "'use strict'\n\nlet { existsSync, readFileSync, realpathSync } = require('fs')\nlet { dirname, isAbsolute, join, relative, sep } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\n\nfunction realPath(path) {\n try {\n return realpathSync(path)\n } catch {\n // Missing or dangling: keep the literal path. The existsSync() check below\n // still gates the read, and a path that does not exist cannot escape.\n return path\n }\n}\n\nfunction fromBase64(str) {\n if (Buffer) {\n return Buffer.from(str, 'base64').toString()\n } else {\n /* c8 ignore next 2 */\n return window.atob(str)\n }\n}\n\nclass PreviousMap {\n constructor(css, opts) {\n if (opts.map === false) return\n if (opts.unsafeMap) this.unsafeMap = true\n this.loadAnnotation(css)\n this.inline = this.startWith(this.annotation, 'data:')\n\n let prev = opts.map ? opts.map.prev : undefined\n let text = this.loadMap(opts.from, prev)\n if (!this.mapFile && opts.from) {\n this.mapFile = opts.from\n }\n if (this.mapFile) this.root = dirname(this.mapFile)\n if (text) this.text = text\n }\n\n consumer() {\n if (!this.consumerCache) {\n this.consumerCache = new SourceMapConsumer(this.json || this.text)\n }\n return this.consumerCache\n }\n\n decodeInline(text) {\n let baseCharsetUri = /^data:application\\/json;charset=utf-?8;base64,/\n let baseUri = /^data:application\\/json;base64,/\n let charsetUri = /^data:application\\/json;charset=utf-?8,/\n let uri = /^data:application\\/json,/\n\n let uriMatch = text.match(charsetUri) || text.match(uri)\n if (uriMatch) {\n return decodeURIComponent(text.substr(uriMatch[0].length))\n }\n\n let baseUriMatch = text.match(baseCharsetUri) || text.match(baseUri)\n if (baseUriMatch) {\n return fromBase64(text.substr(baseUriMatch[0].length))\n }\n\n let encoding = text.slice('data:application/json;'.length)\n encoding = encoding.slice(0, encoding.indexOf(','))\n throw new Error('Unsupported source map encoding ' + encoding)\n }\n\n getAnnotationURL(sourceMapString) {\n return sourceMapString.replace(/^\\/\\*\\s*# sourceMappingURL=/, '').trim()\n }\n\n isMap(map) {\n if (typeof map !== 'object') return false\n return (\n typeof map.mappings === 'string' ||\n typeof map._mappings === 'string' ||\n Array.isArray(map.sections)\n )\n }\n\n loadAnnotation(css) {\n let comments = css.match(/\\/\\*\\s*# sourceMappingURL=/g)\n if (!comments) return\n\n // sourceMappingURLs from comments, strings, etc.\n let start = css.lastIndexOf(comments.pop())\n let end = css.indexOf('*/', start)\n\n if (start > -1 && end > -1) {\n // Locate the last sourceMappingURL to avoid pickin\n this.annotation = this.getAnnotationURL(css.substring(start, end))\n }\n }\n\n loadFile(path, cssFile, trusted) {\n if (!trusted && !this.unsafeMap) {\n if (!/\\.map$/i.test(path)) return undefined\n if (!cssFile) return undefined\n\n // Compare *resolved* paths: relative() is textual, so without this a\n // symlink at or below the CSS file's directory points the map outside it.\n let rel = relative(realPath(dirname(cssFile)), realPath(path))\n if (rel === '..' || rel.startsWith('..' + sep) || isAbsolute(rel)) {\n return undefined\n }\n }\n this.root = dirname(path)\n if (existsSync(path)) {\n this.mapFile = path\n return readFileSync(path, 'utf-8').toString().trim()\n }\n }\n\n loadMap(file, prev) {\n if (prev === false) return false\n\n if (prev) {\n if (typeof prev === 'string') {\n return prev\n } else if (typeof prev === 'function') {\n let prevPath = prev(file)\n if (prevPath) {\n let map = this.loadFile(prevPath, file, true)\n if (!map) {\n throw new Error(\n 'Unable to load previous source map: ' + prevPath.toString()\n )\n }\n return map\n }\n } else if (prev instanceof SourceMapConsumer) {\n return SourceMapGenerator.fromSourceMap(prev).toString()\n } else if (prev instanceof SourceMapGenerator) {\n return prev.toString()\n } else if (this.isMap(prev)) {\n return JSON.stringify(prev)\n } else {\n throw new Error(\n 'Unsupported previous source map format: ' + prev.toString()\n )\n }\n } else if (this.inline) {\n return this.decodeInline(this.annotation)\n } else if (this.annotation) {\n let map = this.annotation\n if (file) map = join(dirname(file), map)\n let unknown = this.loadFile(map, file, false)\n if (unknown) {\n try {\n /* c8 ignore next 4 */\n this.json = JSON.parse(unknown.replace(/^\\)]}'[^\\n]*\\n/, ''))\n } catch {\n return undefined\n }\n }\n return unknown\n }\n }\n\n startWith(string, start) {\n if (!string) return false\n return string.substr(0, start.length) === start\n }\n\n withContent() {\n return !!(\n this.consumer().sourcesContent &&\n this.consumer().sourcesContent.length > 0\n )\n }\n}\n\nmodule.exports = PreviousMap\nPreviousMap.default = PreviousMap\n", "'use strict'\n\nlet { nanoid } = require('nanoid/non-secure')\nlet { isAbsolute, resolve } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { fileURLToPath, pathToFileURL } = require('url')\n\nlet CssSyntaxError = require('./css-syntax-error')\nlet PreviousMap = require('./previous-map')\nlet terminalHighlight = require('./terminal-highlight')\n\nlet lineToIndexCache = Symbol('lineToIndexCache')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(resolve && isAbsolute)\n\nfunction getLineToIndex(input) {\n if (input[lineToIndexCache]) return input[lineToIndexCache]\n let lines = input.css.split('\\n')\n let lineToIndex = new Array(lines.length)\n let prevIndex = 0\n\n for (let i = 0, l = lines.length; i < l; i++) {\n lineToIndex[i] = prevIndex\n prevIndex += lines[i].length + 1\n }\n\n input[lineToIndexCache] = lineToIndex\n return lineToIndex\n}\n\nclass Input {\n get from() {\n return this.file || this.id\n }\n\n constructor(css, opts = {}) {\n if (\n css === null ||\n typeof css === 'undefined' ||\n (typeof css === 'object' && !css.toString)\n ) {\n throw new Error(`PostCSS received ${css} instead of CSS string`)\n }\n\n this.css = css.toString()\n\n if (this.css[0] === '\\uFEFF' || this.css[0] === '\\uFFFE') {\n this.hasBOM = true\n this.css = this.css.slice(1)\n } else {\n this.hasBOM = false\n }\n\n this.document = this.css\n if (opts.document) this.document = opts.document.toString()\n\n if (opts.from) {\n if (\n !pathAvailable ||\n /^\\w+:\\/\\//.test(opts.from) ||\n isAbsolute(opts.from)\n ) {\n this.file = opts.from\n } else {\n this.file = resolve(opts.from)\n }\n }\n\n if (pathAvailable && sourceMapAvailable) {\n let map = new PreviousMap(this.css, opts)\n if (map.text) {\n this.map = map\n let file = map.consumer().file\n if (!this.file && file) this.file = this.mapResolve(file)\n }\n }\n\n if (!this.file) {\n this.id = '<input css ' + nanoid(6) + '>'\n }\n if (this.map) this.map.file = this.from\n }\n\n error(message, line, column, opts = {}) {\n let endColumn, endLine, endOffset, offset, result\n\n if (line && typeof line === 'object') {\n let start = line\n let end = column\n if (typeof start.offset === 'number') {\n offset = start.offset\n let pos = this.fromOffset(offset)\n line = pos.line\n column = pos.col\n } else {\n line = start.line\n column = start.column\n offset = this.fromLineAndColumn(line, column)\n }\n if (typeof end.offset === 'number') {\n endOffset = end.offset\n let pos = this.fromOffset(endOffset)\n endLine = pos.line\n endColumn = pos.col\n } else {\n endLine = end.line\n endColumn = end.column\n endOffset = this.fromLineAndColumn(end.line, end.column)\n }\n } else if (!column) {\n offset = line\n let pos = this.fromOffset(offset)\n line = pos.line\n column = pos.col\n } else {\n offset = this.fromLineAndColumn(line, column)\n }\n\n let origin = this.origin(line, column, endLine, endColumn)\n if (origin) {\n result = new CssSyntaxError(\n message,\n origin.endLine === undefined\n ? origin.line\n : { column: origin.column, line: origin.line },\n origin.endLine === undefined\n ? origin.column\n : { column: origin.endColumn, line: origin.endLine },\n origin.source,\n origin.file,\n opts.plugin\n )\n } else {\n result = new CssSyntaxError(\n message,\n endLine === undefined ? line : { column, line },\n endLine === undefined ? column : { column: endColumn, line: endLine },\n this.css,\n this.file,\n opts.plugin\n )\n }\n\n result.input = {\n column,\n endColumn,\n endLine,\n endOffset,\n line,\n offset,\n source: this.css\n }\n if (this.file) {\n if (pathToFileURL) {\n result.input.url = pathToFileURL(this.file).toString()\n }\n result.input.file = this.file\n }\n\n return result\n }\n\n fromLineAndColumn(line, column) {\n let lineToIndex = getLineToIndex(this)\n let index = lineToIndex[line - 1]\n return index + column - 1\n }\n\n fromOffset(offset) {\n let lineToIndex = getLineToIndex(this)\n let lastLine = lineToIndex[lineToIndex.length - 1]\n\n let min = 0\n if (offset >= lastLine) {\n min = lineToIndex.length - 1\n } else {\n let max = lineToIndex.length - 2\n let mid\n while (min < max) {\n mid = min + ((max - min) >> 1)\n if (offset < lineToIndex[mid]) {\n max = mid - 1\n } else if (offset >= lineToIndex[mid + 1]) {\n min = mid + 1\n } else {\n min = mid\n break\n }\n }\n }\n return {\n col: offset - lineToIndex[min] + 1,\n line: min + 1\n }\n }\n\n mapResolve(file) {\n if (/^\\w+:\\/\\//.test(file)) {\n return file\n }\n return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file)\n }\n\n origin(line, column, endLine, endColumn) {\n if (!this.map) return false\n let consumer = this.map.consumer()\n\n let from = consumer.originalPositionFor({ column: column - 1, line })\n if (!from.source) return false\n\n let to\n if (typeof endLine === 'number') {\n let toPosition = consumer.originalPositionFor({\n column: endColumn - 1,\n line: endLine\n })\n // The source map may not have a mapping that covers the end position\n // (`originalPositionFor()` then returns `null` for `line`/`column`\n // instead of omitting them). Treat that the same as not requesting\n // an end position at all, so `endLine`/`endColumn` stay a consistent\n // `undefined` pair instead of a mix of `null` and a bogus number.\n if (toPosition.source) to = toPosition\n }\n\n let fromUrl\n\n if (isAbsolute(from.source)) {\n fromUrl = pathToFileURL(from.source)\n } else {\n fromUrl = new URL(\n from.source,\n this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile)\n )\n }\n\n let result = {\n column: from.column + 1,\n endColumn: to && to.column + 1,\n endLine: to && to.line,\n line: from.line,\n url: fromUrl.toString()\n }\n\n if (fromUrl.protocol === 'file:') {\n if (fileURLToPath) {\n result.file = fileURLToPath(fromUrl)\n } else {\n /* c8 ignore next 2 */\n throw new Error(`file: protocol is not available in this PostCSS build`)\n }\n }\n\n let source = consumer.sourceContentFor(from.source)\n if (source) result.source = source\n\n return result\n }\n\n toJSON() {\n let json = {}\n for (let name of ['hasBOM', 'css', 'file', 'id']) {\n if (this[name] != null) {\n json[name] = this[name]\n }\n }\n if (this.map) {\n json.map = { ...this.map }\n if (json.map.consumerCache) {\n json.map.consumerCache = undefined\n }\n }\n return json\n }\n}\n\nmodule.exports = Input\nInput.default = Input\n\nif (terminalHighlight && terminalHighlight.registerInput) {\n terminalHighlight.registerInput(Input)\n}\n", "'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Root extends Container {\n constructor(defaults) {\n super(defaults)\n this.type = 'root'\n if (!this.nodes) this.nodes = []\n }\n\n normalize(child, sample, type) {\n let keepBefore = new Set()\n for (let node of Array.isArray(child) ? child : [child]) {\n if (\n node &&\n typeof node === 'object' &&\n !node.parent &&\n node.raws &&\n typeof node.raws.before !== 'undefined'\n ) {\n keepBefore.add(node.raws)\n }\n }\n\n let nodes = super.normalize(child)\n\n if (sample) {\n if (type === 'prepend') {\n if (this.nodes.length > 1) {\n sample.raws.before = this.nodes[1].raws.before\n } else {\n delete sample.raws.before\n }\n } else if (this.first !== sample) {\n for (let node of nodes) {\n if (!keepBefore.has(node.raws)) {\n node.raws.before = sample.raws.before\n }\n }\n }\n }\n\n return nodes\n }\n\n removeChild(child, ignore) {\n let index = this.index(child)\n\n if (!ignore && index === 0 && this.nodes.length > 1) {\n this.nodes[1].raws.before = this.nodes[index].raws.before\n }\n\n return super.removeChild(child)\n }\n\n toResult(opts = {}) {\n let lazy = new LazyResult(new Processor(), this, opts)\n return lazy.stringify()\n }\n}\n\nRoot.registerLazyResult = dependant => {\n LazyResult = dependant\n}\n\nRoot.registerProcessor = dependant => {\n Processor = dependant\n}\n\nmodule.exports = Root\nRoot.default = Root\n\nContainer.registerRoot(Root)\n", "'use strict'\n\nlet list = {\n comma(string) {\n return list.split(string, [','], true)\n },\n\n space(string) {\n let spaces = [' ', '\\n', '\\t']\n return list.split(string, spaces)\n },\n\n split(string, separators, last) {\n if (typeof string !== 'string') return []\n let array = []\n let current = ''\n let split = false\n\n let func = 0\n let inQuote = false\n let prevQuote = ''\n let escape = false\n let inComment = false\n\n for (let i = 0; i < string.length; i++) {\n let letter = string[i]\n\n if (inComment) {\n current += letter\n if (letter === '*' && string[i + 1] === '/') {\n current += '/'\n i += 1\n inComment = false\n }\n continue\n }\n\n if (escape) {\n escape = false\n } else if (letter === '\\\\') {\n escape = true\n } else if (inQuote) {\n if (letter === prevQuote) {\n inQuote = false\n }\n } else if (letter === '\"' || letter === \"'\") {\n inQuote = true\n prevQuote = letter\n } else if (letter === '/' && string[i + 1] === '*') {\n current += '/*'\n i += 1\n inComment = true\n continue\n } else if (letter === '(') {\n func += 1\n } else if (letter === ')') {\n if (func > 0) func -= 1\n } else if (func === 0) {\n if (separators.includes(letter)) split = true\n }\n\n if (split) {\n let value = current.trim()\n if (last || value !== '') array.push(value)\n current = ''\n split = false\n } else {\n current += letter\n }\n }\n\n let value = current.trim()\n if (last || value !== '') array.push(value)\n return array\n }\n}\n\nmodule.exports = list\nlist.default = list\n", "'use strict'\n\nlet Container = require('./container')\nlet list = require('./list')\n\nclass Rule extends Container {\n get selectors() {\n return list.comma(this.selector)\n }\n\n set selectors(values) {\n let match = this.selector ? this.selector.match(/,\\s*/) : null\n let sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen')\n this.selector = values.join(sep)\n }\n\n constructor(defaults) {\n super(defaults)\n this.type = 'rule'\n if (!this.nodes) this.nodes = []\n }\n}\n\nmodule.exports = Rule\nRule.default = Rule\n\nContainer.registerRule(Rule)\n", "'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Input = require('./input')\nlet PreviousMap = require('./previous-map')\nlet Root = require('./root')\nlet Rule = require('./rule')\n\nfunction hydrateInputs(json, inputs) {\n if (!json.inputs) return inputs\n return json.inputs.map(input => {\n let inputHydrated = { ...input, __proto__: Input.prototype }\n if (inputHydrated.map) {\n inputHydrated.map = {\n ...inputHydrated.map,\n __proto__: PreviousMap.prototype\n }\n }\n return inputHydrated\n })\n}\n\nfunction constructNode(json, inputs, children) {\n let defaults = { ...json }\n delete defaults.inputs\n delete defaults.nodes\n if (defaults.source) {\n let { inputId, ...source } = defaults.source\n defaults.source = source\n if (inputId != null) {\n defaults.source.input = inputs[inputId]\n }\n }\n\n let node\n if (defaults.type === 'root') {\n node = new Root(defaults)\n } else if (defaults.type === 'decl') {\n node = new Declaration(defaults)\n } else if (defaults.type === 'rule') {\n node = new Rule(defaults)\n } else if (defaults.type === 'comment') {\n node = new Comment(defaults)\n } else if (defaults.type === 'atrule') {\n node = new AtRule(defaults)\n } else {\n throw new Error('Unknown node type: ' + json.type)\n }\n\n // Rehydrated children are attached after construction. Passing them\n // through the container constructor would re-run insertion spacing\n // normalization and overwrite each child's own `raws.before`.\n if (children) {\n node.nodes = children\n for (let child of children) child.parent = node\n }\n\n return node\n}\n\nfunction fromJSON(json, inputs) {\n if (Array.isArray(json)) return json.map(n => fromJSON(n))\n\n // An explicit stack instead of recursive calls to survive deeply\n // nested trees. Children are rehydrated before their parent node\n // is constructed.\n let result\n let stack = [\n { childIndex: 0, children: [], inputs: hydrateInputs(json, inputs), json }\n ]\n\n while (stack.length > 0) {\n let frame = stack[stack.length - 1]\n let jsonNodes = frame.json.nodes\n\n if (jsonNodes && frame.childIndex < jsonNodes.length) {\n let childJson = jsonNodes[frame.childIndex]\n frame.childIndex += 1\n stack.push({\n childIndex: 0,\n children: [],\n inputs: hydrateInputs(childJson, frame.inputs),\n json: childJson\n })\n continue\n }\n\n stack.pop()\n let node = constructNode(\n frame.json,\n frame.inputs,\n jsonNodes ? frame.children : undefined\n )\n if (stack.length > 0) {\n stack[stack.length - 1].children.push(node)\n } else {\n result = node\n }\n }\n\n return result\n}\n\nmodule.exports = fromJSON\nfromJSON.default = fromJSON\n", "'use strict'\n\nlet { dirname, relative, resolve, sep } = require('path')\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { pathToFileURL } = require('url')\n\nlet Input = require('./input')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(dirname && resolve && relative && sep)\n\nclass MapGenerator {\n constructor(stringify, root, opts, cssString) {\n this.stringify = stringify\n this.mapOpts = opts.map || {}\n this.root = root\n this.opts = opts\n this.css = cssString\n this.originalCSS = cssString\n this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute\n\n this.memoizedFileURLs = new Map()\n this.memoizedPaths = new Map()\n this.memoizedURLs = new Map()\n }\n\n addAnnotation() {\n let content\n\n if (this.isInline()) {\n content =\n 'data:application/json;base64,' + this.toBase64(this.map.toString())\n } else if (typeof this.mapOpts.annotation === 'string') {\n content = this.mapOpts.annotation\n } else if (typeof this.mapOpts.annotation === 'function') {\n content = this.mapOpts.annotation(this.opts.to, this.root)\n } else {\n content = this.outputFile() + '.map'\n }\n let eol = '\\n'\n if (this.css.includes('\\r\\n')) eol = '\\r\\n'\n\n this.css += eol + '/*# sourceMappingURL=' + content + ' */'\n }\n\n applyPrevMaps() {\n for (let prev of this.previous()) {\n let from = this.toUrl(this.path(prev.file))\n let root = prev.root || dirname(prev.file)\n let map\n\n if (this.mapOpts.sourcesContent === false) {\n map = new SourceMapConsumer(prev.text)\n if (map.sourcesContent) {\n map.sourcesContent = null\n }\n } else {\n map = prev.consumer()\n }\n\n this.map.applySourceMap(map, from, this.toUrl(this.path(root)))\n }\n }\n\n clearAnnotation() {\n if (this.mapOpts.annotation === false) return\n\n if (this.root) {\n let node\n for (let i = this.root.nodes.length - 1; i >= 0; i--) {\n node = this.root.nodes[i]\n if (node.type !== 'comment') continue\n if (node.text.startsWith('# sourceMappingURL=')) {\n this.root.removeChild(i)\n }\n }\n } else if (this.css) {\n // Single forward pass. Removing every annotation from the whole\n // string separately would be O(n^2) on many annotations.\n let annotation = '/*# sourceMappingURL='\n let css = ''\n let cursor = 0\n let startIndex\n while ((startIndex = this.css.indexOf(annotation, cursor)) !== -1) {\n let endIndex = this.css.indexOf('*/', startIndex + annotation.length)\n if (endIndex === -1) break\n while (startIndex > cursor && this.css[startIndex - 1] === '\\n') {\n startIndex--\n }\n css += this.css.slice(cursor, startIndex)\n cursor = endIndex + 2\n }\n if (cursor > 0) this.css = css + this.css.slice(cursor)\n }\n }\n\n generate() {\n this.clearAnnotation()\n if (pathAvailable && sourceMapAvailable && this.isMap()) {\n return this.generateMap()\n } else {\n let result = ''\n this.stringify(this.root, i => {\n result += i\n })\n return [result]\n }\n }\n\n generateMap() {\n if (this.root) {\n this.generateString()\n } else if (this.previous().length === 1) {\n let prev = this.previous()[0].consumer()\n prev.file = this.outputFile()\n this.map = SourceMapGenerator.fromSourceMap(prev, {\n ignoreInvalidMapping: true\n })\n } else {\n this.map = new SourceMapGenerator({\n file: this.outputFile(),\n ignoreInvalidMapping: true\n })\n this.map.addMapping({\n generated: { column: 0, line: 1 },\n original: { column: 0, line: 1 },\n source: this.opts.from\n ? this.toUrl(this.path(this.opts.from))\n : '<no source>'\n })\n }\n\n if (this.isSourcesContent()) this.setSourcesContent()\n if (this.root && this.previous().length > 0) this.applyPrevMaps()\n if (this.isAnnotation()) this.addAnnotation()\n\n if (this.isInline()) {\n return [this.css]\n } else {\n return [this.css, this.map]\n }\n }\n\n generateString() {\n this.css = ''\n this.map = new SourceMapGenerator({\n file: this.outputFile(),\n ignoreInvalidMapping: true\n })\n\n let line = 1\n let column = 1\n\n let noSource = '<no source>'\n let mapping = {\n generated: { column: 0, line: 0 },\n original: { column: 0, line: 0 },\n source: ''\n }\n\n let last, lines\n this.stringify(this.root, (str, node, type) => {\n this.css += str\n\n if (node && type !== 'end') {\n mapping.generated.line = line\n mapping.generated.column = column - 1\n if (node.source && node.source.start) {\n mapping.source = this.sourcePath(node)\n mapping.original.line = node.source.start.line\n mapping.original.column = node.source.start.column - 1\n this.map.addMapping(mapping)\n } else {\n mapping.source = noSource\n mapping.original.line = 1\n mapping.original.column = 0\n this.map.addMapping(mapping)\n }\n }\n\n lines = str.match(/\\n/g)\n if (lines) {\n line += lines.length\n last = str.lastIndexOf('\\n')\n column = str.length - last\n } else {\n column += str.length\n }\n\n if (node && type !== 'start') {\n let p = node.parent || { raws: {} }\n let childless =\n node.type === 'decl' || (node.type === 'atrule' && !node.nodes)\n if (!childless || node !== p.last || p.raws.semicolon) {\n if (node.source && node.source.end) {\n mapping.source = this.sourcePath(node)\n mapping.original.line = node.source.end.line\n mapping.original.column = node.source.end.column - 1\n mapping.generated.line = line\n mapping.generated.column = column - 2\n this.map.addMapping(mapping)\n } else {\n mapping.source = noSource\n mapping.original.line = 1\n mapping.original.column = 0\n mapping.generated.line = line\n mapping.generated.column = column - 1\n this.map.addMapping(mapping)\n }\n }\n }\n })\n }\n\n isAnnotation() {\n if (this.isInline()) {\n return true\n }\n if (typeof this.mapOpts.annotation !== 'undefined') {\n return this.mapOpts.annotation\n }\n if (this.previous().length) {\n return this.previous().some(i => i.annotation)\n }\n return true\n }\n\n isInline() {\n if (typeof this.mapOpts.inline !== 'undefined') {\n return this.mapOpts.inline\n }\n\n let annotation = this.mapOpts.annotation\n if (typeof annotation !== 'undefined' && annotation !== true) {\n return false\n }\n\n if (this.previous().length) {\n return this.previous().some(i => i.inline)\n }\n return true\n }\n\n isMap() {\n if (typeof this.opts.map !== 'undefined') {\n return !!this.opts.map\n }\n return this.previous().length > 0\n }\n\n isSourcesContent() {\n if (typeof this.mapOpts.sourcesContent !== 'undefined') {\n return this.mapOpts.sourcesContent\n }\n if (this.previous().length) {\n return this.previous().some(i => i.withContent())\n }\n return true\n }\n\n outputFile() {\n if (this.opts.to) {\n return this.path(this.opts.to)\n } else if (this.opts.from) {\n return this.path(this.opts.from)\n } else {\n return 'to.css'\n }\n }\n\n path(file) {\n if (this.mapOpts.absolute) return file\n if (file.charCodeAt(0) === 60 /* `<` */) return file\n if (/^\\w+:\\/\\//.test(file)) return file\n let cached = this.memoizedPaths.get(file)\n if (cached) return cached\n\n let from = this.opts.to ? dirname(this.opts.to) : '.'\n\n if (typeof this.mapOpts.annotation === 'string') {\n from = dirname(resolve(from, this.mapOpts.annotation))\n }\n\n let path = relative(from, file)\n this.memoizedPaths.set(file, path)\n\n return path\n }\n\n previous() {\n if (!this.previousMaps) {\n this.previousMaps = []\n if (this.root) {\n this.root.walk(node => {\n if (node.source && node.source.input.map) {\n let map = node.source.input.map\n if (!this.previousMaps.includes(map)) {\n this.previousMaps.push(map)\n }\n }\n })\n } else {\n let input = new Input(this.originalCSS, this.opts)\n if (input.map) this.previousMaps.push(input.map)\n }\n }\n\n return this.previousMaps\n }\n\n setSourcesContent() {\n let already = {}\n if (this.root) {\n this.root.walk(node => {\n if (node.source) {\n let from = node.source.input.from\n if (from && !already[from]) {\n already[from] = true\n let fromUrl = this.usesFileUrls\n ? this.toFileUrl(from)\n : this.toUrl(this.path(from))\n this.map.setSourceContent(fromUrl, node.source.input.css)\n }\n }\n })\n } else if (this.css) {\n let from = this.opts.from\n ? this.toUrl(this.path(this.opts.from))\n : '<no source>'\n this.map.setSourceContent(from, this.css)\n }\n }\n\n sourcePath(node) {\n if (this.mapOpts.from) {\n return this.toUrl(this.mapOpts.from)\n } else if (this.usesFileUrls) {\n return this.toFileUrl(node.source.input.from)\n } else {\n return this.toUrl(this.path(node.source.input.from))\n }\n }\n\n toBase64(str) {\n if (Buffer) {\n return Buffer.from(str).toString('base64')\n } else {\n return window.btoa(unescape(encodeURIComponent(str)))\n }\n }\n\n toFileUrl(path) {\n let cached = this.memoizedFileURLs.get(path)\n if (cached) return cached\n\n if (pathToFileURL) {\n let fileURL = pathToFileURL(path).toString()\n this.memoizedFileURLs.set(path, fileURL)\n\n return fileURL\n } else {\n throw new Error(\n '`map.absolute` option is not available in this PostCSS build'\n )\n }\n }\n\n toUrl(path) {\n let cached = this.memoizedURLs.get(path)\n if (cached) return cached\n\n if (sep === '\\\\') {\n path = path.replace(/\\\\/g, '/')\n }\n\n let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent)\n this.memoizedURLs.set(path, url)\n\n return url\n }\n}\n\nmodule.exports = MapGenerator\n", "'use strict'\n\nconst SINGLE_QUOTE = \"'\".charCodeAt(0)\nconst DOUBLE_QUOTE = '\"'.charCodeAt(0)\nconst BACKSLASH = '\\\\'.charCodeAt(0)\nconst SLASH = '/'.charCodeAt(0)\nconst NEWLINE = '\\n'.charCodeAt(0)\nconst SPACE = ' '.charCodeAt(0)\nconst FEED = '\\f'.charCodeAt(0)\nconst TAB = '\\t'.charCodeAt(0)\nconst CR = '\\r'.charCodeAt(0)\nconst OPEN_SQUARE = '['.charCodeAt(0)\nconst CLOSE_SQUARE = ']'.charCodeAt(0)\nconst OPEN_PARENTHESES = '('.charCodeAt(0)\nconst CLOSE_PARENTHESES = ')'.charCodeAt(0)\nconst OPEN_CURLY = '{'.charCodeAt(0)\nconst CLOSE_CURLY = '}'.charCodeAt(0)\nconst SEMICOLON = ';'.charCodeAt(0)\nconst ASTERISK = '*'.charCodeAt(0)\nconst COLON = ':'.charCodeAt(0)\nconst AT = '@'.charCodeAt(0)\n\nconst RE_AT_END = /[\\t\\n\\f\\r \"#'()/;[\\\\\\]{}]/g\nconst RE_WORD_END = /[\\t\\n\\f\\r !\"#'():;@[\\\\\\]{}]|\\/(?=\\*)/g\nconst RE_BAD_BRACKET = /.[\\r\\n\"'(/\\\\]/\nconst RE_HEX_ESCAPE = /[\\da-f]/i\n\nmodule.exports = function tokenizer(input, options = {}) {\n let css = input.css.valueOf()\n let ignore = options.ignoreErrors\n\n let code, content, escape, next, quote\n let currentToken, escaped, escapePos, n, prev\n\n let length = css.length\n let pos = 0\n let buffer = []\n let returned = []\n let lastBadParen = -1\n\n function position() {\n return pos\n }\n\n function unclosed(what) {\n throw input.error('Unclosed ' + what, pos)\n }\n\n function endOfFile() {\n return returned.length === 0 && pos >= length\n }\n\n function nextToken(opts) {\n if (returned.length) return returned.pop()\n if (pos >= length) return\n\n let ignoreUnclosed = opts ? opts.ignoreUnclosed : false\n\n code = css.charCodeAt(pos)\n\n switch (code) {\n case NEWLINE:\n case SPACE:\n case TAB:\n case CR:\n case FEED: {\n next = pos\n do {\n next += 1\n code = css.charCodeAt(next)\n } while (\n code === SPACE ||\n code === NEWLINE ||\n code === TAB ||\n code === CR ||\n code === FEED\n )\n\n currentToken = ['space', css.slice(pos, next)]\n pos = next - 1\n break\n }\n\n case OPEN_SQUARE:\n case CLOSE_SQUARE:\n case OPEN_CURLY:\n case CLOSE_CURLY:\n case COLON:\n case SEMICOLON:\n case CLOSE_PARENTHESES: {\n let controlChar = String.fromCharCode(code)\n currentToken = [controlChar, controlChar, pos]\n break\n }\n\n case OPEN_PARENTHESES: {\n prev = buffer.length ? buffer.pop()[1] : ''\n n = css.charCodeAt(pos + 1)\n if (\n prev === 'url' &&\n n !== SINGLE_QUOTE &&\n n !== DOUBLE_QUOTE &&\n n !== SPACE &&\n n !== NEWLINE &&\n n !== TAB &&\n n !== FEED &&\n n !== CR\n ) {\n next = pos\n do {\n escaped = false\n next = css.indexOf(')', next + 1)\n if (next === -1) {\n if (ignore || ignoreUnclosed) {\n next = pos\n break\n } else {\n unclosed('bracket')\n }\n }\n escapePos = next\n while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n escapePos -= 1\n escaped = !escaped\n }\n } while (escaped)\n\n currentToken = ['brackets', css.slice(pos, next + 1), pos, next]\n\n pos = next\n } else if (pos <= lastBadParen) {\n currentToken = ['(', '(', pos]\n } else {\n next = css.indexOf(')', pos + 1)\n content = css.slice(pos, next + 1)\n\n if (next === -1 || RE_BAD_BRACKET.test(content)) {\n lastBadParen = next === -1 ? length : next\n currentToken = ['(', '(', pos]\n } else {\n currentToken = ['brackets', content, pos, next]\n pos = next\n }\n }\n\n break\n }\n\n case SINGLE_QUOTE:\n case DOUBLE_QUOTE: {\n quote = code === SINGLE_QUOTE ? \"'\" : '\"'\n next = pos\n do {\n escaped = false\n next = css.indexOf(quote, next + 1)\n if (next === -1) {\n if (ignore || ignoreUnclosed) {\n next = pos + 1\n break\n } else {\n unclosed('string')\n }\n }\n escapePos = next\n while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n escapePos -= 1\n escaped = !escaped\n }\n } while (escaped)\n\n currentToken = ['string', css.slice(pos, next + 1), pos, next]\n pos = next\n break\n }\n\n case AT: {\n RE_AT_END.lastIndex = pos + 1\n RE_AT_END.test(css)\n if (RE_AT_END.lastIndex === 0) {\n next = css.length - 1\n } else {\n next = RE_AT_END.lastIndex - 2\n }\n\n currentToken = ['at-word', css.slice(pos, next + 1), pos, next]\n\n pos = next\n break\n }\n\n case BACKSLASH: {\n next = pos\n escape = true\n while (css.charCodeAt(next + 1) === BACKSLASH) {\n next += 1\n escape = !escape\n }\n code = css.charCodeAt(next + 1)\n if (\n escape &&\n code !== SLASH &&\n code !== SPACE &&\n code !== NEWLINE &&\n code !== TAB &&\n code !== CR &&\n code !== FEED\n ) {\n next += 1\n if (RE_HEX_ESCAPE.test(css.charAt(next))) {\n while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) {\n next += 1\n }\n if (css.charCodeAt(next + 1) === SPACE) {\n next += 1\n }\n }\n }\n\n currentToken = ['word', css.slice(pos, next + 1), pos, next]\n\n pos = next\n break\n }\n\n default: {\n if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) {\n next = css.indexOf('*/', pos + 2) + 1\n if (next === 0) {\n if (ignore || ignoreUnclosed) {\n next = css.length\n } else {\n unclosed('comment')\n }\n }\n\n currentToken = ['comment', css.slice(pos, next + 1), pos, next]\n pos = next\n } else {\n RE_WORD_END.lastIndex = pos + 1\n RE_WORD_END.test(css)\n if (RE_WORD_END.lastIndex === 0) {\n next = css.length - 1\n } else {\n next = RE_WORD_END.lastIndex - 2\n }\n\n currentToken = ['word', css.slice(pos, next + 1), pos, next]\n buffer.push(currentToken)\n pos = next\n }\n\n break\n }\n }\n\n pos++\n return currentToken\n }\n\n function back(token) {\n returned.push(token)\n }\n\n return {\n back,\n endOfFile,\n nextToken,\n position\n }\n}\n", "'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Declaration = require('./declaration')\nlet Root = require('./root')\nlet Rule = require('./rule')\nlet tokenizer = require('./tokenize')\n\nconst SAFE_COMMENT_NEIGHBOR = {\n empty: true,\n space: true\n}\n\nfunction findLastWithPosition(tokens) {\n for (let i = tokens.length - 1; i >= 0; i--) {\n let token = tokens[i]\n let pos = token[3] || token[2]\n if (pos) return pos\n }\n}\n\nfunction tokensToString(tokens, from, to) {\n let result = ''\n for (let i = from; i < to; i++) result += tokens[i][1]\n return result\n}\n\nclass Parser {\n constructor(input) {\n this.input = input\n\n this.root = new Root()\n this.current = this.root\n this.spaces = ''\n this.semicolon = false\n\n this.createTokenizer()\n this.root.source = { input, start: { column: 1, line: 1, offset: 0 } }\n }\n\n atrule(token) {\n let node = new AtRule()\n node.name = token[1].slice(1)\n if (node.name === '') {\n this.unnamedAtrule(node, token)\n }\n this.init(node, token[2])\n\n let type\n let prev\n let shift\n let last = false\n let open = false\n let params = []\n let brackets = []\n\n while (!this.tokenizer.endOfFile()) {\n token = this.tokenizer.nextToken()\n type = token[0]\n\n if (type === '(' || type === '[') {\n brackets.push(type === '(' ? ')' : ']')\n } else if (type === '{' && brackets.length > 0) {\n brackets.push('}')\n } else if (type === brackets[brackets.length - 1]) {\n brackets.pop()\n }\n\n if (brackets.length === 0) {\n if (type === ';') {\n node.source.end = this.getPosition(token[2])\n node.source.end.offset++\n this.semicolon = true\n break\n } else if (type === '{') {\n open = true\n break\n } else if (type === '}') {\n if (params.length > 0) {\n shift = params.length - 1\n prev = params[shift]\n while (prev && prev[0] === 'space') {\n prev = params[--shift]\n }\n if (prev) {\n node.source.end = this.getPosition(prev[3] || prev[2])\n node.source.end.offset++\n }\n }\n this.end(token)\n break\n } else {\n params.push(token)\n }\n } else {\n params.push(token)\n }\n\n if (this.tokenizer.endOfFile()) {\n last = true\n break\n }\n }\n\n node.raws.between = this.spacesAndCommentsFromEnd(params)\n if (params.length) {\n node.raws.afterName = this.spacesAndCommentsFromStart(params)\n this.raw(node, 'params', params)\n if (last) {\n token = params[params.length - 1]\n node.source.end = this.getPosition(token[3] || token[2])\n node.source.end.offset++\n this.spaces = node.raws.between\n node.raws.between = ''\n }\n } else {\n node.raws.afterName = ''\n node.params = ''\n }\n\n if (open) {\n node.nodes = []\n this.current = node\n }\n }\n\n checkMissedSemicolon(tokens) {\n let colon = this.colon(tokens)\n if (colon === false) return\n\n let founded = 0\n let token\n for (let j = colon - 1; j >= 0; j--) {\n token = tokens[j]\n if (token[0] !== 'space') {\n founded += 1\n if (founded === 2) break\n }\n }\n // If the token is a word, e.g. `!important`, `red` or any other valid\n // property's value. Then we need to return the colon after that word\n // token. [3] is the \"end\" colon of that word. And because we need it\n // after that one we do +1 to get the next one.\n throw this.input.error(\n 'Missed semicolon',\n token[0] === 'word' ? token[3] + 1 : token[2]\n )\n }\n\n colon(tokens) {\n let brackets = 0\n let prev, token, type\n for (let [i, element] of tokens.entries()) {\n token = element\n type = token[0]\n\n if (type === '(') {\n brackets += 1\n }\n if (type === ')') {\n brackets -= 1\n }\n if (brackets === 0 && type === ':') {\n if (!prev) {\n this.doubleColon(token)\n } else if (prev[0] === 'word' && prev[1] === 'progid') {\n continue\n } else {\n return i\n }\n }\n\n prev = token\n }\n return false\n }\n\n comment(token) {\n let node = new Comment()\n this.init(node, token[2])\n node.source.end = this.getPosition(token[3] || token[2])\n node.source.end.offset++\n\n let text = token[1].slice(2, -2)\n if (!text.trim()) {\n node.text = ''\n node.raws.left = text\n node.raws.right = ''\n } else {\n let match = text.match(/^(\\s*)([^]*\\S)(\\s*)$/)\n node.text = match[2]\n node.raws.left = match[1]\n node.raws.right = match[3]\n }\n }\n\n createTokenizer() {\n this.tokenizer = tokenizer(this.input)\n }\n\n decl(tokens, customProperty) {\n let node = new Declaration()\n this.init(node, tokens[0][2])\n\n let last = tokens[tokens.length - 1]\n if (last[0] === ';') {\n this.semicolon = true\n tokens.pop()\n }\n\n node.source.end = this.getPosition(\n last[3] || last[2] || findLastWithPosition(tokens)\n )\n node.source.end.offset++\n\n let start = 0\n while (tokens[start][0] !== 'word') {\n if (start === tokens.length - 1) this.unknownWord([tokens[start]])\n start++\n }\n node.raws.before += tokensToString(tokens, 0, start)\n node.source.start = this.getPosition(tokens[start][2])\n\n let propStart = start\n while (start < tokens.length) {\n let type = tokens[start][0]\n if (type === ':' || type === 'space' || type === 'comment') {\n break\n }\n start++\n }\n node.prop = tokensToString(tokens, propStart, start)\n\n let betweenStart = start\n let token\n while (start < tokens.length) {\n token = tokens[start]\n start++\n if (token[0] === ':') break\n if (token[0] === 'word' && /\\w/.test(token[1])) {\n this.unknownWord([token])\n }\n }\n node.raws.between = tokensToString(tokens, betweenStart, start)\n\n if (node.prop[0] === '_' || node.prop[0] === '*') {\n node.raws.before += node.prop[0]\n node.prop = node.prop.slice(1)\n }\n\n let firstSpacesStart = start\n while (start < tokens.length) {\n let next = tokens[start][0]\n if (next !== 'space' && next !== 'comment') break\n start++\n }\n let firstSpaces = tokens.slice(firstSpacesStart, start)\n\n tokens = tokens.slice(start)\n\n this.precheckMissedSemicolon(tokens)\n\n for (let i = tokens.length - 1; i >= 0; i--) {\n token = tokens[i]\n if (token[1].toLowerCase() === '!important') {\n node.important = true\n let string = this.stringFrom(tokens, i)\n string = this.spacesFromEnd(tokens) + string\n if (string !== ' !important') node.raws.important = string\n break\n } else if (token[1].toLowerCase() === 'important') {\n let cache = tokens.slice(0)\n let str = ''\n for (let j = i; j > 0; j--) {\n let type = cache[j][0]\n if (str.trim().startsWith('!') && type !== 'space') {\n break\n }\n str = cache.pop()[1] + str\n }\n if (str.trim().startsWith('!')) {\n node.important = true\n node.raws.important = str\n tokens = cache\n }\n }\n\n if (token[0] !== 'space' && token[0] !== 'comment') {\n break\n }\n }\n\n let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment')\n\n if (hasWord) {\n node.raws.between += firstSpaces.map(i => i[1]).join('')\n firstSpaces = []\n }\n this.raw(node, 'value', firstSpaces.concat(tokens), customProperty)\n\n if (node.value.includes(':') && !customProperty) {\n this.checkMissedSemicolon(tokens)\n }\n }\n\n doubleColon(token) {\n throw this.input.error(\n 'Double colon',\n { offset: token[2] },\n { offset: token[2] + token[1].length }\n )\n }\n\n emptyRule(token) {\n let node = new Rule()\n this.init(node, token[2])\n node.selector = ''\n node.raws.between = ''\n this.current = node\n }\n\n end(token) {\n if (this.current.nodes && this.current.nodes.length) {\n this.current.raws.semicolon = this.semicolon\n }\n this.semicolon = false\n\n this.current.raws.after = (this.current.raws.after || '') + this.spaces\n this.spaces = ''\n\n if (this.current.parent) {\n this.current.source.end = this.getPosition(token[2])\n this.current.source.end.offset++\n this.current = this.current.parent\n } else {\n this.unexpectedClose(token)\n }\n }\n\n endFile() {\n if (this.current.parent) this.unclosedBlock()\n if (this.current.nodes && this.current.nodes.length) {\n this.current.raws.semicolon = this.semicolon\n }\n this.current.raws.after = (this.current.raws.after || '') + this.spaces\n this.root.source.end = this.getPosition(this.tokenizer.position())\n }\n\n freeSemicolon(token) {\n this.spaces += token[1]\n if (this.current.nodes) {\n let prev = this.current.nodes[this.current.nodes.length - 1]\n if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) {\n prev.raws.ownSemicolon = this.spaces\n this.spaces = ''\n // `ownSemicolon` also holds the spaces before the semicolon, but\n // the position above is the semicolon itself, so the node ends\n // right after it.\n prev.source.end = this.getPosition(token[2])\n prev.source.end.offset++\n }\n }\n }\n\n // Helpers\n\n getPosition(offset) {\n let pos = this.input.fromOffset(offset)\n return {\n column: pos.col,\n line: pos.line,\n offset\n }\n }\n\n init(node, offset) {\n this.current.push(node)\n node.source = {\n input: this.input,\n start: this.getPosition(offset)\n }\n node.raws.before = this.spaces\n this.spaces = ''\n if (node.type !== 'comment') this.semicolon = false\n }\n\n other(start) {\n let end = false\n let type = null\n let colon = false\n let bracket = null\n let brackets = []\n let customProperty = start[1].startsWith('--')\n\n let tokens = []\n let token = start\n while (token) {\n type = token[0]\n tokens.push(token)\n\n if (type === '(' || type === '[') {\n if (!bracket) bracket = token\n brackets.push(type === '(' ? ')' : ']')\n } else if (customProperty && colon && type === '{') {\n if (!bracket) bracket = token\n brackets.push('}')\n } else if (brackets.length === 0) {\n if (type === ';') {\n if (colon) {\n this.decl(tokens, customProperty)\n return\n } else {\n break\n }\n } else if (type === '{') {\n this.rule(tokens)\n return\n } else if (type === '}') {\n this.tokenizer.back(tokens.pop())\n end = true\n break\n } else if (type === ':') {\n colon = true\n }\n } else if (type === brackets[brackets.length - 1]) {\n brackets.pop()\n if (brackets.length === 0) bracket = null\n }\n\n token = this.tokenizer.nextToken()\n }\n\n if (this.tokenizer.endOfFile()) end = true\n if (brackets.length > 0) this.unclosedBracket(bracket)\n\n if (end && colon) {\n if (!customProperty) {\n while (tokens.length) {\n token = tokens[tokens.length - 1][0]\n if (token !== 'space' && token !== 'comment') break\n this.tokenizer.back(tokens.pop())\n }\n }\n this.decl(tokens, customProperty)\n } else {\n this.unknownWord(tokens)\n }\n }\n\n parse() {\n let token\n while (!this.tokenizer.endOfFile()) {\n token = this.tokenizer.nextToken()\n\n switch (token[0]) {\n case 'space':\n this.spaces += token[1]\n break\n\n case ';':\n this.freeSemicolon(token)\n break\n\n case '}':\n this.end(token)\n break\n\n case 'comment':\n this.comment(token)\n break\n\n case 'at-word':\n this.atrule(token)\n break\n\n case '{':\n this.emptyRule(token)\n break\n\n default:\n this.other(token)\n break\n }\n }\n this.endFile()\n }\n\n precheckMissedSemicolon(/* tokens */) {\n // Hook for Safe Parser\n }\n\n raw(node, prop, tokens, customProperty) {\n let token, type\n let length = tokens.length\n let value = ''\n // Last character of `value`. Reading it from `value` would flatten\n // the string concatenation on every comment and make parsing O(n^2).\n let last = ''\n let clean = true\n let next, prev\n\n for (let i = 0; i < length; i += 1) {\n token = tokens[i]\n type = token[0]\n if (type === 'space' && i === length - 1 && !customProperty) {\n clean = false\n } else if (type === 'comment') {\n prev = tokens[i - 1] ? tokens[i - 1][0] : 'empty'\n next = tokens[i + 1] ? tokens[i + 1][0] : 'empty'\n if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) {\n if (last === ',') {\n clean = false\n } else {\n value += token[1]\n last = token[1].slice(-1)\n }\n } else {\n clean = false\n }\n } else {\n value += token[1]\n last = token[1].slice(-1)\n }\n }\n if (!clean) {\n let raw = tokens.reduce((all, i) => all + i[1], '')\n node.raws[prop] = { raw, value }\n }\n node[prop] = value\n }\n\n rule(tokens) {\n tokens.pop()\n\n let node = new Rule()\n this.init(node, tokens[0][2])\n\n node.raws.between = this.spacesAndCommentsFromEnd(tokens)\n this.raw(node, 'selector', tokens)\n this.current = node\n }\n\n spacesAndCommentsFromEnd(tokens) {\n let lastTokenType\n let spaces = ''\n while (tokens.length) {\n lastTokenType = tokens[tokens.length - 1][0]\n if (lastTokenType !== 'space' && lastTokenType !== 'comment') break\n spaces = tokens.pop()[1] + spaces\n }\n return spaces\n }\n\n // Errors\n\n spacesAndCommentsFromStart(tokens) {\n let next\n let spaces = ''\n while (tokens.length) {\n next = tokens[0][0]\n if (next !== 'space' && next !== 'comment') break\n spaces += tokens.shift()[1]\n }\n return spaces\n }\n\n spacesFromEnd(tokens) {\n let lastTokenType\n let spaces = ''\n while (tokens.length) {\n lastTokenType = tokens[tokens.length - 1][0]\n if (lastTokenType !== 'space') break\n spaces = tokens.pop()[1] + spaces\n }\n return spaces\n }\n\n stringFrom(tokens, from) {\n let result = ''\n for (let i = from; i < tokens.length; i++) {\n result += tokens[i][1]\n }\n tokens.splice(from, tokens.length - from)\n return result\n }\n\n unclosedBlock() {\n let pos = this.current.source.start\n throw this.input.error('Unclosed block', pos.line, pos.column)\n }\n\n unclosedBracket(bracket) {\n throw this.input.error(\n 'Unclosed bracket',\n { offset: bracket[2] },\n { offset: bracket[2] + 1 }\n )\n }\n\n unexpectedClose(token) {\n throw this.input.error(\n 'Unexpected }',\n { offset: token[2] },\n { offset: token[2] + 1 }\n )\n }\n\n unknownWord(tokens) {\n throw this.input.error(\n 'Unknown word ' + tokens[0][1],\n { offset: tokens[0][2] },\n { offset: tokens[0][2] + tokens[0][1].length }\n )\n }\n\n unnamedAtrule(node, token) {\n throw this.input.error(\n 'At-rule without name',\n { offset: token[2] },\n { offset: token[2] + token[1].length }\n )\n }\n}\n\nmodule.exports = Parser\n", "'use strict'\n\nlet Container = require('./container')\nlet Input = require('./input')\nlet Parser = require('./parser')\n\nfunction parse(css, opts) {\n let input = new Input(css, opts)\n let parser = new Parser(input)\n try {\n parser.parse()\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n if (e.name === 'CssSyntaxError' && opts && opts.from) {\n if (/\\.scss$/i.test(opts.from)) {\n e.message +=\n '\\nYou tried to parse SCSS with ' +\n 'the standard CSS parser; ' +\n 'try again with the postcss-scss parser'\n } else if (/\\.sass/i.test(opts.from)) {\n e.message +=\n '\\nYou tried to parse Sass with ' +\n 'the standard CSS parser; ' +\n 'try again with the postcss-sass parser'\n } else if (/\\.less$/i.test(opts.from)) {\n e.message +=\n '\\nYou tried to parse Less with ' +\n 'the standard CSS parser; ' +\n 'try again with the postcss-less parser'\n }\n }\n }\n throw e\n }\n\n return parser.root\n}\n\nmodule.exports = parse\nparse.default = parse\n\nContainer.registerParse(parse)\n", "'use strict'\n\nlet Container = require('./container')\nlet { my } = require('./symbols')\n\nclass Warning {\n constructor(text, opts = {}) {\n this.type = 'warning'\n this.text = text\n\n if (opts.node && opts.node.source) {\n if (!opts.node[my]) {\n // The node comes from another PostCSS copy in node_modules, so it does\n // not have this copy\u2019s methods. Container#normalize() rebuilds such\n // nodes on insert, but a node passed straight to Result#warn() never\n // goes through it.\n Container.rebuild(opts.node)\n }\n let range = opts.node.rangeBy(opts)\n this.line = range.start.line\n this.column = range.start.column\n this.endLine = range.end.line\n this.endColumn = range.end.column\n }\n\n for (let opt in opts) this[opt] = opts[opt]\n }\n\n toString() {\n if (this.node) {\n return this.node.error(this.text, {\n index: this.index,\n plugin: this.plugin,\n word: this.word\n }).message\n }\n\n if (this.plugin) {\n return this.plugin + ': ' + this.text\n }\n\n return this.text\n }\n}\n\nmodule.exports = Warning\nWarning.default = Warning\n", "'use strict'\n\nlet Warning = require('./warning')\n\nclass Result {\n get content() {\n return this.css\n }\n\n constructor(processor, root, opts) {\n this.processor = processor\n this.messages = []\n this.root = root\n this.opts = opts\n this.css = ''\n this.map = undefined\n }\n\n toString() {\n return this.css\n }\n\n warn(text, opts = {}) {\n if (!opts.plugin) {\n if (this.lastPlugin && this.lastPlugin.postcssPlugin) {\n opts.plugin = this.lastPlugin.postcssPlugin\n }\n }\n\n let warning = new Warning(text, opts)\n this.messages.push(warning)\n\n return warning\n }\n\n warnings() {\n return this.messages.filter(i => i.type === 'warning')\n }\n}\n\nmodule.exports = Result\nResult.default = Result\n", "/* eslint-disable no-console */\n'use strict'\n\nlet printed = {}\n\nmodule.exports = function warnOnce(message) {\n if (printed[message]) return\n printed[message] = true\n\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(message)\n }\n}\n", "'use strict'\n\nlet Container = require('./container')\nlet Document = require('./document')\nlet MapGenerator = require('./map-generator')\nlet parse = require('./parse')\nlet Result = require('./result')\nlet Root = require('./root')\nlet stringify = require('./stringify')\nlet { isClean, my } = require('./symbols')\nlet warnOnce = require('./warn-once')\n\nconst TYPE_TO_CLASS_NAME = {\n atrule: 'AtRule',\n comment: 'Comment',\n decl: 'Declaration',\n document: 'Document',\n root: 'Root',\n rule: 'Rule'\n}\n\nconst PLUGIN_PROPS = {\n AtRule: true,\n AtRuleExit: true,\n Comment: true,\n CommentExit: true,\n Declaration: true,\n DeclarationExit: true,\n Document: true,\n DocumentExit: true,\n Once: true,\n OnceExit: true,\n postcssPlugin: true,\n prepare: true,\n Root: true,\n RootExit: true,\n Rule: true,\n RuleExit: true\n}\n\nconst NOT_VISITORS = {\n Once: true,\n postcssPlugin: true,\n prepare: true\n}\n\nconst CHILDREN = 0\n\nfunction isPromise(obj) {\n return typeof obj === 'object' && typeof obj.then === 'function'\n}\n\nfunction getEvents(node) {\n let key = false\n let type = TYPE_TO_CLASS_NAME[node.type]\n if (node.type === 'decl') {\n key = node.prop.toLowerCase()\n } else if (node.type === 'atrule') {\n key = node.name.toLowerCase()\n }\n\n if (key && node.append) {\n return [\n type,\n type + '-' + key,\n CHILDREN,\n type + 'Exit',\n type + 'Exit-' + key\n ]\n } else if (key) {\n return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key]\n } else if (node.append) {\n return [type, CHILDREN, type + 'Exit']\n } else {\n return [type, type + 'Exit']\n }\n}\n\nfunction toStack(node) {\n let events\n if (node.type === 'document') {\n events = ['Document', CHILDREN, 'DocumentExit']\n } else if (node.type === 'root') {\n events = ['Root', CHILDREN, 'RootExit']\n } else {\n events = getEvents(node)\n }\n\n return {\n eventIndex: 0,\n events,\n iterator: 0,\n node,\n visitorIndex: 0,\n visitors: []\n }\n}\n\nfunction cleanMarks(node) {\n let stack = [node]\n while (stack.length > 0) {\n let next = stack.pop()\n next[isClean] = false\n if (next.nodes) {\n for (let i of next.nodes) stack.push(i)\n }\n }\n return node\n}\n\nlet postcss = {}\n\nclass LazyResult {\n get content() {\n return this.stringify().content\n }\n\n get css() {\n return this.stringify().css\n }\n\n get map() {\n return this.stringify().map\n }\n\n get messages() {\n return this.sync().messages\n }\n\n get opts() {\n return this.result.opts\n }\n\n get processor() {\n return this.result.processor\n }\n\n get root() {\n return this.sync().root\n }\n\n get [Symbol.toStringTag]() {\n return 'LazyResult'\n }\n\n constructor(processor, css, opts) {\n this.stringified = false\n this.processed = false\n\n let root\n if (\n typeof css === 'object' &&\n css !== null &&\n (css.type === 'root' || css.type === 'document')\n ) {\n root = cleanMarks(css)\n } else if (css instanceof LazyResult || css instanceof Result) {\n root = cleanMarks(css.root)\n if (css.map) {\n if (typeof opts.map === 'undefined') opts.map = {}\n if (!opts.map.inline) opts.map.inline = false\n opts.map.prev = css.map\n }\n } else {\n let parser = parse\n if (opts.syntax) parser = opts.syntax.parse\n if (opts.parser) parser = opts.parser\n if (parser.parse) parser = parser.parse\n\n try {\n root = parser(css, opts)\n } catch (error) {\n this.processed = true\n this.error = error\n }\n\n if (root && !root[my]) {\n /* c8 ignore next 2 */\n Container.rebuild(root)\n }\n }\n\n this.result = new Result(processor, root, opts)\n this.helpers = { ...postcss, postcss, result: this.result }\n this.plugins = this.processor.plugins.map(plugin => {\n if (typeof plugin === 'object' && plugin.prepare) {\n return { ...plugin, ...plugin.prepare(this.result) }\n } else {\n return plugin\n }\n })\n }\n\n async() {\n if (this.error) return Promise.reject(this.error)\n if (this.processed) return Promise.resolve(this.result)\n if (!this.processing) {\n this.processing = this.runAsync()\n }\n return this.processing\n }\n\n catch(onRejected) {\n return this.async().catch(onRejected)\n }\n\n finally(onFinally) {\n return this.async().then(onFinally, onFinally)\n }\n\n getAsyncError() {\n throw new Error('Use process(css).then(cb) to work with async plugins')\n }\n\n handleError(error, node) {\n let plugin = this.result.lastPlugin\n try {\n if (node) node.addToError(error)\n this.error = error\n if (error.name === 'CssSyntaxError' && !error.plugin) {\n error.plugin = plugin.postcssPlugin\n error.setMessage()\n } else if (plugin.postcssVersion) {\n if (process.env.NODE_ENV !== 'production') {\n let pluginName = plugin.postcssPlugin\n let pluginVer = plugin.postcssVersion\n let runtimeVer = this.result.processor.version\n let a = pluginVer.split('.')\n let b = runtimeVer.split('.')\n\n if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) {\n // eslint-disable-next-line no-console\n console.error(\n 'Unknown error from PostCSS plugin. Your current PostCSS ' +\n 'version is ' +\n runtimeVer +\n ', but ' +\n pluginName +\n ' uses ' +\n pluginVer +\n '. Perhaps this is the source of the error below.'\n )\n }\n }\n }\n } catch (err) {\n /* c8 ignore next 3 */\n // eslint-disable-next-line no-console\n if (console && console.error) console.error(err)\n }\n return error\n }\n\n prepareVisitors() {\n this.listeners = {}\n let add = (plugin, type, cb) => {\n if (!this.listeners[type]) this.listeners[type] = []\n this.listeners[type].push([plugin, cb])\n }\n for (let plugin of this.plugins) {\n if (typeof plugin === 'object') {\n for (let event in plugin) {\n if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) {\n throw new Error(\n `Unknown event ${event} in ${plugin.postcssPlugin}. ` +\n `Try to update PostCSS (${this.processor.version} now).`\n )\n }\n if (!NOT_VISITORS[event]) {\n if (typeof plugin[event] === 'object') {\n for (let filter in plugin[event]) {\n if (filter === '*') {\n add(plugin, event, plugin[event][filter])\n } else {\n add(\n plugin,\n event + '-' + filter.toLowerCase(),\n plugin[event][filter]\n )\n }\n }\n } else if (typeof plugin[event] === 'function') {\n add(plugin, event, plugin[event])\n }\n }\n }\n }\n }\n this.hasListener = Object.keys(this.listeners).length > 0\n }\n\n async runAsync() {\n this.plugin = 0\n for (let i = 0; i < this.plugins.length; i++) {\n let plugin = this.plugins[i]\n let promise = this.runOnRoot(plugin)\n if (isPromise(promise)) {\n try {\n await promise\n } catch (error) {\n throw this.handleError(error)\n }\n }\n }\n\n this.prepareVisitors()\n if (this.hasListener) {\n let root = this.result.root\n while (!root[isClean]) {\n root[isClean] = true\n let stack = [toStack(root)]\n while (stack.length > 0) {\n let promise = this.visitTick(stack)\n if (isPromise(promise)) {\n try {\n await promise\n } catch (e) {\n let node = stack[stack.length - 1].node\n throw this.handleError(e, node)\n }\n }\n }\n }\n\n if (this.listeners.OnceExit) {\n for (let [plugin, visitor] of this.listeners.OnceExit) {\n this.result.lastPlugin = plugin\n try {\n if (root.type === 'document') {\n let roots = root.nodes.map(subRoot =>\n visitor(subRoot, this.helpers)\n )\n\n await Promise.all(roots)\n } else {\n await visitor(root, this.helpers)\n }\n } catch (e) {\n throw this.handleError(e)\n }\n }\n }\n }\n\n this.processed = true\n return this.stringify()\n }\n\n runOnRoot(plugin) {\n this.result.lastPlugin = plugin\n try {\n if (typeof plugin === 'object' && plugin.Once) {\n if (this.result.root.type === 'document') {\n let roots = this.result.root.nodes.map(root =>\n plugin.Once(root, this.helpers)\n )\n\n if (isPromise(roots[0])) {\n return Promise.all(roots)\n }\n\n return roots\n }\n\n return plugin.Once(this.result.root, this.helpers)\n } else if (typeof plugin === 'function') {\n return plugin(this.result.root, this.result)\n }\n } catch (error) {\n throw this.handleError(error)\n }\n }\n\n stringify() {\n if (this.error) throw this.error\n if (this.stringified) return this.result\n this.stringified = true\n\n this.sync()\n\n let opts = this.result.opts\n let str = stringify\n if (opts.syntax) str = opts.syntax.stringify\n if (opts.stringifier) str = opts.stringifier\n if (str.stringify) str = str.stringify\n\n let rootSource = this.result.root.source\n if (\n opts.map === undefined &&\n !(rootSource && rootSource.input && rootSource.input.map)\n ) {\n let result = ''\n str(this.result.root, i => {\n result += i\n })\n this.result.css = result\n return this.result\n }\n\n let map = new MapGenerator(str, this.result.root, this.result.opts)\n let data = map.generate()\n this.result.css = data[0]\n this.result.map = data[1]\n\n return this.result\n }\n\n sync() {\n if (this.error) throw this.error\n if (this.processed) return this.result\n this.processed = true\n\n if (this.processing) {\n throw this.getAsyncError()\n }\n\n for (let plugin of this.plugins) {\n let promise = this.runOnRoot(plugin)\n if (isPromise(promise)) {\n throw this.getAsyncError()\n }\n }\n\n this.prepareVisitors()\n if (this.hasListener) {\n let root = this.result.root\n while (!root[isClean]) {\n root[isClean] = true\n this.walkSync(root)\n }\n if (this.listeners.OnceExit) {\n if (root.type === 'document') {\n for (let subRoot of root.nodes) {\n this.visitSync(this.listeners.OnceExit, subRoot)\n }\n } else {\n this.visitSync(this.listeners.OnceExit, root)\n }\n }\n }\n\n return this.result\n }\n\n then(onFulfilled, onRejected) {\n if (process.env.NODE_ENV !== 'production') {\n if (!('from' in this.opts)) {\n warnOnce(\n 'Without `from` option PostCSS could generate wrong source map ' +\n 'and will not find Browserslist config. Set it to CSS file path ' +\n 'or to `undefined` to prevent this warning.'\n )\n }\n }\n return this.async().then(onFulfilled, onRejected)\n }\n\n toString() {\n return this.css\n }\n\n visitSync(visitors, node) {\n for (let [plugin, visitor] of visitors) {\n this.result.lastPlugin = plugin\n let promise\n try {\n promise = visitor(node, this.helpers)\n } catch (e) {\n throw this.handleError(e, node.proxyOf)\n }\n if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n return true\n }\n if (isPromise(promise)) {\n throw this.getAsyncError()\n }\n }\n }\n\n visitTick(stack) {\n let visit = stack[stack.length - 1]\n let { node, visitors } = visit\n\n if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n stack.pop()\n return\n }\n\n if (visitors.length > 0 && visit.visitorIndex < visitors.length) {\n let [plugin, visitor] = visitors[visit.visitorIndex]\n visit.visitorIndex += 1\n if (visit.visitorIndex === visitors.length) {\n visit.visitors = []\n visit.visitorIndex = 0\n }\n this.result.lastPlugin = plugin\n try {\n return visitor(node.toProxy(), this.helpers)\n } catch (e) {\n throw this.handleError(e, node)\n }\n }\n\n if (visit.iterator !== 0) {\n let iterator = visit.iterator\n // Advance past the child we just finished visiting. Like\n // `Container#each`, the index is incremented only after a child has\n // been fully processed, so a node inserted right after the current\n // child is not skipped by the `existIndex < index` adjustment in\n // `Container#insertAfter()` (which would fire exit events too early).\n if (visit.descending) {\n visit.descending = false\n node.indexes[iterator] += 1\n }\n let child\n while ((child = node.nodes[node.indexes[iterator]])) {\n if (!child[isClean]) {\n child[isClean] = true\n visit.descending = true\n stack.push(toStack(child))\n return\n }\n node.indexes[iterator] += 1\n }\n visit.iterator = 0\n delete node.indexes[iterator]\n }\n\n let events = visit.events\n while (visit.eventIndex < events.length) {\n let event = events[visit.eventIndex]\n visit.eventIndex += 1\n if (event === CHILDREN) {\n if (node.nodes && node.nodes.length) {\n node[isClean] = true\n visit.iterator = node.getIterator()\n }\n return\n } else if (this.listeners[event]) {\n visit.visitors = this.listeners[event]\n return\n }\n }\n stack.pop()\n }\n\n walkSync(node) {\n // An explicit stack like in async `visitTick()` to survive deeply\n // nested trees. Unlike `visitTick()`, nodes are marked clean only\n // on entering, so a node dirtied by its own visitors is revisited\n // on the next pass.\n node[isClean] = true\n let stack = [{ eventIndex: 0, events: getEvents(node), iterator: 0, node }]\n\n while (stack.length > 0) {\n let visit = stack[stack.length - 1]\n let visitNode = visit.node\n\n if (visit.iterator !== 0) {\n let iterator = visit.iterator\n // Advance past the child we just finished visiting. Like\n // `Container#each`, the index is incremented only after a child has\n // been fully processed. Incrementing before (as this loop used to)\n // makes a node inserted right after the current child get skipped by\n // the `existIndex < index` adjustment in `Container#insertAfter()`,\n // which fires exit events before those new siblings are visited.\n if (visit.descending) {\n visit.descending = false\n visitNode.indexes[iterator] += 1\n }\n let child\n let descended = false\n while ((child = visitNode.nodes[visitNode.indexes[iterator]])) {\n if (!child[isClean]) {\n child[isClean] = true\n visit.descending = true\n stack.push({\n eventIndex: 0,\n events: getEvents(child),\n iterator: 0,\n node: child\n })\n descended = true\n break\n }\n visitNode.indexes[iterator] += 1\n }\n if (descended) continue\n visit.iterator = 0\n delete visitNode.indexes[iterator]\n }\n\n if (visit.eventIndex < visit.events.length) {\n let event = visit.events[visit.eventIndex]\n visit.eventIndex += 1\n if (event === CHILDREN) {\n if (visitNode.nodes && visitNode.nodes.length) {\n visit.iterator = visitNode.getIterator()\n }\n } else {\n let visitors = this.listeners[event]\n if (visitors) {\n if (this.visitSync(visitors, visitNode.toProxy())) stack.pop()\n }\n }\n continue\n }\n\n stack.pop()\n }\n }\n\n warnings() {\n return this.sync().warnings()\n }\n}\n\nLazyResult.registerPostcss = dependant => {\n postcss = dependant\n}\n\nmodule.exports = LazyResult\nLazyResult.default = LazyResult\n\nRoot.registerLazyResult(LazyResult)\nDocument.registerLazyResult(LazyResult)\n", "'use strict'\n\nlet MapGenerator = require('./map-generator')\nlet parse = require('./parse')\nlet Result = require('./result')\nlet stringify = require('./stringify')\nlet warnOnce = require('./warn-once')\n\nclass NoWorkResult {\n get content() {\n return this.result.css\n }\n\n get css() {\n return this.result.css\n }\n\n get map() {\n return this.result.map\n }\n\n get messages() {\n return []\n }\n\n get opts() {\n return this.result.opts\n }\n\n get processor() {\n return this.result.processor\n }\n\n get root() {\n if (this._root) {\n return this._root\n }\n\n let root\n let parser = parse\n\n try {\n root = parser(this._css, this._opts)\n } catch (error) {\n this.error = error\n }\n\n if (this.error) {\n throw this.error\n } else {\n this._root = root\n return root\n }\n }\n\n get [Symbol.toStringTag]() {\n return 'NoWorkResult'\n }\n\n constructor(processor, css, opts) {\n css = css.toString()\n this.stringified = false\n\n this._processor = processor\n this._css = css\n this._opts = opts\n this._map = undefined\n\n let str = stringify\n this.result = new Result(this._processor, undefined, this._opts)\n this.result.css = css\n\n let self = this\n Object.defineProperty(this.result, 'root', {\n get() {\n return self.root\n }\n })\n\n let map = new MapGenerator(str, undefined, this._opts, css)\n if (map.isMap()) {\n let [generatedCSS, generatedMap] = map.generate()\n if (generatedCSS) {\n this.result.css = generatedCSS\n }\n if (generatedMap) {\n this.result.map = generatedMap\n }\n } else {\n map.clearAnnotation()\n this.result.css = map.css\n }\n }\n\n async() {\n if (this.error) return Promise.reject(this.error)\n return Promise.resolve(this.result)\n }\n\n catch(onRejected) {\n return this.async().catch(onRejected)\n }\n\n finally(onFinally) {\n return this.async().then(onFinally, onFinally)\n }\n\n sync() {\n if (this.error) throw this.error\n return this.result\n }\n\n then(onFulfilled, onRejected) {\n if (process.env.NODE_ENV !== 'production') {\n if (!('from' in this._opts)) {\n warnOnce(\n 'Without `from` option PostCSS could generate wrong source map ' +\n 'and will not find Browserslist config. Set it to CSS file path ' +\n 'or to `undefined` to prevent this warning.'\n )\n }\n }\n\n return this.async().then(onFulfilled, onRejected)\n }\n\n toString() {\n return this._css\n }\n\n warnings() {\n return []\n }\n}\n\nmodule.exports = NoWorkResult\nNoWorkResult.default = NoWorkResult\n", "'use strict'\n\nlet Document = require('./document')\nlet LazyResult = require('./lazy-result')\nlet NoWorkResult = require('./no-work-result')\nlet Root = require('./root')\n\nclass Processor {\n constructor(plugins = []) {\n this.version = '8.5.29'\n this.plugins = this.normalize(plugins)\n }\n\n normalize(plugins) {\n let normalized = []\n for (let i of plugins) {\n if (i.postcss === true) {\n i = i()\n } else if (i.postcss) {\n i = i.postcss\n }\n\n if (typeof i === 'object' && Array.isArray(i.plugins)) {\n normalized = normalized.concat(i.plugins)\n } else if (typeof i === 'object' && i.postcssPlugin) {\n normalized.push(i)\n } else if (typeof i === 'function') {\n normalized.push(i)\n } else if (typeof i === 'object' && (i.parse || i.stringify)) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\n 'PostCSS syntaxes cannot be used as plugins. Instead, please use ' +\n 'one of the syntax/parser/stringifier options as outlined ' +\n 'in your PostCSS runner documentation.'\n )\n }\n } else {\n throw new Error(i + ' is not a PostCSS plugin')\n }\n }\n return normalized\n }\n\n process(css, opts = {}) {\n if (\n !this.plugins.length &&\n !opts.parser &&\n !opts.stringifier &&\n !opts.syntax\n ) {\n return new NoWorkResult(this, css, opts)\n } else {\n return new LazyResult(this, css, opts)\n }\n }\n\n use(plugin) {\n this.plugins = this.plugins.concat(this.normalize([plugin]))\n return this\n }\n}\n\nmodule.exports = Processor\nProcessor.default = Processor\n\nRoot.registerProcessor(Processor)\nDocument.registerProcessor(Processor)\n", "'use strict'\n\nlet AtRule = require('./at-rule')\nlet Comment = require('./comment')\nlet Container = require('./container')\nlet CssSyntaxError = require('./css-syntax-error')\nlet Declaration = require('./declaration')\nlet Document = require('./document')\nlet fromJSON = require('./fromJSON')\nlet Input = require('./input')\nlet LazyResult = require('./lazy-result')\nlet list = require('./list')\nlet Node = require('./node')\nlet parse = require('./parse')\nlet Processor = require('./processor')\nlet Result = require('./result.js')\nlet Root = require('./root')\nlet Rule = require('./rule')\nlet stringify = require('./stringify')\nlet Warning = require('./warning')\n\nfunction postcss(...plugins) {\n if (plugins.length === 1 && Array.isArray(plugins[0])) {\n plugins = plugins[0]\n }\n return new Processor(plugins)\n}\n\npostcss.plugin = function plugin(name, initializer) {\n let warningPrinted = false\n function creator(...args) {\n // eslint-disable-next-line no-console\n if (console && console.warn && !warningPrinted) {\n warningPrinted = true\n // eslint-disable-next-line no-console\n console.warn(\n name +\n ': postcss.plugin was deprecated. Migration guide:\\n' +\n 'https://evilmartians.com/chronicles/postcss-8-plugin-migration'\n )\n if (process.env.LANG && process.env.LANG.startsWith('zh')) {\n /* c8 ignore next 7 */\n // eslint-disable-next-line no-console\n console.warn(\n name +\n ': \u91CC\u9762 postcss.plugin \u88AB\u5F03\u7528. \u8FC1\u79FB\u6307\u5357:\\n' +\n 'https://www.w3ctech.com/topic/2226'\n )\n }\n }\n let transformer = initializer(...args)\n transformer.postcssPlugin = name\n transformer.postcssVersion = new Processor().version\n return transformer\n }\n\n let cache\n Object.defineProperty(creator, 'postcss', {\n get() {\n if (!cache) cache = creator()\n return cache\n }\n })\n\n creator.process = function (css, processOpts, pluginOpts) {\n return postcss([creator(pluginOpts)]).process(css, processOpts)\n }\n\n return creator\n}\n\npostcss.stringify = stringify\npostcss.parse = parse\npostcss.fromJSON = fromJSON\npostcss.list = list\n\npostcss.comment = defaults => new Comment(defaults)\npostcss.atRule = defaults => new AtRule(defaults)\npostcss.decl = defaults => new Declaration(defaults)\npostcss.rule = defaults => new Rule(defaults)\npostcss.root = defaults => new Root(defaults)\npostcss.document = defaults => new Document(defaults)\n\npostcss.CssSyntaxError = CssSyntaxError\npostcss.Declaration = Declaration\npostcss.Container = Container\npostcss.Processor = Processor\npostcss.Document = Document\npostcss.Comment = Comment\npostcss.Warning = Warning\npostcss.AtRule = AtRule\npostcss.Result = Result\npostcss.Input = Input\npostcss.Rule = Rule\npostcss.Root = Root\npostcss.Node = Node\n\nLazyResult.registerPostcss(postcss)\n\nmodule.exports = postcss\npostcss.default = postcss\n", "!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));", "const dayjs = require('dayjs');\n\n// Strip characters browsers ignore inside URLs (control chars and\n// embedded HTML comments) that are commonly used to sneak XSS\n// payloads past simple scheme checks.\nfunction cleanHref(href) {\n // Browsers ignore character codes of 32 (space) and below in a surprising\n // number of situations. Start reading here:\n // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Embedded_tab\n // eslint-disable-next-line no-control-regex\n href = href.replace(/[\\x00-\\x20]+/g, '');\n // Clobber any comments in URLs, which the browser might\n // interpret inside an XML data island, allowing\n // a javascript: URL to be snuck through\n while (true) {\n const firstIndex = href.indexOf('<!--');\n if (firstIndex === -1) {\n break;\n }\n const lastIndex = href.indexOf('-->', firstIndex + 4);\n if (lastIndex === -1) {\n break;\n }\n href = href.substring(0, firstIndex) + href.substring(lastIndex + 3);\n }\n return href;\n}\n\n// Returns true if `href` should be rejected as unsafe. Used to block\n// `javascript:`, `data:` and other dangerous schemes both when\n// validating URL fields and when sanitizing HTML attribute values.\n//\n// `options.allowedSchemes` is an array of permitted URL schemes\n// (defaults to the schemes long permitted by `launder().url`).\n// `options.allowProtocolRelative` controls whether protocol-relative\n// URLs (e.g. `//example.com`) are permitted. Defaults to true.\nfunction naughtyHref(href, options) {\n options = options || {};\n const allowedSchemes = options.allowedSchemes ||\n [ 'http', 'https', 'ftp', 'mailto', 'tel', 'sms' ];\n const allowProtocolRelative = (options.allowProtocolRelative !== false);\n if (typeof href !== 'string') {\n return false;\n }\n href = cleanHref(href);\n // Case insensitive so we don't get faked out by JAVASCRIPT #1\n // Allow more characters after the first so we don't get faked\n // out by certain schemes browsers accept\n const matches = href.match(/^([a-zA-Z][a-zA-Z0-9.\\-+]*):/);\n if (!matches) {\n // Protocol-relative URL starting with any combination of '/' and '\\'\n if (href.match(/^[/\\\\]{2}/)) {\n return !allowProtocolRelative;\n }\n // No scheme\n return false;\n }\n const scheme = matches[1].toLowerCase();\n return allowedSchemes.indexOf(scheme) === -1;\n}\n\nmodule.exports = function(options) {\n const self = {};\n self.options = options || {};\n\n self.filterTag = self.options.filterTag || function(tag) {\n tag = tag.trim();\n return tag.toLowerCase();\n };\n\n self.string = function(s, def) {\n if (typeof (s) !== 'string') {\n if ((typeof (s) === 'number') || (typeof (s) === 'boolean')) {\n s += '';\n } else {\n s = '';\n }\n }\n s = s.trim();\n if (def !== undefined) {\n if (s === '') {\n s = def;\n }\n }\n return s;\n };\n\n self.strings = function(strings) {\n if (!Array.isArray(strings)) {\n return [];\n }\n return strings.map(function(s) {\n return self.string(s);\n });\n };\n\n self.integer = function(i, def, min, max) {\n if (def === undefined) {\n def = 0;\n }\n if (typeof (i) === 'number') {\n i = Math.floor(i);\n } else {\n try {\n i = parseInt(i, 10);\n if (isNaN(i)) {\n i = def;\n }\n } catch (e) {\n i = def;\n }\n }\n if ((typeof (min) === 'number') && (i < min)) {\n i = min;\n }\n if ((typeof (max) === 'number') && (i > max)) {\n i = max;\n }\n return i;\n };\n\n self.padInteger = function(i, places) {\n let s = i + '';\n while (s.length < places) {\n s = '0' + s;\n }\n return s;\n };\n\n self.float = function(i, def, min, max) {\n if (def === undefined) {\n def = 0;\n }\n if (!(typeof (i) === 'number')) {\n try {\n i = parseFloat(i, 10);\n if (isNaN(i)) {\n i = def;\n }\n } catch (e) {\n i = def;\n }\n }\n if ((typeof (min) === 'number') && (i < min)) {\n i = min;\n }\n if ((typeof (max) === 'number') && (i > max)) {\n i = max;\n }\n return i;\n };\n\n self.naughtyHref = naughtyHref;\n\n self.url = function(s, def, httpsFix) {\n s = self.string(s, def);\n // Allow the default to be undefined, null, false, etc.\n if (s === def) {\n return s;\n }\n // Strip characters browsers ignore that are commonly used to\n // smuggle dangerous schemes past validation.\n s = cleanHref(s);\n // Reject naughty URLs (e.g. `javascript:`, `data:`) before fixUrl\n // runs. Otherwise fixUrl could mask such schemes by prepending\n // `https://` to anything containing a `.`, turning\n // `javascript:alert(document.domain)` into a syntactically odd\n // but accepted `https://...` URL.\n if (naughtyHref(s)) {\n return def;\n }\n s = fixUrl(s);\n if (s === null) {\n return def;\n }\n return s;\n\n function fixUrl(href) {\n if (href.match(/^(((https?|ftp):\\/\\/)|((mailto|tel|sms):)|#|([^/.]+)?\\/|[^/.]+$)/)) {\n // All good - no change required\n return href;\n } else if (href.match(/^[^/.]+\\.[^/.]+/)) {\n // Smells like a domain name. Educated guess: they left off http://\n const protocol = httpsFix ? 'https://' : 'http://';\n return protocol + href;\n } else {\n return null;\n }\n };\n };\n\n self.select = function(s, choices, def) {\n s = self.string(s);\n if (!choices || !choices.length) {\n return def;\n }\n let choice;\n if (typeof (choices[0]) === 'object') {\n choice = choices.find(function(choice) {\n if ((choice.value === null) || (choice.value === undefined)) {\n // Don't crash on invalid choices\n return false;\n }\n return choice.value.toString() === s;\n });\n if (choice != null) {\n return choice.value;\n }\n return def;\n }\n choice = choices.find(function(choice) {\n if ((choice === null) || (choice === undefined)) {\n // Don't crash on invalid choices\n return false;\n }\n return choice.toString() === s;\n });\n if (choice !== undefined) {\n return choice;\n }\n return def;\n };\n\n self.boolean = function(b, def) {\n if (b === true) {\n return true;\n }\n if (b === false) {\n return false;\n }\n b = self.string(b, def);\n if (b === def) {\n if (b === undefined) {\n return false;\n }\n return b;\n }\n b = b.toLowerCase().charAt(0);\n if ((b === '') || (b === 'n') || (b === '0') || (b === 'f')) {\n return false;\n }\n if ((b === 't') || (b === 'y') || (b === '1')) {\n return true;\n }\n return false;\n };\n\n // Given an `options` object in which options[name] is a string\n // set to '0', '1', or 'any', this method adds mongodb criteria\n // to the `criteria` object.\n //\n // '0' or false means \"the property must be false or absent,\" '1' or true\n // means \"the property must be true,\" and 'any' or null means \"we don't care\n // what the property is.\"\n //\n // See `booleanOrNull` for additional synonyms accepted for the\n // three possible values.\n //\n // An empty string is considered equivalent to '0'.\n //\n // This is not the same as apos.sanitizeBoolean which is concerned only with\n // true or false and does not address \"any.\"\n //\n // `def` defaults to `any`.\n //\n // This method is most often used with REST API parameters and forms.\n\n self.addBooleanFilterToCriteria = function(options, name, criteria, def) {\n // if any or null, we aren't changing criteria\n if (def === undefined) {\n def = null;\n }\n\n // allow object or boolean\n let value = (typeof (options) === 'object' && options !== null) ? options[name] : options;\n value = (value === undefined) ? def : value;\n value = self.booleanOrNull(value);\n\n if (value === null) {\n // Don't care, show all\n } else if (!value) {\n // Must be absent or false. Hooray for $ne\n criteria[name] = { $ne: true };\n } else {\n // Must be true\n criteria[name] = true;\n }\n };\n\n // This method is used for tristate filters, i.e. \"published,\"\n // \"unpublished\", and \"show me both\".\n //\n // Accepts `true`, `false`, or `null` and returns them exactly\n // as such; if the parameter is none of those or their synonyms\n // below, returns `def`.\n //\n // Also accepts the strings `'yes'` (or starting with y), `'no'` (or\n // starting with n), `'true'` (or starting with t), `'false'`\n // (or starting with f), `'1'`, `'0'` and the strings `'any'` and\n // `'null'`. The string `'null'` must be an exact match, anything\n // else starting with `n` is taken as `no` (false).\n //\n // These various synonyms are useful for string input, such as from\n // a user friendly query string.\n\n self.booleanOrNull = function(b, def) {\n if (b === true) {\n return b;\n }\n if (b === false) {\n return b;\n }\n if (b === null) {\n return b;\n }\n\n b = self.string(b, def);\n if (b === def) {\n if (def === undefined) {\n return null;\n }\n return b;\n }\n\n // String 'null' must match as a full string to disambiguate from string 'n' for 'no'\n if (b === 'null') {\n return null;\n }\n\n b = b.toLowerCase().charAt(0);\n\n if ((b === '') || (b === 'n') || (b === '0') || (b === 'f')) {\n return false;\n }\n\n if ((b === 't') || (b === 'y') || (b === '1')) {\n return true;\n }\n\n if ((b === 'a')) {\n return null;\n }\n\n return def;\n };\n\n // Accept a user-entered string in YYYY-MM-DD, MM/DD, MM/DD/YY, or MM/DD/YYYY format\n // (tolerates missing leading zeroes on MM and DD). Also accepts a Date object.\n // Returns YYYY-MM-DD.\n //\n // The current year is assumed when MM/DD is used. If there is no explicit default\n // any unparseable date is returned as today's date.\n //\n // If the default is explicitly `null` (not `undefined`) then `null` is returned for\n // any unparseable date.\n //\n // The `now` argument can be passed for performance if you prefer to call\n // `new Date()` just once before many calls to this method and pass that single\n // value to all of them.\n\n self.date = function(date, def, now) {\n let components;\n\n function returnDefault() {\n if (def === undefined) {\n def = dayjs().format('YYYY-MM-DD');\n }\n return def;\n }\n\n if (typeof (date) === 'string') {\n if (date.match(/\\//)) {\n components = date.split('/');\n if (components.length === 2) {\n // Convert mm/dd to yyyy-mm-dd\n return (now || new Date()).getFullYear() + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n } else if (components.length === 3) {\n // Convert mm/dd/yy to mm/dd/yyyy\n if (components[2] < 100) {\n // Add the current century. If the result is more than\n // 50 years in the future, assume they meant the\n // previous century. Thus in 2015, we find that\n // we get the intuitive result for both 1/1/75,\n // 1/1/99 and 1/1/25. It's a nasty habit among\n // us imprecise humans. -Tom\n const d = (now || new Date());\n const nowYear = d.getFullYear() % 100;\n const nowCentury = d.getFullYear() - nowYear;\n let theirYear = parseInt(components[2]) + nowCentury;\n if (theirYear - d.getFullYear() > 50) {\n theirYear -= 100;\n }\n components[2] = theirYear;\n }\n // Convert mm/dd/yyyy to yyyy-mm-dd\n return self.padInteger(components[2], 4) + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n } else {\n return returnDefault();\n }\n } else if (date.match(/-/)) {\n components = date.split('-');\n if (components.length === 2) {\n // Convert mm-dd to yyyy-mm-dd\n return (now || new Date()).getFullYear() + '-' + self.padInteger(components[0], 2) + '-' + self.padInteger(components[1], 2);\n } else if (components.length === 3) {\n // Convert yyyy-mm-dd (with questionable padding) to yyyy-mm-dd\n return self.padInteger(components[0], 4) + '-' + self.padInteger(components[1], 2) + '-' + self.padInteger(components[2], 2);\n } else {\n return returnDefault();\n }\n }\n }\n try {\n if (date === null) {\n return returnDefault();\n }\n date = (now || new Date(date));\n if (isNaN(date.getTime())) {\n return returnDefault();\n }\n return date.getFullYear() + '-' + self.padInteger(date.getMonth() + 1, 2) + '-' + self.padInteger(date.getDate(), 2);\n } catch (e) {\n return returnDefault();\n }\n };\n\n // This is likely not relevent to you unless you're using Apostrophe\n // Given a date object, return a date string in Apostrophe's preferred sortable,\n // comparable, JSON-able format, which is YYYY-MM-DD. If `date` is undefined\n // the current date is used.\n self.formatDate = function(date) {\n return dayjs(date).format('YYYY-MM-DD');\n };\n\n // Accepts a user-entered string in 12-hour or 24-hour time and returns a string\n // in 24-hour time. This method is tolerant of syntax such as `4pm`; minutes and\n // seconds are optional.\n //\n // If `def` is not set the default is the current time.\n\n self.time = function(time, def) {\n time = self.string(time).toLowerCase();\n time = time.trim();\n const components = time.match(/^(\\d+)([:|.](\\d+))?([:|.](\\d+))?\\s*(am|pm|AM|PM|a|p|A|M)?$/);\n if (components) {\n let hours = parseInt(components[1], 10);\n const minutes = (components[3] !== undefined) ? parseInt(components[3], 10) : 0;\n const seconds = (components[5] !== undefined) ? parseInt(components[5], 10) : 0;\n let ampm = (components[6]) ? components[6].toLowerCase() : components[6];\n ampm = ampm && ampm.charAt(0);\n if ((hours === 12) && (ampm === 'a')) {\n hours -= 12;\n } else if ((hours === 12) && (ampm === 'p')) {\n // Leave it be\n } else if (ampm === 'p') {\n hours += 12;\n }\n if ((hours === 24) || (hours === '24')) {\n hours = 0;\n }\n return self.padInteger(hours, 2) + ':' + self.padInteger(minutes, 2) + ':' + self.padInteger(seconds, 2);\n } else {\n if (def !== undefined) {\n return def;\n }\n return dayjs().format('HH:mm');\n }\n };\n\n // This is likely not relevent to you unless you're using Apostrophe\n // Given a JavaScript Date object, return a time string in\n // Apostrophe's preferred sortable, comparable, JSON-able format:\n // 24-hour time, with seconds.\n //\n // If `date` is missing the current time is used.\n\n self.formatTime = function(date) {\n return dayjs(date).format('HH:mm:ss');\n };\n\n // Sanitize tags. Tags should be submitted as an array of strings,\n // or a comma-separated string.\n //\n // This method ensures the input is an array or string and, if\n // an array, that the elements of the array are strings.\n //\n // If a filterTag function is passed as an option when initializing\n // Launder, then all tags are passed through it (as individual\n // strings, one per call) and the return value is used instead. You\n // may also pass a filterTag when calling this function\n\n self.tags = function(tags, filter) {\n if (typeof (tags) === 'string') {\n tags = tags.split(/,\\s*/);\n }\n if (!Array.isArray(tags)) {\n return [];\n }\n const strings = tags.map(tag => self.string(tag));\n const rewritten = strings.map(filter || self.filterTag);\n const filtered = rewritten.filter(tag => tag.length > 0);\n return filtered;\n };\n\n // Sanitize an id. IDs must consist solely of upper and lower case\n // letters, numbers, and digits unless options.idRegExp is set.\n\n self.idRegExp = self.options.idRegExp || /^[A-Za-z0-9_]+$/;\n\n self.id = function(s, def) {\n const id = self.string(s, def);\n if (id === def) {\n return id;\n }\n if (!id.match(self.idRegExp)) {\n return def;\n }\n return id;\n };\n\n // Sanitize an array of IDs. IDs must consist solely of upper and lower case\n // letters and numbers, digits, and underscores. Any elements that are not\n // IDs are omitted from the final array.\n self.ids = function(ids) {\n if (!Array.isArray(ids)) {\n return [];\n }\n const result = ids.filter(function(id) {\n return (self.id(id) !== undefined);\n });\n return result;\n };\n return self;\n};\n\n// Expose `naughtyHref` statically so callers (notably sanitize-html)\n// can use it without instantiating a launder.\nmodule.exports.naughtyHref = naughtyHref;\n", "const htmlparser = require('htmlparser2');\nconst escapeStringRegexp = require('escape-string-regexp');\nconst { isPlainObject } = require('is-plain-object');\nconst parseSrcset = require('parse-srcset');\nconst { parse: postcssParse } = require('postcss');\nconst { naughtyHref: launderNaughtyHref } = require('launder');\n// Tags that can conceivably represent stand-alone media.\nconst mediaTags = [\n 'img', 'audio', 'video', 'picture', 'svg',\n 'object', 'map', 'iframe', 'embed'\n];\n// Tags that are inherently vulnerable to being used in XSS attacks.\nconst vulnerableTags = [ 'script', 'style' ];\n// SVG SMIL animation elements. These do not carry a URL themselves: they\n// retarget an attribute of another element, naming it with `attributeName`\n// and supplying the new value(s) in `values`, `from`, `to` and `by`.\nconst svgAnimationTags = [\n 'animate', 'animatecolor', 'animatemotion', 'animatetransform', 'set'\n];\n// Attribute names that always name a URL sink, whatever\n// `allowedSchemesAppliedToAttributes` has been narrowed to. A namespace prefix\n// is ignored when matching, so `xlink:href` and any other prefixed spelling of\n// `href` are covered.\nconst alwaysUrlAttributes = [ 'href' ];\n\n// Our own diagnostics. A console-shaped `logger` option takes them instead of\n// the console; missing methods fall back to it.\nconst severities = [ 'debug', 'info', 'warn', 'error' ];\n\nfunction loggerFor(options) {\n const source = (options && options.logger) || console;\n const logger = {};\n for (const severity of severities) {\n logger[severity] = typeof source[severity] === 'function'\n ? (...args) => source[severity](...args)\n // eslint-disable-next-line no-console\n : (...args) => console[severity](...args);\n }\n return logger;\n}\n\nfunction each(obj, cb) {\n if (obj) {\n Object.keys(obj).forEach(function (key) {\n cb(obj[key], key);\n });\n }\n}\n\n// Avoid false positives with .__proto__, .hasOwnProperty, etc.\nfunction has(obj, key) {\n return ({}).hasOwnProperty.call(obj, key);\n}\n\n// Combine the tag-specific and wildcard lists of allowed classes\nfunction mergeClasses(specific, wildcard) {\n if (!Array.isArray(specific) || !Array.isArray(wildcard)) {\n return wildcard;\n }\n return specific.concat(wildcard);\n}\n\n// Combine the tag-specific and wildcard allowed styles, concatenating the\n// lists of regular expressions for properties that appear in both. The result\n// has no prototype, so a property named `__proto__` is just another property\nfunction mergeStyles(specific, wildcard) {\n const merged = Object.create(null);\n for (const rules of [ specific, wildcard ]) {\n for (const prop of Object.keys(rules)) {\n merged[prop] = has(merged, prop)\n ? merged[prop].concat(rules[prop])\n : rules[prop];\n }\n }\n return merged;\n}\n\n// Returns those elements of `a` for which `cb(a)` returns truthy\nfunction filter(a, cb) {\n const n = [];\n each(a, function(v) {\n if (cb(v)) {\n n.push(v);\n }\n });\n return n;\n}\n\nfunction isEmptyObject(obj) {\n for (const key in obj) {\n if (has(obj, key)) {\n return false;\n }\n }\n return true;\n}\n\nfunction stringifySrcset(parsedSrcset) {\n return parsedSrcset.map(function(part) {\n if (!part.url) {\n throw new Error('URL missing');\n }\n\n return (\n part.url +\n (part.w ? ` ${part.w}w` : '') +\n (part.h ? ` ${part.h}h` : '') +\n (part.d ? ` ${part.d}x` : '')\n );\n }).join(', ');\n}\n\nmodule.exports = sanitizeHtml;\n\n// A valid attribute name.\n// We use a tolerant definition based on the set of strings defined by\n// html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state\n// and html.spec.whatwg.org/multipage/parsing.html#attribute-name-state .\n// The characters accepted are ones which can be appended to the attribute\n// name buffer without triggering a parse error:\n// * unexpected-equals-sign-before-attribute-name\n// * unexpected-null-character\n// * unexpected-character-in-attribute-name\n// We exclude the empty string because it's impossible to get to the after\n// attribute name state with an empty attribute name buffer.\nconst VALID_HTML_ATTRIBUTE_NAME = /^[^\\0\\t\\n\\f\\r /<=>]+$/;\n\n// How many discarded <iframe> elements can be nested while their fallback\n// markup is still re-sanitized as HTML (see the `ontext` handler). Deeper\n// fallback is escaped as text, so that crafted input cannot recurse without\n// bound or re-parse the remainder of the input once per iframe\n// (GHSA-c9rx-x947-fp3h).\nconst MAX_IFRAME_FALLBACK_DEPTH = 8;\n\n// `_fallback` is internal: it is set when re-sanitizing the fallback markup\n// of a discarded <iframe>, to carry the current nesting depth into the\n// recursive call.\n\nfunction sanitizeHtml(html, options, _fallback) {\n if (html == null) {\n return '';\n }\n const baseDepth = (_fallback && _fallback.depth) || 0;\n const iframeFallbackDepth = (_fallback && _fallback.iframeFallbackDepth) || 0;\n if (typeof html === 'number') {\n html = html.toString();\n }\n\n let result = '';\n // Used for hot swapping the result variable with an empty string\n // in order to \"capture\" the text written to it.\n let tempResult = '';\n\n function Frame(tag, attribs) {\n const that = this;\n this.tag = tag;\n this.attribs = attribs || {};\n this.tagPosition = result.length;\n this.text = ''; // Node inner text\n this.openingTagLength = 0;\n this.mediaChildren = [];\n\n this.updateParentNodeText = function() {\n if (stack.length) {\n const parentFrame = stack[stack.length - 1];\n parentFrame.text += that.text;\n }\n };\n\n this.updateParentNodeMediaChildren = function() {\n if (stack.length && mediaTags.includes(this.tag)) {\n const parentFrame = stack[stack.length - 1];\n parentFrame.mediaChildren.push(this.tag);\n }\n };\n }\n\n options = Object.assign({}, sanitizeHtml.defaults, options);\n options.parser = Object.assign({}, htmlParserDefaults, options.parser);\n\n const logger = loggerFor(options);\n\n const tagAllowed = function (name) {\n return options.allowedTags === false ||\n (options.allowedTags || []).indexOf(name) > -1;\n };\n\n // vulnerableTags\n vulnerableTags.forEach(function (tag) {\n if (tagAllowed(tag) && !options.allowVulnerableTags) {\n logger.warn(\n `Your \\`allowedTags\\` option includes \\`${tag}\\`, which is inherently ` +\n 'vulnerable to XSS attacks. Please remove it from `allowedTags`, or, ' +\n 'to disable this warning, add the `allowVulnerableTags` option and ' +\n 'ensure you are accounting for this risk.'\n );\n }\n });\n\n // Tags that contain something other than HTML, or where discarding\n // the text when the tag is disallowed makes sense for other reasons.\n // If we are not allowing these tags, we should drop their content too.\n // For other tags you would drop the tag but keep its content.\n // `xmp` is included because htmlparser2 treats it as a raw-text element,\n // so markup inside is parsed as text on input but would otherwise be\n // re-emitted unescaped via the `ontext` branch below, allowing XSS bypass\n // when `xmp` is disallowed (which is the default).\n const nonTextTagsArray = options.nonTextTags || [\n 'script',\n 'style',\n 'textarea',\n 'option',\n 'xmp'\n ];\n let allowedAttributesMap;\n let allowedAttributesGlobMap;\n if (options.allowedAttributes) {\n allowedAttributesMap = {};\n allowedAttributesGlobMap = {};\n each(options.allowedAttributes, function(attributes, tag) {\n allowedAttributesMap[tag] = [];\n const globRegex = [];\n attributes.forEach(function(obj) {\n if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n } else {\n allowedAttributesMap[tag].push(obj);\n }\n });\n if (globRegex.length) {\n allowedAttributesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n }\n });\n }\n const allowedClassesMap = {};\n const allowedClassesGlobMap = {};\n const allowedClassesRegexMap = {};\n each(options.allowedClasses, function(classes, tag) {\n // Implicitly allows the class attribute\n if (allowedAttributesMap) {\n if (!has(allowedAttributesMap, tag)) {\n allowedAttributesMap[tag] = [];\n }\n allowedAttributesMap[tag].push('class');\n }\n\n allowedClassesMap[tag] = classes;\n\n if (Array.isArray(classes)) {\n const globRegex = [];\n allowedClassesMap[tag] = [];\n allowedClassesRegexMap[tag] = [];\n classes.forEach(function(obj) {\n if (typeof obj === 'string' && obj.indexOf('*') >= 0) {\n globRegex.push(escapeStringRegexp(obj).replace(/\\\\\\*/g, '.*'));\n } else if (obj instanceof RegExp) {\n allowedClassesRegexMap[tag].push(obj);\n } else {\n allowedClassesMap[tag].push(obj);\n }\n });\n if (globRegex.length) {\n allowedClassesGlobMap[tag] = new RegExp('^(' + globRegex.join('|') + ')$');\n }\n }\n });\n\n const transformTagsMap = {};\n let transformTagsAll;\n each(options.transformTags, function(transform, tag) {\n let transFun;\n if (typeof transform === 'function') {\n transFun = transform;\n } else if (typeof transform === 'string') {\n transFun = sanitizeHtml.simpleTransform(transform);\n }\n if (tag === '*') {\n transformTagsAll = transFun;\n } else {\n transformTagsMap[tag] = transFun;\n }\n });\n\n let depth;\n let stack;\n let skipMap;\n let transformMap;\n let skipText;\n let skipTextDepth;\n // Browsers (with scripting enabled) parse <noscript> content as raw text up\n // to the first `</noscript`, but htmlparser2 parses it as markup, so an end\n // tag for an ancestor can make htmlparser2 close the <noscript> implicitly\n // much earlier. `rawTextEnd` is the source offset where the browser ends the\n // <noscript> being discarded, and `skipRawText` is set while htmlparser2 has\n // already closed it but the browser has not, so that we keep discarding\n // until we reach that offset (GHSA-x3q4-9hxx-gx8m).\n let rawTextEnd;\n let skipRawText;\n let addedText = false;\n\n initializeState();\n\n const parser = new htmlparser.Parser({\n onopentag: function(name, attribs) {\n if (options.onOpenTag) {\n options.onOpenTag(name, attribs);\n }\n updateRawTextRegion();\n\n // If `enforceHtmlBoundary` is `true` and this has found the opening\n // `html` tag, reset the state.\n if (options.enforceHtmlBoundary && name === 'html') {\n initializeState();\n }\n\n if (skipRawText) {\n return;\n }\n if (skipText) {\n skipTextDepth++;\n return;\n }\n const frame = new Frame(name, attribs);\n stack.push(frame);\n\n let skip = false;\n const hasText = !!frame.text;\n let transformedTag;\n if (has(transformTagsMap, name)) {\n transformedTag = transformTagsMap[name](name, attribs);\n\n frame.attribs = attribs = transformedTag.attribs;\n\n if (transformedTag.text !== undefined) {\n frame.innerText = transformedTag.text;\n }\n\n if (name !== transformedTag.tagName) {\n frame.name = name = transformedTag.tagName;\n transformMap[depth] = transformedTag.tagName;\n }\n }\n if (transformTagsAll) {\n transformedTag = transformTagsAll(name, attribs);\n\n frame.attribs = attribs = transformedTag.attribs;\n if (name !== transformedTag.tagName) {\n frame.name = name = transformedTag.tagName;\n transformMap[depth] = transformedTag.tagName;\n }\n }\n\n if (!tagAllowed(name) || animatesUrlAttribute(name, attribs) || (options.disallowedTagsMode === 'recursiveEscape' && !isEmptyObject(skipMap)) || (options.nestingLimit != null && depth >= options.nestingLimit)) {\n skip = true;\n skipMap[depth] = true;\n if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n if (nonTextTagsArray.indexOf(name) !== -1) {\n skipText = true;\n skipTextDepth = 1;\n if (frame.tag.toLowerCase() === 'noscript') {\n rawTextEnd = findRawTextEnd('noscript', parser.endIndex + 1);\n }\n }\n }\n }\n depth++;\n if (skip) {\n if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n // We want the contents but not this tag\n if (frame.innerText && !hasText) {\n const escaped = escapeHtml(frame.innerText);\n if (options.textFilter) {\n result += options.textFilter(escaped, name);\n } else {\n result += escaped;\n }\n addedText = true;\n }\n return;\n }\n tempResult = result;\n result = '';\n }\n result += '<' + name;\n\n if (name === 'script') {\n if (options.allowedScriptHostnames || options.allowedScriptDomains) {\n frame.innerText = '';\n }\n }\n\n const isBeingEscaped = skip && (options.disallowedTagsMode === 'escape' || options.disallowedTagsMode === 'recursiveEscape');\n const shouldPreserveEscapedAttributes = isBeingEscaped &&\n options.preserveEscapedAttributes;\n\n if (shouldPreserveEscapedAttributes) {\n each(attribs, function(value, a) {\n result += ' ' + a + '=\"' + escapeHtml((value || ''), true) + '\"';\n });\n } else if (!allowedAttributesMap || has(allowedAttributesMap, name) || allowedAttributesMap['*']) {\n each(attribs, function(value, a) {\n if (!VALID_HTML_ATTRIBUTE_NAME.test(a)) {\n // This prevents part of an attribute name in the output from being\n // interpreted as the end of an attribute, or end of a tag.\n delete frame.attribs[a];\n return;\n }\n // If the value is empty, check if the attribute is\n // in the allowedEmptyAttributes array.\n // If it is not in the allowedEmptyAttributes array,\n // and it is a known non-boolean attribute, delete it\n // List taken from https://html.spec.whatwg.org/multipage/indices.html#attributes-3\n if (value === '' && (!options.allowedEmptyAttributes.includes(a)) &&\n (options.nonBooleanAttributes.includes(a) || options.nonBooleanAttributes.includes('*'))) {\n delete frame.attribs[a];\n return;\n }\n // check allowedAttributesMap for the element and attribute and modify the value\n // as necessary if there are specific values defined.\n let passedAllowedAttributesMapCheck = false;\n if (!allowedAttributesMap ||\n (has(allowedAttributesMap, name) &&\n allowedAttributesMap[name].indexOf(a) !== -1) ||\n (allowedAttributesMap['*'] && allowedAttributesMap['*'].indexOf(a) !== -1) ||\n (has(allowedAttributesGlobMap, name) &&\n allowedAttributesGlobMap[name].test(a)) ||\n (allowedAttributesGlobMap['*'] && allowedAttributesGlobMap['*'].test(a))) {\n passedAllowedAttributesMapCheck = true;\n } else if (allowedAttributesMap && allowedAttributesMap[name]) {\n for (const o of allowedAttributesMap[name]) {\n if (isPlainObject(o) && o.name && (o.name === a)) {\n passedAllowedAttributesMapCheck = true;\n let newValue = '';\n if (o.multiple === true) {\n // verify the values that are allowed\n const splitStrArray = value.split(' ');\n for (const s of splitStrArray) {\n if (o.values.indexOf(s) !== -1) {\n if (newValue === '') {\n newValue = s;\n } else {\n newValue += ' ' + s;\n }\n }\n }\n } else if (o.values.indexOf(value) >= 0) {\n // verified an allowed value matches the entire attribute value\n newValue = value;\n }\n value = newValue;\n }\n }\n }\n if (passedAllowedAttributesMapCheck) {\n if (options.allowedSchemesAppliedToAttributes.indexOf(a) !== -1) {\n if (naughtyHref(name, value)) {\n delete frame.attribs[a];\n return;\n }\n }\n\n // `<meta http-equiv=\"refresh\" content=\"0;url=...\">` navigates to a\n // URL embedded in `content`, so scheme check that URL too\n // (GHSA-cv27-6wvh-8x7j). Other meta `content` values are left alone.\n if (name === 'meta' && a.toLowerCase() === 'content' && isRefresh(attribs) && naughtyRefresh(value)) {\n delete frame.attribs[a];\n return;\n }\n\n if (name === 'script' && a === 'src') {\n\n let allowed = true;\n\n try {\n const parsed = parseUrl(value);\n\n if (options.allowedScriptHostnames || options.allowedScriptDomains) {\n const allowedHostname = (options.allowedScriptHostnames || [])\n .find(function (hostname) {\n return hostname === parsed.url.hostname;\n });\n const allowedDomain = (options.allowedScriptDomains || [])\n .find(function(domain) {\n return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);\n });\n allowed = allowedHostname || allowedDomain;\n }\n } catch (e) {\n allowed = false;\n }\n\n if (!allowed) {\n delete frame.attribs[a];\n return;\n }\n }\n\n if (name === 'iframe' && a === 'src') {\n let allowed = true;\n try {\n const parsed = parseUrl(value);\n\n if (parsed.isRelativeUrl) {\n // default value of allowIframeRelativeUrls is true\n // unless allowedIframeHostnames or allowedIframeDomains specified\n allowed = has(options, 'allowIframeRelativeUrls')\n ? options.allowIframeRelativeUrls\n : (!options.allowedIframeHostnames && !options.allowedIframeDomains);\n } else if (\n options.allowedIframeHostnames ||\n options.allowedIframeDomains\n ) {\n const allowedHostname = (options.allowedIframeHostnames || [])\n .find(function (hostname) {\n return hostname === parsed.url.hostname;\n });\n const allowedDomain = (options.allowedIframeDomains || [])\n .find(function(domain) {\n return parsed.url.hostname === domain || parsed.url.hostname.endsWith(`.${domain}`);\n });\n allowed = allowedHostname || allowedDomain;\n }\n } catch (e) {\n // Unparseable iframe src\n allowed = false;\n }\n if (!allowed) {\n delete frame.attribs[a];\n return;\n }\n }\n if (a === 'srcset' || a === 'imagesrcset') {\n try {\n let parsed = parseSrcset(value);\n parsed.forEach(function(value) {\n if (naughtyHref(name, value.url)) {\n value.evil = true;\n }\n });\n parsed = filter(parsed, function(v) {\n return !v.evil;\n });\n if (!parsed.length) {\n delete frame.attribs[a];\n return;\n } else {\n value = stringifySrcset(filter(parsed, function(v) {\n return !v.evil;\n }));\n frame.attribs[a] = value;\n }\n } catch (e) {\n // Unparseable srcset\n delete frame.attribs[a];\n return;\n }\n }\n if (a === 'class') {\n const allowedSpecificClasses = allowedClassesMap[name];\n const allowedWildcardClasses = allowedClassesMap['*'];\n const allowedSpecificClassesGlob = allowedClassesGlobMap[name];\n const allowedSpecificClassesRegex = allowedClassesRegexMap[name];\n const allowedWildcardClassesRegex = allowedClassesRegexMap['*'];\n const allowedWildcardClassesGlob = allowedClassesGlobMap['*'];\n const allowedClassesGlobs = [\n allowedSpecificClassesGlob,\n allowedWildcardClassesGlob\n ]\n .concat(allowedSpecificClassesRegex, allowedWildcardClassesRegex)\n .filter(function (t) {\n return t;\n });\n if (allowedSpecificClasses && allowedWildcardClasses) {\n value = filterClasses(\n value,\n mergeClasses(allowedSpecificClasses, allowedWildcardClasses),\n allowedClassesGlobs\n );\n } else {\n value = filterClasses(\n value,\n allowedSpecificClasses || allowedWildcardClasses,\n allowedClassesGlobs\n );\n }\n if (!value.length) {\n delete frame.attribs[a];\n return;\n }\n }\n if (a === 'style') {\n if (options.parseStyleAttributes) {\n try {\n const abstractSyntaxTree = postcssParse(name + ' {' + value + '}', { map: false });\n const filteredAST = filterCss(\n abstractSyntaxTree,\n options.allowedStyles\n );\n\n value = stringifyStyleAttributes(filteredAST);\n\n if (value.length === 0) {\n delete frame.attribs[a];\n return;\n }\n } catch (e) {\n if (typeof window !== 'undefined') {\n logger.warn(\n `Failed to parse \"${name} {${value}}\". If you are ` +\n 'running this in a browser, we recommend disabling ' +\n 'style parsing with the parseStyleAttributes option, ' +\n 'since it only works in a node environment due to a ' +\n 'postcss dependency. More info: ' +\n 'https://github.com/apostrophecms/sanitize-html/issues/547'\n );\n }\n delete frame.attribs[a];\n return;\n }\n } else if (options.allowedStyles) {\n throw new Error('allowedStyles option cannot be used together with parseStyleAttributes: false.');\n }\n }\n result += ' ' + a;\n if (value && value.length) {\n result += '=\"' + escapeHtml(value, true) + '\"';\n } else if (options.allowedEmptyAttributes.includes(a)) {\n result += '=\"\"';\n }\n } else {\n delete frame.attribs[a];\n }\n });\n }\n if (options.selfClosing.indexOf(name) !== -1) {\n result += ' />';\n } else {\n result += '>';\n if (frame.innerText && !hasText) {\n const escaped = escapeHtml(frame.innerText);\n if (options.textFilter) {\n result += options.textFilter(escaped, name);\n } else {\n result += escaped;\n }\n addedText = true;\n }\n }\n if (skip) {\n result = tempResult + escapeHtml(result);\n tempResult = '';\n }\n frame.openingTagLength = result.length - frame.tagPosition;\n },\n ontext: function(text) {\n updateRawTextRegion();\n if (skipText || skipRawText) {\n return;\n }\n const lastFrame = stack[stack.length - 1];\n let tag;\n\n if (lastFrame) {\n tag = lastFrame.tag;\n // If inner text was set by transform function then let's use it\n text = lastFrame.innerText !== undefined ? lastFrame.innerText : text;\n }\n\n if (options.disallowedTagsMode === 'completelyDiscard' && !tagAllowed(tag)) {\n text = '';\n } else if (tag && tagAllowed(tag) && (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') && ((tag === 'script') || (tag === 'style'))) {\n // htmlparser2 gives us these as-is. Escaping them ruins the content. Allowing\n // script tags is, by definition, game over for XSS protection, so if that's\n // your concern, don't allow them. The same is essentially true for style tags\n // which have their own collection of XSS vectors.\n result += text;\n } else if (tag && tagAllowed(tag) && (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') && (tag === 'textarea' || tag === 'xmp')) {\n // <textarea> and <xmp> hold text that must not be re-emitted verbatim:\n // if a raw `<` survives into the output it can reopen a tag when the\n // result is re-parsed by a browser, smuggling non-allowlisted markup\n // through the allowlist (mutation-XSS, GHSA-jxwj-j7wr-gfrw \u2014 e.g. the\n // `</textarea/>` solidus mis-close). We therefore ALWAYS escape this\n // content rather than passing it through. Escaping unconditionally also\n // closes the related SVG/MathML foreign-content bypass (where the HTML5\n // parser treats <textarea>/<xmp> as ordinary foreign elements and a\n // browser re-parses their contents as live markup, e.g.\n // `<svg><textarea><img src=x onerror=alert(1)></textarea></svg>`): since\n // we never re-emit raw text for these tags, no namespace check is\n // needed. The two tags need different escaping because htmlparser2\n // tokenizes them differently:\n if (tag === 'xmp') {\n // <xmp> is a raw-text (CDATA) element: entities are NOT decoded, so\n // its content reaches us as raw source that is already entity-encoded.\n // Escape only the angle brackets so a literal `<` cannot reopen a tag,\n // while leaving `&` untouched to avoid double-encoding entities that\n // are already encoded in the source.\n result += text.replace(/</g, '<').replace(/>/g, '>');\n } else {\n // <textarea> is an RCDATA element: htmlparser2 (>= 11) decodes\n // entities inside it, so its content reaches us as plain decoded text.\n // It must therefore be fully escaped like any other text \u2014 escaping\n // `&` as well as `<`/`>` \u2014 so entities round-trip faithfully (no\n // double-encoding, see the CVE-2026-40186 regression tests) and no\n // `<` can reopen a tag.\n result += escapeHtml(text, false);\n }\n // Other \"nonTextTags\" like <option> are not raw text elements in\n // htmlparser2, so their contents are decoded and must be escaped below\n // like any other text (important to prevent XSS via entity-encoded\n // payloads such as <option><script>...</script></option>).\n } else if (\n // htmlparser2 treats <iframe> as a raw-text element, so markup inside\n // (including after an unclosed <iframe>) arrives as a single text node.\n // When the iframe is discarded, re-sanitize that fallback markup as HTML\n // instead of escaping it as plain text (issue #5550).\n // The nested call continues from the current depth so that\n // `nestingLimit` applies to the whole output.\n tag === 'iframe' &&\n !tagAllowed(tag) &&\n options.disallowedTagsMode === 'discard' &&\n iframeFallbackDepth < MAX_IFRAME_FALLBACK_DEPTH\n ) {\n result += sanitizeHtml(text, options, {\n depth,\n iframeFallbackDepth: iframeFallbackDepth + 1\n });\n } else if (!addedText) {\n const escaped = escapeHtml(text, false);\n if (options.textFilter) {\n result += options.textFilter(escaped, tag);\n } else {\n result += escaped;\n }\n }\n if (stack.length) {\n const frame = stack[stack.length - 1];\n frame.text += text;\n }\n },\n onclosetag: function(name, isImplied) {\n if (options.onCloseTag) {\n options.onCloseTag(name, isImplied);\n }\n\n updateRawTextRegion();\n if (skipRawText) {\n // Still inside the browser's raw text: only close elements that were\n // opened before the discarded region, so the output stays balanced.\n const lastFrame = stack[stack.length - 1];\n if (!lastFrame || lastFrame.tag !== name) {\n return;\n }\n } else if (skipText) {\n skipTextDepth--;\n if (!skipTextDepth) {\n skipText = false;\n if (rawTextEnd !== null) {\n // htmlparser2 closed the element implicitly (e.g. an ancestor's\n // end tag) before the browser would. Close its frame below, but\n // keep discarding up to the browser's end tag.\n skipRawText = true;\n }\n } else {\n return;\n }\n }\n\n const frame = stack.pop();\n if (!frame) {\n // Do not crash on bad markup\n return;\n }\n\n if (frame.tag !== name) {\n // Another case of bad markup.\n // Push to stack, so that it will be used in future closing tags.\n stack.push(frame);\n return;\n }\n\n skipText = options.enforceHtmlBoundary ? name === 'html' : false;\n depth--;\n const skip = skipMap[depth];\n if (skip) {\n delete skipMap[depth];\n if (options.disallowedTagsMode === 'discard' || options.disallowedTagsMode === 'completelyDiscard') {\n frame.updateParentNodeText();\n return;\n }\n tempResult = result;\n result = '';\n }\n\n if (transformMap[depth]) {\n name = transformMap[depth];\n delete transformMap[depth];\n }\n\n if (options.exclusiveFilter) {\n const filterResult = options.exclusiveFilter(frame);\n if (filterResult === 'excludeTag') {\n if (skip) {\n // no longer escaping the tag since it's not added at all\n result = tempResult;\n tempResult = '';\n }\n // remove the opening tag from the result\n result = result.substring(0, frame.tagPosition) +\n result.substring(frame.tagPosition + frame.openingTagLength);\n return;\n } else if (filterResult) {\n result = result.substring(0, frame.tagPosition);\n return;\n }\n }\n\n frame.updateParentNodeMediaChildren();\n frame.updateParentNodeText();\n\n if (\n // Already output />\n options.selfClosing.indexOf(name) !== -1 ||\n // Escaped tag, closing tag is implied\n (isImplied && !tagAllowed(name) && [ 'escape', 'recursiveEscape' ].indexOf(options.disallowedTagsMode) >= 0)\n ) {\n if (skip) {\n result = tempResult;\n tempResult = '';\n }\n return;\n }\n\n result += '</' + name + '>';\n if (skip) {\n result = tempResult + escapeHtml(result);\n tempResult = '';\n }\n addedText = false;\n }\n }, options.parser);\n parser.write(html);\n parser.end();\n\n if (options.disallowedTagsMode === 'escape' || options.disallowedTagsMode === 'recursiveEscape') {\n const lastParsedIndex = parser.endIndex;\n if (lastParsedIndex != null && lastParsedIndex >= 0 &&\n lastParsedIndex < html.length) {\n const unparsed = html.substring(lastParsedIndex);\n result += escapeHtml(unparsed);\n } else if ((lastParsedIndex == null || lastParsedIndex < 0) && html.length > 0 && result === '') {\n result = escapeHtml(html);\n }\n }\n\n return result;\n\n function initializeState() {\n result = '';\n depth = baseDepth;\n stack = [];\n skipMap = {};\n transformMap = {};\n skipText = false;\n skipTextDepth = 0;\n rawTextEnd = null;\n skipRawText = false;\n }\n\n // Leave the raw text region once the parser reaches the offset where the\n // browser ends it.\n function updateRawTextRegion() {\n if (rawTextEnd !== null && parser.startIndex >= rawTextEnd) {\n rawTextEnd = null;\n skipRawText = false;\n }\n }\n\n // Offset of the end tag that ends a raw text element in a browser: the\n // first case-insensitive `</name` followed by HTML whitespace, `/` or `>`.\n // With no such end tag the element runs to the end of the input.\n function findRawTextEnd(tagName, from) {\n const re = new RegExp('</' + tagName + '[\\\\t\\\\n\\\\f\\\\r />]', 'ig');\n re.lastIndex = from;\n const match = re.exec(html);\n return match ? match.index : Infinity;\n }\n\n function escapeHtml(s, quote) {\n if (typeof (s) !== 'string') {\n s = s + '';\n }\n if (options.parser.decodeEntities) {\n s = s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n if (quote) {\n s = s.replace(/\"/g, '"');\n }\n }\n // TODO: this is inadequate because it will pass `&0;`. This approach\n // will not work, each & must be considered with regard to whether it\n // is followed by a 100% syntactically valid entity or not, and escaped\n // if it is not. If this bothers you, don't set parser.decodeEntities\n // to false. (The default is true.)\n s = s.replace(/&(?![a-zA-Z0-9#]{1,20};)/g, '&') // Match ampersands not part of existing HTML entity\n .replace(/</g, '<')\n .replace(/>/g, '>');\n if (quote) {\n s = s.replace(/\"/g, '"');\n }\n return s;\n }\n\n function naughtyHref(name, href) {\n // Resolve the per-tag scheme allowlist if one is configured for\n // this tag, otherwise fall back to the global allowedSchemes.\n const allowedSchemes = has(options.allowedSchemesByTag, name)\n ? options.allowedSchemesByTag[name]\n : (options.allowedSchemes || []);\n return launderNaughtyHref(href, {\n allowedSchemes,\n allowProtocolRelative: options.allowProtocolRelative\n });\n }\n\n function isRefresh(attribs) {\n return Object.keys(attribs).some(function(a) {\n return a.toLowerCase() === 'http-equiv' &&\n String(attribs[a]).trim().toLowerCase() === 'refresh';\n });\n }\n\n // True if the `content` of a `<meta http-equiv=\"refresh\">` must be dropped:\n // its destination URL fails the scheme policy, or it cannot be parsed as a\n // refresh at all (a browser would ignore it then, so nothing is lost).\n // Extracts the URL the way the HTML standard's \"shared declarative refresh\n // steps\" do, so that spelling, separator, quoting and case variations of\n // `url=`, or no `url=` at all, all yield the URL a browser would navigate to.\n function naughtyRefresh(content) {\n const input = String(content);\n const isWhitespace = function(c) {\n return c === ' ' || c === '\\t' || c === '\\n' || c === '\\f' || c === '\\r';\n };\n let position = 0;\n const skipWhitespace = function() {\n while (position < input.length && isWhitespace(input[position])) {\n position++;\n }\n };\n const lowerAt = function(i) {\n return (input[i] || '').toLowerCase();\n };\n skipWhitespace();\n const timeStart = position;\n while (position < input.length && /[0-9.]/.test(input[position])) {\n position++;\n }\n if (position === timeStart) {\n return true;\n }\n if (position < input.length) {\n const c = input[position];\n if (c !== ';' && c !== ',' && !isWhitespace(c)) {\n return true;\n }\n skipWhitespace();\n if (input[position] === ';' || input[position] === ',') {\n position++;\n }\n skipWhitespace();\n }\n if (position >= input.length) {\n // No URL: refreshes the current document\n return false;\n }\n let url = input.slice(position);\n let quoted = true;\n if (lowerAt(position) === 'u') {\n quoted = false;\n if (lowerAt(position + 1) === 'r' && lowerAt(position + 2) === 'l') {\n position += 3;\n skipWhitespace();\n if (input[position] === '=') {\n position++;\n skipWhitespace();\n quoted = true;\n }\n }\n }\n if (quoted) {\n const quote = input[position];\n if (quote === '\"' || quote === '\\'') {\n position++;\n }\n url = input.slice(position);\n if (quote === '\"' || quote === '\\'') {\n const end = url.indexOf(quote);\n if (end !== -1) {\n url = url.slice(0, end);\n }\n }\n }\n return naughtyHref('meta', url);\n }\n\n // True if this is an SVG SMIL animation element that animates a URL-bearing\n // attribute, e.g. `<animate attributeName=\"href\" values=\"#safe;javascript:...\">`.\n //\n // Such an element carries no URL of its own: the browser copies the animation\n // values into the target attribute *after* sanitization, so a `javascript:`\n // destination reaches a live link sink without ever being scheme checked.\n // `values` compounds this, because it is a semicolon-separated LIST of\n // destinations: checking it as one flat URL only validates its first entry, so\n // a leading `#safe` fragment carries the rest of the list past the policy.\n //\n // Re-checking each entry of each value attribute would leave the safety of the\n // output resting on our imitation of SMIL list parsing, so we reject the\n // animation on the strength of its target instead. Animations of attributes\n // that are not URL sinks, such as `fill` or `opacity`, are unaffected.\n function animatesUrlAttribute(name, attribs) {\n // In an XML serialization a prefixed name such as `svg:animate` is the same\n // element as `animate`, so match on the local name (GHSA-374f-7chj-9948).\n if (svgAnimationTags.indexOf(localPart(name)) === -1) {\n return false;\n }\n const schemeCheckedAttributes = options.allowedSchemesAppliedToAttributes || [];\n return Object.keys(attribs || {}).some(function(attributeName) {\n if (localPart(attributeName) !== 'attributename') {\n return false;\n }\n const target = (attribs[attributeName] || '').trim().toLowerCase();\n // The target may be namespace prefixed (`xlink:href`). Which prefixes are\n // in scope depends on the document, so consider the local name too.\n const localName = target.slice(target.lastIndexOf(':') + 1);\n return alwaysUrlAttributes.indexOf(localName) !== -1 ||\n schemeCheckedAttributes.indexOf(target) !== -1 ||\n schemeCheckedAttributes.indexOf(localName) !== -1;\n });\n }\n\n // Lowercased name with any namespace prefix removed.\n function localPart(name) {\n const lower = name.toLowerCase();\n return lower.slice(lower.lastIndexOf(':') + 1);\n }\n\n function parseUrl(value) {\n value = value.replace(/^(\\w+:)?\\s*[\\\\/]\\s*[\\\\/]/, '$1//');\n if (value.startsWith('relative:')) {\n // An attempt to exploit our workaround for base URLs being\n // mandatory for relative URL validation in the WHATWG\n // URL parser, reject it\n throw new Error('relative: exploit attempt');\n }\n // naughtyHref is in charge of whether protocol relative URLs\n // are cool. Here we are concerned just with allowed hostnames and\n // whether to allow relative URLs.\n //\n // Build a placeholder \"base URL\" against which any reasonable\n // relative URL may be parsed successfully\n let base = 'relative://relative-site';\n for (let i = 0; (i < 100); i++) {\n base += `/${i}`;\n }\n\n const parsed = new URL(value, base);\n\n const isRelativeUrl = parsed && parsed.hostname === 'relative-site' && parsed.protocol === 'relative:';\n return {\n isRelativeUrl,\n url: parsed\n };\n }\n /**\n * Filters user input css properties by allowlisted regex attributes.\n * Modifies the abstractSyntaxTree object.\n *\n * @param {object} abstractSyntaxTree - Object representation of CSS attributes.\n * @property {array[Declaration]} abstractSyntaxTree.nodes[0] -\n * Each object contains prop and value key, i.e { prop: 'color', value: 'red' }.\n * @param {object} allowedStyles - Keys are properties (i.e color),\n * value is list of permitted regex rules (i.e /green/i).\n * @return {object} - The modified tree.\n */\n function filterCss(abstractSyntaxTree, allowedStyles) {\n if (!allowedStyles) {\n return abstractSyntaxTree;\n }\n\n const astRules = abstractSyntaxTree.nodes[0];\n let selectedRule;\n\n // Merge global and tag-specific styles into new AST.\n if (allowedStyles[astRules.selector] && allowedStyles['*']) {\n selectedRule = mergeStyles(\n allowedStyles[astRules.selector],\n allowedStyles['*']\n );\n } else {\n selectedRule = allowedStyles[astRules.selector] || allowedStyles['*'];\n }\n\n if (selectedRule) {\n abstractSyntaxTree.nodes[0].nodes = astRules.nodes\n .reduce(filterDeclarations(selectedRule), []);\n }\n\n return abstractSyntaxTree;\n }\n\n /**\n * Extracts the style attributes from an AbstractSyntaxTree and formats those\n * values in the inline style attribute format.\n *\n * @param {AbstractSyntaxTree} filteredAST\n * @return {string} - Example:\n * \"color:yellow;text-align:center !important;font-family:helvetica;\"\n */\n function stringifyStyleAttributes(filteredAST) {\n return filteredAST.nodes[0].nodes\n .reduce(function(extractedAttributes, attrObject) {\n extractedAttributes.push(\n `${attrObject.prop}:${attrObject.value}${attrObject.important ? ' !important' : ''}`\n );\n return extractedAttributes;\n }, [])\n .join(';');\n }\n\n /**\n * Filters the existing attributes for the given property. Discards any attributes\n * which don't match the allowlist.\n *\n * @param {object} selectedRule - Example: { color: red, font-family: helvetica }\n * @param {array} allowedDeclarationsList - List of declarations\n * which pass the allowlist.\n * @param {object} attributeObject - Object representing the current css property.\n * @property {string} attributeObject.type - Typically 'declaration'.\n * @property {string} attributeObject.prop - The CSS property, i.e 'color'.\n * @property {string} attributeObject.value - The corresponding value to\n * the css property, i.e 'red'.\n * @return {function} - When used in Array.reduce,\n * will return an array of Declaration objects\n */\n function filterDeclarations(selectedRule) {\n return function (allowedDeclarationsList, attributeObject) {\n // If this property is allowlisted...\n if (has(selectedRule, attributeObject.prop)) {\n const matchesRegex = selectedRule[attributeObject.prop]\n .some(function(regularExpression) {\n return regularExpression.test(attributeObject.value);\n });\n\n if (matchesRegex) {\n allowedDeclarationsList.push(attributeObject);\n }\n }\n return allowedDeclarationsList;\n };\n }\n\n function filterClasses(classes, allowed, allowedGlobs) {\n if (!allowed) {\n // The class attribute is allowed without filtering on this tag\n return classes;\n }\n classes = classes.split(/\\s+/);\n return classes.filter(function(clss) {\n return allowed.indexOf(clss) !== -1 || allowedGlobs.some(function(glob) {\n return glob.test(clss);\n });\n }).join(' ');\n }\n}\n\n// Defaults are accessible to you so that you can use them as a starting point\n// programmatically if you wish\n\nconst htmlParserDefaults = {\n decodeEntities: true\n};\nsanitizeHtml.defaults = {\n allowedTags: [\n // Sections derived from MDN element categories and limited to the more\n // benign categories.\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element\n // Content sectioning\n 'address', 'article', 'aside', 'footer', 'header',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hgroup',\n 'main', 'nav', 'section',\n // Text content\n 'blockquote', 'dd', 'div', 'dl', 'dt', 'figcaption', 'figure',\n 'hr', 'li', 'menu', 'ol', 'p', 'pre', 'ul',\n // Inline text semantics\n 'a', 'abbr', 'b', 'bdi', 'bdo', 'br', 'cite', 'code', 'data', 'dfn',\n 'em', 'i', 'kbd', 'mark', 'q',\n 'rb', 'rp', 'rt', 'rtc', 'ruby',\n 's', 'samp', 'small', 'span', 'strong', 'sub', 'sup', 'time', 'u', 'var', 'wbr',\n // Table content\n 'caption', 'col', 'colgroup', 'table', 'tbody', 'td', 'tfoot', 'th',\n 'thead', 'tr'\n ],\n // Tags that cannot be boolean\n nonBooleanAttributes: [\n 'abbr', 'accept', 'accept-charset', 'accesskey', 'action',\n 'allow', 'alt', 'as', 'autocapitalize', 'autocomplete',\n 'blocking', 'charset', 'cite', 'class', 'color', 'cols',\n 'colspan', 'content', 'contenteditable', 'coords', 'crossorigin',\n 'data', 'datetime', 'decoding', 'dir', 'dirname', 'download',\n 'draggable', 'enctype', 'enterkeyhint', 'fetchpriority', 'for',\n 'form', 'formaction', 'formenctype', 'formmethod', 'formtarget',\n 'headers', 'height', 'hidden', 'high', 'href', 'hreflang',\n 'http-equiv', 'id', 'imagesizes', 'imagesrcset', 'inputmode',\n 'integrity', 'is', 'itemid', 'itemprop', 'itemref', 'itemtype',\n 'kind', 'label', 'lang', 'list', 'loading', 'low', 'max',\n 'maxlength', 'media', 'method', 'min', 'minlength', 'name',\n 'nonce', 'optimum', 'pattern', 'ping', 'placeholder', 'popover',\n 'popovertarget', 'popovertargetaction', 'poster', 'preload',\n 'referrerpolicy', 'rel', 'rows', 'rowspan', 'sandbox', 'scope',\n 'shape', 'size', 'sizes', 'slot', 'span', 'spellcheck', 'src',\n 'srcdoc', 'srclang', 'srcset', 'start', 'step', 'style',\n 'tabindex', 'target', 'title', 'translate', 'type', 'usemap',\n 'value', 'width', 'wrap',\n // Event handlers\n 'onauxclick', 'onafterprint', 'onbeforematch', 'onbeforeprint',\n 'onbeforeunload', 'onbeforetoggle', 'onblur', 'oncancel',\n 'oncanplay', 'oncanplaythrough', 'onchange', 'onclick', 'onclose',\n 'oncontextlost', 'oncontextmenu', 'oncontextrestored', 'oncopy',\n 'oncuechange', 'oncut', 'ondblclick', 'ondrag', 'ondragend',\n 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart',\n 'ondrop', 'ondurationchange', 'onemptied', 'onended',\n 'onerror', 'onfocus', 'onformdata', 'onhashchange', 'oninput',\n 'oninvalid', 'onkeydown', 'onkeypress', 'onkeyup',\n 'onlanguagechange', 'onload', 'onloadeddata', 'onloadedmetadata',\n 'onloadstart', 'onmessage', 'onmessageerror', 'onmousedown',\n 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout',\n 'onmouseover', 'onmouseup', 'onoffline', 'ononline', 'onpagehide',\n 'onpageshow', 'onpaste', 'onpause', 'onplay', 'onplaying',\n 'onpopstate', 'onprogress', 'onratechange', 'onreset', 'onresize',\n 'onrejectionhandled', 'onscroll', 'onscrollend',\n 'onsecuritypolicyviolation', 'onseeked', 'onseeking', 'onselect',\n 'onslotchange', 'onstalled', 'onstorage', 'onsubmit', 'onsuspend',\n 'ontimeupdate', 'ontoggle', 'onunhandledrejection', 'onunload',\n 'onvolumechange', 'onwaiting', 'onwheel'\n ],\n disallowedTagsMode: 'discard',\n allowedAttributes: {\n a: [ 'href', 'name', 'target' ],\n // We don't currently allow img itself by default, but\n // these attributes would make sense if we did.\n img: [ 'src', 'srcset', 'alt', 'title', 'width', 'height', 'loading' ]\n },\n allowedEmptyAttributes: [\n 'alt'\n ],\n // Lots of these won't come up by default because we don't allow them\n selfClosing: [ 'img', 'br', 'hr', 'area', 'base', 'basefont', 'input', 'link', 'meta', 'col' ],\n // URL schemes we permit\n allowedSchemes: [ 'http', 'https', 'ftp', 'mailto', 'tel' ],\n allowedSchemesByTag: {},\n allowedSchemesAppliedToAttributes: [\n 'href', 'src', 'cite',\n 'action', 'formaction', 'data', 'xlink:href',\n 'poster', 'background', 'ping',\n 'longdesc', 'usemap', 'codebase', 'classid', 'archive',\n 'profile', 'manifest', 'itemid',\n 'dynsrc', 'lowsrc'\n ],\n allowProtocolRelative: true,\n enforceHtmlBoundary: false,\n parseStyleAttributes: true,\n preserveEscapedAttributes: false\n};\n\nsanitizeHtml.simpleTransform = function(newTagName, newAttribs, merge) {\n merge = (merge === undefined) ? true : merge;\n newAttribs = newAttribs || {};\n\n return function(tagName, attribs) {\n let attrib;\n if (merge) {\n for (attrib in newAttribs) {\n attribs[attrib] = newAttribs[attrib];\n }\n } else {\n attribs = newAttribs;\n }\n\n return {\n tagName: newTagName,\n attribs\n };\n };\n};\n", "import _i18next from 'i18next';\nimport { MarketCode } from '../@types/MarketCode';\nimport { nbNO, svSE } from '../translation';\nimport { getLanguage } from './market';\n\nconst i18next: typeof _i18next = _i18next.createInstance();\n\nexport const t = (key: string, options?: any): string => i18next?.t(key, options) as string;\n\nexport const initializeI18N = (marketCode?: MarketCode) => {\n const locale = getLanguage(marketCode);\n\n i18next.init({\n lng: locale,\n resources: {\n 'sv-SE': {\n translation: svSE,\n },\n 'nb-NO': {\n translation: nbNO,\n },\n },\n });\n};\n\nexport default i18next;\n", "const nbNO = {\n glossary: {\n change: 'Endre',\n showPrevious: 'Vis forrige',\n showNext: 'Vis neste',\n showPreviousImage: 'Vis forrige bilde',\n showNextImage: 'Vis neste bilde',\n readMore: 'Les mer',\n closeModal: 'Lukk modalen',\n homeUrl: 'https://www.drive.no',\n goToHome: 'G\u00E5 til drive.no',\n company: 'Drive',\n modalTitle: 'Drive Ecom',\n add: 'Legg til',\n chosen: 'Valgt',\n ourAdvantages: 'Fordeler med \u00E5 kj\u00F8pe bilen online hos oss',\n showHelp: 'Vis hjelp',\n closeHelp: 'Lukk hjelp',\n whatDoesThisMean: 'Hva betyr dette?',\n buyOnline: 'Kj\u00F8p online hos oss',\n },\n confirmClose: {\n heading: 'Bilen er ikke reservert enn\u00E5',\n message:\n 'Du har ikke klikket deg gjennom alle trinnene som kreves for at bestillingen skal fullf\u00F8res og bilen skal reserveres til deg. Er du sikker p\u00E5 at du vil avslutte bestillingen din?',\n abortButton: 'Fortsett min bestilling',\n confirmButton: 'Avbryt min bestilling',\n },\n accessoryItemInfo: {\n backButton: 'Tilbake',\n logoAlt: 'Produsentens logo for',\n },\n accessories: {\n title: 'Tilbeh\u00F8r',\n noSelected: 'Ingen valgt',\n changeButtonTitle: 'Endre tilbeh\u00F8r',\n heading: 'Vil du kj\u00F8pe tilbeh\u00F8r til din nye bil?',\n description: 'Her viser vi noen av tilbeh\u00F8rene som passer til din nye bil.',\n proceedButton: 'G\u00E5 videre',\n skipButton: 'Hopp over dette trinnet',\n },\n centralStorage: {\n title: 'Sentral lager',\n heading: 'Hvilket anlegg vil du kj\u00F8pe fra?',\n description:\n 'Dette kj\u00F8ret\u00F8yet er en sentrallagerbil og er tilgjengelig fra flere anlegg. Velg anlegget du vil handle fra.',\n changeButtonTitle: 'Endre',\n proceedButton: 'G\u00E5 videre',\n errorMessage: 'En feil oppstod, og det var ikke mulig \u00E5 velge ovennevnte anlegg. Pr\u00F8v igjen.',\n dealerSelection: 'Valg av anlegg',\n addressMissing: 'Adresse mangler',\n },\n confirmation: {\n title: 'Fullf\u00F8r bestillingen',\n paymentTitle: 'Betaling',\n heading: 'Nesten ferdig!',\n description:\n 'For \u00E5 reservere bilen til deg trenger vi bare \u00E5 verifisere din identitet med BankID. Etter det vil {{name}} kontakte deg for \u00E5 fullf\u00F8re kj\u00F8pet.',\n description2:\n 'Kj\u00F8pet blir f\u00F8rst bindende etter signering av endelig tilbud fra {{name}}. Det er ogs\u00E5 da betalingen vil foreg\u00E5.',\n ageError:\n 'Du m\u00E5 v\u00E6re over 18 \u00E5r for \u00E5 kunne fortsette. Identifisering med BankID viser at du er under 18 \u00E5r gammel.',\n requestError: 'En feil oppstod, og det var ikke mulig \u00E5 opprette bestillingen, pr\u00F8v igjen.',\n notAvailable: 'Denne bilen er dessverre ikke lenger tilgjengelig.',\n socialIdNotMatchingError:\n 'Personnummeret i f\u00F8rste trinn samsvarer ikke med det som er knyttet til BankID',\n confirmConditionsTitle: 'Jeg godkjenner {{link}}.',\n insuranceText: 'og har tatt del av informasjonen om forsikringsformidling',\n reserveButton: 'Reserver bilen',\n policyText: 'Dine personopplysninger behandles og lagres i samsvar med v\u00E5r {{link}}.',\n reservationDisclaimer:\n 'Vi forbeholder oss retten til eventuelle endringer i tilgjengeligheten av tilbudte biler.',\n bankIdDescriptionQrCode:\n 'For \u00E5 verifisere din identitet, start BankID-applikasjonen p\u00E5 din andre enhet.',\n bankIdDescriptionSameDevice: 'For \u00E5 verifisere din identitet, start BankID-applikasjonen.',\n bankIdErrorMessage: 'Det var ikke mulig \u00E5 hente status for n\u00E5v\u00E6rende BankID-signering.',\n bankIdQrCodeErrorMessage: 'Det var ikke mulig \u00E5 hente ny QR-kode for BankID-signering.',\n bankIdInitErrorMessage: 'Det var dessverre ikke mulig \u00E5 initiere BankID. Vennligst pr\u00F8v igjen.',\n bankIdCompletedMessage: 'Verifisering fullf\u00F8rt, bestillingen opprettes n\u00E5...',\n paymentHeading: 'Velg betalingsm\u00E5te',\n paymentDescription:\n 'Gjennomf\u00F8r en forskuddsbetaling p\u00E5 5% av bilens pris (10 995 kr) for \u00E5 reservere bilen. Velg hvordan du vil gjennomf\u00F8re betalingen.',\n paymentDescription2:\n 'Resterende del av kontantinnsatsen 32 985 kr med eventuelt fradrag for innbyttebil betales hos {{name}} ved kontraktsignering.',\n paymentCardType: 'Korttype',\n paymentCardTypeValue: 'Kreditt',\n paymentCardNo3DSecure: 'Kort uten 3D secure',\n paymentCardNo3DSecureValue: '4925000000000004',\n paymentCard3DSecure: 'Kort med 3D secure',\n paymentCard3DSecureValue: '4761739001010416',\n paymentExpiry: 'MM/\u00C5\u00C5:',\n paymentExpiryValue: '12/25',\n paymentCVC: 'CVC:',\n paymentCVCValue: '123',\n privacyPolicy: 'personvernpolicy',\n purchaseTermsAndCancellationPolicy: 'kj\u00F8psvilk\u00E5r og vilk\u00E5r for angrerett',\n noVerifyConfirmMessage: 'Elit in eiusmod cupidatat tempor elit fugiat ad.',\n },\n customer: {\n title: 'Dine opplysninger',\n changeButtonTitle: 'Endre dine opplysninger',\n email: 'E-post',\n phone: 'Telefonnummer',\n socialId: 'Personnummer',\n name: 'Navn',\n givenName: 'Fornavn',\n surname: 'Etternavn',\n address: 'Adresse',\n street: 'Gateadresse',\n street2: 'Leilighet, etasje, etc.',\n registeredAddress: 'Registrert adresse',\n postalCode: 'Postnummer',\n city: 'Poststed',\n contactInfoTitle: 'Kontaktinformasjon',\n contactInfoDescription: 'Oppgi din e-postadresse og telefonnummer.',\n emailPlaceholder: 'Oppgi din e-postadresse',\n emailErrorMessage: 'En gyldig e-postadresse m\u00E5 oppgis',\n phonePlaceholder: 'Oppgi ditt telefonnummer',\n phoneErrorMessage: 'Oppgi ditt telefonnummer',\n givenNamePlaceholder: 'Oppgi fornavnet ditt',\n givenNameErrorMessage: 'Oppgi fornavnet ditt',\n surnamePlaceholder: 'Oppgi etternavnet ditt',\n surnameErrorMessage: 'Oppgi etternavnet ditt',\n streetPlaceholder: 'Oppgi din gateadresse',\n streetErrorMessage: 'Oppgi din gateadresse',\n street2Placeholder: 'Leilighet, etasje, etc.',\n street2ErrorMessage: 'Leilighet, etasje, etc.',\n postalCodePlaceholder: 'Oppgi postnummeret ditt',\n postalCodeErrorMessage: 'Oppgi postnummeret ditt',\n cityPlaceholder: 'Oppgi poststed',\n cityErrorMessage: 'Oppgi poststed',\n\n proceedButton: 'G\u00E5 videre',\n personalInfoTitle: 'Personopplysninger',\n personalInfoDescription: 'Oppgi ditt personnummer for \u00E5 hente ditt navn og adresse.',\n socialIdPlaceholder: '\u00C5\u00C5\u00C5\u00C5MMDD-XXXX',\n socialIdErrorMessage: 'Oppgi personnummer i formatet \u00C5\u00C5\u00C5\u00C5MMDD-XXXX. M\u00E5 v\u00E6re over 18 \u00E5r.',\n fetchButton: 'Hent opplysninger',\n fetchErrorMessage: 'Vi fikk dessverre ingen treff p\u00E5 personnummeret du oppga.',\n fetchInfoMessage: 'Vi vil hente f\u00F8lgende opplysninger om deg:',\n policyText: 'Dine personopplysninger behandles og lagres i samsvar med v\u00E5r {{link}}.',\n changeContactsButton: 'Endre',\n },\n delivery: {\n title: 'Levering',\n deliveryMethod: 'Leveringsm\u00E5te',\n homeDelivery: 'Hjemlevering',\n pickup: 'Hent hos forhandleren',\n changeDeliveryMethod: 'Endre leveringsm\u00E5te',\n heading: 'Hvordan vil du ha bilen levert?',\n description:\n 'Velg om du vil ha bilen levert hjem til deg eller om du vil hente den hos {{name}}.',\n free: 'Gratis',\n toYourAddress: 'Til din registrerte adresse',\n tooFarAway: 'Dessverre kan vi ikke tilby hjemlevering til din adresse.',\n proceedButton: 'G\u00E5 videre',\n },\n creditAssessment: {\n loanApplication: 'L\u00E5nes\u00F8knad',\n loanApplicationDescription:\n 'For \u00E5 besvare din foresp\u00F8rsel om bill\u00E5n trenger {{name}} noen flere opplysninger om deg og din husstand. Sp\u00F8rsm\u00E5lene tar bare noen minutter \u00E5 besvare. Bekreft og signer deretter med BankID \u2013 deretter f\u00E5r du ditt l\u00E5nebeskjed direkte p\u00E5 skjermen og kan g\u00E5 videre med ditt bilkj\u00F8p. Blir du godkjent s\u00E5 gjelder l\u00E5nebeskjeden gjennom hele kj\u00F8pet s\u00E5 lenge ingen tillegg gj\u00F8res \u2013 men din s\u00F8knad er ikke bindende.',\n maritalStatus: 'Sivilstatus',\n employment: 'Sysselsetting',\n children: 'Barn',\n income: 'Inntekt',\n housingType: 'Boligtype',\n housingTypeDescription: 'Oppgi type bolig.',\n housingCost: 'Boligkostnad',\n debtsAndLiabilities: 'Gjeld og forpliktelser',\n debtsAndLiabilitiesDescription:\n 'Oppgi eventuelle gjeld og forpliktelser innenfor respektive kategori.',\n totalLoanAmount: 'Totalt l\u00E5nebel\u00F8p',\n noPaymentInfo:\n 'Du betaler ingenting i dette trinnet, dette er bare en l\u00E5nes\u00F8knad. Kj\u00F8pet fullf\u00F8res deretter ved m\u00F8te med {{name}}.',\n caseError: 'Det var ikke mulig \u00E5 starte en l\u00E5nes\u00F8knad, pr\u00F8v igjen. {{caseError}}',\n bankIdError: 'En feil oppstod med BankID, pr\u00F8v igjen.',\n performLoanApplication: 'Gjennomf\u00F8r l\u00E5nes\u00F8knad',\n disclaimer:\n 'Ved \u00E5 klikke p\u00E5 \"Gjennomf\u00F8r l\u00E5nes\u00F8knad\" godkjenner jeg at {{name}} gj\u00F8r en kredittsjekk p\u00E5 meg basert p\u00E5 informasjonen ovenfor, og jeg bekrefter at jeg har lest {{link}}.',\n disclaimerSafe: 'Dine opplysninger lagres og oppbevares sikkert.',\n whyAnswer: 'Hvorfor m\u00E5 jeg svare p\u00E5 alt dette?',\n whyAnswerDescription:\n '{{name}} m\u00E5 innhente opplysningene fra kunden for \u00E5 oppfylle bestemmelser i Forbrukerkredittloven (2010:1846) og Lov (2017:630) om tiltak mot hvitvasking og finansiering av terrorisme.',\n waitingFor: 'Venter p\u00E5 {{name}}...',\n fetchingInfo: 'Henter opplysninger fra {{name}}. Vent, det kan ta noen sekunder.',\n errorOccurred: 'En feil oppstod',\n bankIdStatusError: 'Det var ikke mulig \u00E5 hente status for n\u00E5v\u00E6rende BankID-signering',\n descriptionQrCode:\n 'For \u00E5 hente dine opplysninger, start BankID-applikasjonen p\u00E5 din andre enhet.',\n descriptionSameDevice: 'For \u00E5 hente dine opplysninger, start BankID-applikasjonen.',\n incomePerMonth: 'Inntekt per m\u00E5ned f\u00F8r skatt',\n incomeError: 'Oppgi din inntekt per \u00E5r f\u00F8r skatt',\n incomeDescription: 'L\u00F8nn og/eller pensjon, ikke bidrag eller studiel\u00E5n.',\n childrenUnder18: 'Antall barn under 18 \u00E5r',\n childrenError: 'Velg antall barn',\n selectChildren: 'Velg antall barn',\n tenOrMore: '10 eller flere',\n myPartOfMonthlyFee: 'Min del av m\u00E5nedsavgiften',\n myPartOfMonthlyRent: 'Min del av m\u00E5nedshusleien',\n excludingInterest: 'Eksklusive renter og avdrag',\n housingCostError: 'Oppgi boligkostnader per m\u00E5ned',\n cardCredits: 'Kredittkort',\n cardCreditsError: 'Oppgi kredittkort eller la st\u00E5 tomt',\n totalDebt: 'Total gjeld',\n vehicleLoan: 'Bill\u00E5n',\n vehicleLoanError: 'Oppgi bill\u00E5n eller la st\u00E5 tomt',\n collateral: 'Sikkerhet',\n collateralError: 'Oppgi sikkerhet eller la st\u00E5 tomt',\n totalAmount: 'Totalt bel\u00F8p.',\n leasingFees: 'Bil leasing',\n leasingFeesError: 'Oppgi bil leasingkostnader eller la st\u00E5 tomt',\n privateLoan: 'Privatl\u00E5n (ikke boligl\u00E5n og studiel\u00E5n)',\n privateLoanError: 'Oppgi privatl\u00E5n eller la st\u00E5 tomt',\n fullTimeEmployed: 'Fast ansatt',\n temporarilyEmployed: 'Midlertidig ansatt',\n selfEmployed: 'Selvstendig n\u00E6ringsdrivende',\n retired: 'Pensjonist',\n student: 'Student',\n other: 'Annet',\n married: 'Gift/partnerskap',\n commonLaw: 'Samboer',\n single: 'Enslig',\n singleFamily: 'Enebolig',\n condominium: 'Borettslag',\n apartment: 'Leilighet',\n proceedButton: 'G\u00E5 videre',\n abortButton: 'Avbryt',\n assessManually: 'Kredittsjekken m\u00E5 gj\u00F8res manuelt. Vennligst kontakt {{name}} for \u00E5 fortsette.',\n dataProtectionPolicy: 'personvernpolicy',\n readMore: 'Les mer om dette her',\n },\n financial: {\n title: 'Finansiell informasjon',\n description: 'Oppgi din finansielle informasjon for \u00E5 fortsette.',\n income: 'Inntekt',\n incomePlaceholder: 'Oppgi din inntekt',\n incomeErrorMessage: 'En gyldig inntekt m\u00E5 oppgis',\n expenses: 'Utgifter',\n expensesPlaceholder: 'Oppgi dine utgifter',\n expensesErrorMessage: 'Gyldige utgifter m\u00E5 oppgis',\n assets: 'Eiendeler',\n assetsPlaceholder: 'Oppgi dine eiendeler',\n assetsErrorMessage: 'Gyldige eiendeler m\u00E5 oppgis',\n liabilities: 'Gjeld',\n liabilitiesPlaceholder: 'Oppgi din gjeld',\n liabilitiesErrorMessage: 'Gyldig gjeld m\u00E5 oppgis',\n proceedButton: 'G\u00E5 videre',\n abortButton: 'Avbryt',\n heading: 'Finansiering',\n howToFinance: 'Hvordan vil du finansiere din {{vehicleTitle}} {{vehicleDescription}}?',\n buyCar: 'Kj\u00F8p bilen',\n buyCarDescription:\n 'Du kj\u00F8per bilen og eier den selv, enten ved \u00E5 betale hele bilen med egne midler eller gjennom et bill\u00E5n. Du er selv ansvarlig for salget av bilen og velger selvf\u00F8lgelig helt fritt n\u00E5r det skal finne sted.',\n leaseCar: 'Leie bilen',\n leaseCarDescription:\n 'N\u00E5r du privatleier en bil eier du den ikke selv, men betaler en m\u00E5nedsavgift i en avtalt periode som dekker en viss kj\u00F8relengde og andre avtalte tjenester.',\n cash: 'Kontant',\n cashDescription:\n 'Betaling skjer hos {{contactName}} ved kontraktsignering. Ingen kostnader tilkommer.',\n loanApplicationOnline: 'L\u00E5nes\u00F8knad online med BankID',\n loanApplicationResponse: ' \u2013 svar direkte!',\n paymentAtContract: 'Betaling skjer hos {{contactName}} ved kontraktsignering.',\n calculatedOn: 'Beregnet p\u00E5 {{creditAmount}} kr, {{duration}} mnd, {{interest}}% rente.',\n from: 'Fra',\n proceed: 'G\u00E5 videre',\n privateLeasing: 'Privatleasing',\n privateLeasingDescription:\n 'N\u00E5r du privatleier en bil eier du den ikke selv, men betaler en m\u00E5nedsavgift i en avtalt periode som dekker en viss kj\u00F8relengde og andre avtalte tjenester.',\n financialInformationToggle: 'Finansiell informasjon',\n financialCashSelected: 'Kontant betaling valgt',\n financialLeaseSelected: 'Privatleasing valgt',\n financialLoanSelected: 'Bill\u00E5n valgt',\n financialCashSet: 'Kontant betaling satt',\n financialLeaseSet: 'Privatleasing satt',\n financialLoanSet: 'Bill\u00E5n satt',\n financialEdit: 'Rediger finansiering',\n },\n loan: {\n title: 'Bill\u00E5n',\n description: 'Finansier bilen med bill\u00E5n via {{name}}.',\n creditScoringInfo:\n 'Gj\u00F8r din l\u00E5nes\u00F8knad her - og f\u00E5 beskjed direkte. Husk, kj\u00F8pet er ikke bindende f\u00F8r du har signert det endelige forslaget som utarbeides av {{name}}.',\n instruction: 'Oppgi din tenkte kontantinnsats og hvor mange m\u00E5neder du vil legge opp l\u00E5net p\u00E5.',\n downPaymentTitle: 'Kontantinnsats',\n downPaymentInfoTitle: 'Hvor mye av dine egne penger vil du legge?',\n downPaymentInfoDescription:\n 'Kontantinnsatsen er en del av bilens pris som du betaler med egne penger. Den m\u00E5 v\u00E6re minst 20% av prisen p\u00E5 bilen. Kontantinnsatsen betaler du senere i forbindelse med kontraktsignering hos {{name}}. Hvis du har en innbyttebil kan du betale kontantinnsatsen med den. Dette avtaler du sammen med {{name}} ved kontraktsignering.',\n durationTitle: 'Avbetaling',\n residualTitle: 'Restverdi',\n errorOccurred: 'En feil oppstod, pr\u00F8v igjen.',\n proceedButton: 'G\u00E5 videre',\n },\n loanDetails: {\n disclaimerText:\n '*Beregnet p\u00E5 {{interest}} % rente (effektiv {{effectiveInterest}} %). Den renten du f\u00E5r settes ved kontraktsignering.',\n showDetails: 'Vis detaljer',\n details: 'Detaljer',\n repaymentPeriod: 'Avbetalingsperiode',\n months: 'mnd',\n interest: 'Rente',\n effectiveInterest: 'Effektiv rente',\n setupFee: 'Etableringskostnad',\n administrationFee: 'Administrasjonskostnader',\n totalCreditCost: 'Total kredittkostnad',\n disclaimerText1:\n '*Dette er ikke det endelige tilbudet. Renten kan endres hvis det gj\u00F8res justeringer i den opprinnelige nedbetalingsplanen, tillegg i utstyr eller andre endringer som p\u00E5virker det opprinnelige prisforslaget.',\n disclaimerText2:\n 'Hvis markedsrenten endres, kan m\u00E5nedskostnaden endres tilsvarende. M\u00E5nedskostnaden kan ogs\u00E5 p\u00E5virkes av den kredittvurderingen som gj\u00F8res etter en kredittsjekk.',\n moreInfo: 'Mer informasjon om {{loanOrgName}}',\n },\n loanDetailsDetailed: {\n showDetails: 'Vis detaljer',\n details: 'Detaljer',\n repaymentPeriod: 'Avbetalingsperiode',\n months: 'mnd',\n interest: 'Rente',\n effectiveInterest: 'Effektiv rente',\n setupFee: 'Etableringskostnad',\n administrationFee: 'Administrasjonskostnader',\n totalCreditCost: 'Total kredittkostnad',\n disclaimerText1:\n '*Dette er ikke det endelige tilbudet. Renten kan endres hvis det gj\u00F8res justeringer i den opprinnelige nedbetalingsplanen, tillegg i utstyr eller andre endringer som p\u00E5virker det opprinnelige prisforslaget.',\n disclaimerText2:\n 'Hvis markedsrenten endres, kan m\u00E5nedskostnaden endres tilsvarende. M\u00E5nedskostnaden kan ogs\u00E5 p\u00E5virkes av den kredittvurderingen som gj\u00F8res etter en kredittsjekk.',\n moreInfo: 'Mer informasjon om {{loanOrgName}}',\n },\n loanDetailsMonthlyCost: {\n monthlyCost: 'M\u00E5nedskostnad for l\u00E5net',\n perMonth: 'kr/mnd*',\n },\n stageCompletedFinancial: {\n downPayment: 'Kontantinnsats',\n loanAmount: 'L\u00E5nebel\u00F8p',\n repaymentPeriod: 'Avbetalingsperiode',\n months: 'mnd',\n monthlyCost: 'M\u00E5nedskostnad for l\u00E5net',\n disclaimerText:\n '*Beregnet p\u00E5 {{interest}} % rente (effektiv {{effectiveInterest}} %). Den renten du f\u00E5r settes ved kontraktsignering.',\n orderAlmostReady: 'Bestillingen er snart klar, her ser du ditt l\u00E5nebeskjed:',\n changeFinancing: 'Endre finansiering',\n financing: 'Finansiering',\n cash: 'Kontant',\n lease: 'Privatleasing',\n },\n stageCompletedFinancialCreditAssessment: {\n approved: 'Gratulerer! Din l\u00E5nes\u00F8knad er godkjent av {{loanName}}.',\n approvedDescription:\n 'Fullf\u00F8r bestillingen ved \u00E5 klikke deg gjennom de neste trinnene. Har du sp\u00F8rsm\u00E5l underveis? Kontakt {{contactName}} p\u00E5 tlf {{contactPhone}}.',\n assessManually:\n 'N\u00E5r bestillingen er fullf\u00F8rt, vil vi g\u00E5 gjennom saken din og gi deg tilbakemelding med et l\u00E5nebeskjed.',\n assessManuallyDescription:\n 'Bilen er fortsatt ikke reservert. G\u00E5 videre til neste trinn for \u00E5 fullf\u00F8re bestillingen, men det er ikke sikkert at l\u00E5net ditt vil bli godkjent. Har du sp\u00F8rsm\u00E5l underveis? Kontakt {{contactName}} p\u00E5 tlf {{contactPhone}}.',\n declined: 'Vi kan dessverre ikke godkjenne din s\u00F8knad om bill\u00E5n.',\n declinedDescription:\n 'Det kan v\u00E6re ulike grunner til at en s\u00F8knad avsl\u00E5s. Du vil snart motta et brev med bekreftelse og mer informasjon om din s\u00F8knad.',\n declinedNextSteps:\n 'Ditt allerede p\u00E5begynte kj\u00F8p kan fortsatt gjennomf\u00F8res og fullf\u00F8res, for \u00E5 g\u00E5 videre kan du velge en annen betalingsm\u00E5te.',\n contactInfo: 'Har du sp\u00F8rsm\u00E5l underveis? Kontakt {{contactName}} p\u00E5 tlf {{contactPhone}}.',\n },\n loanSummary: {\n title: 'Bill\u00E5n',\n description: 'Bestillingen er snart klar, her ser du ditt l\u00E5nebeskjed:',\n successMessage: 'Gratulerer! Din l\u00E5nes\u00F8knad er godkjent av {{loanName}}.',\n notReserved:\n 'Bilen er ikke reservert enn\u00E5. Fullf\u00F8r bestillingen ved \u00E5 klikke deg gjennom de neste trinnene. Har du sp\u00F8rsm\u00E5l underveis? Kontakt [forhandleren] p\u00E5 tlf [telefonnummer].',\n downPayment: 'Kontantinnsats',\n loanAmount: 'L\u00E5nebel\u00F8p',\n repaymentPeriod: 'Avbetalingsperiode',\n monthlyCost: 'M\u00E5nedskostnad for l\u00E5net',\n disclaimer:\n '*Beregnet p\u00E5 X,XX % rente (effektiv X,XX %). Den renten du f\u00E5r settes ved kontraktsignering.',\n },\n summary: {\n financing: 'Finansiering',\n cash: 'Kontant',\n loan: 'Bill\u00E5n',\n leasing: 'Privatleasing',\n changeButton: 'Endre',\n centralStorageTitle: 'Sentral lager',\n dealerSelection: 'Valg av forhandler',\n customerTitle: 'Kundeopplysninger',\n customerName: 'For- og etternavn',\n customerSSN: 'Personnummer',\n customerAddress: 'Adresse',\n customerEmail: 'E-post',\n customerPhone: 'Telefonnummer',\n deliveryTitle: 'Levering',\n deliveryMethod: 'Leveringsm\u00E5te',\n homeDelivery: 'Hjemlevering',\n pickup: 'Hent hos forhandleren',\n thankYou: 'Takk for din bestilling!',\n whatHappensNext: 'Dette skjer n\u00E5:',\n orderConfirmation: 'En bestillingsbekreftelse vil bli sendt til din e-postadresse {{email}}.*',\n contactFromDealer:\n '{{contactName}} tar kontakt med deg for \u00E5 g\u00E5 gjennom avtale, betaling og levering.',\n driveSafely: 'Klart! Kj\u00F8r forsiktig p\u00E5 veiene.',\n orderConfirmationDisclaimer:\n '*Bestillingsbekreftelsen sendes normalt innen 10 minutter, men kan i unntakstilfeller ta opptil 48 timer.',\n orderNumber: 'Bestillingsnummer {{createdOrderId}}',\n orderTitle: 'Din bestilling',\n paymentMethod: 'Betalingsm\u00E5te',\n perMonth: 'kr/mnd',\n lease: 'Privatleasing',\n from: 'Fra',\n accessories: 'Tilbeh\u00F8r',\n insurance: 'Forsikring',\n free: 'Gratis',\n tradeInTitle: 'Innbyttebil',\n mileage: 'Kj\u00F8relengde',\n description: 'Beskrivelse',\n condition: 'Bilens tilstand',\n estimatedValue: 'Omtrentlig verdi',\n no: 'Nei',\n },\n insurance: {\n heading: 'Vil du tegne en forsikring p\u00E5 din nye bil?',\n description: 'Nedenfor vises forslag p\u00E5 forsikringer som passer deg og din nye bil.',\n proceedButton: 'G\u00E5 videre',\n backButton: 'Tilbake',\n logoAlt: 'Produsentens logo for {{title}}',\n ifDescription:\n 'Oppgi din estimerte kj\u00F8relengde for \u00E5 se din forsikringskostnad. Deretter presenterer vi forslag p\u00E5 forsikringer som passer deg og din nye bil. I b\u00E5de hel- og halvforsikring inng\u00E5r trafikkforsikring som er obligatorisk \u00E5 ha. Hvis du har valgt \u00E5 finansiere bilen med et bill\u00E5n, er prisen du ser rabattert.',\n showInsurances: 'Vis forsikringer',\n ifAlert:\n 'Vi er tilknyttede forsikringsformidlere til {{insuranceDisclaimerTitle}}, If Skadeforsikring. Forsikringsgiver er If Skadeforsikring (publ). Hva dette inneb\u00E6rer kan du lese mer om p\u00E5 forsikringsformidlerens nettside.',\n ifDisclaimer:\n 'Ved \u00E5 klikke p\u00E5 Vis forsikringer godkjenner du at vi sender dine opplysninger videre til {{insuranceDisclaimerTitle}} slik at de kan gi deg en pris p\u00E5 forsikring. Hvordan de h\u00E5ndterer dine personopplysninger kan du lese om p\u00E5 deres nettside.',\n skipButton: 'Hopp over dette trinnet',\n perMonth: 'kr/mnd',\n addons: 'Tillegg',\n includes: 'Forsikringen inneholder',\n update: 'Oppdater',\n select: 'Velg',\n estimatedMileage: 'Estimert kj\u00F8relengde',\n edit: 'Endre',\n fetchError: 'Det var ikke mulig \u00E5 hente forsikringer.',\n retry: 'Pr\u00F8v igjen',\n title: 'Forsikring',\n none: 'Ingen',\n changeButtonTitle: 'Endre forsikring',\n },\n tradeIn: {\n title: 'Innbyttebil',\n mileage: 'Kj\u00F8relengde',\n description: 'Beskrivelse',\n condition: 'Bilens tilstand',\n estimatedValue: 'Omtrentlig verdi',\n infoText: 'Vi sender med opplysninger om din innbyttebil til bilforhandleren.',\n infoDisclaimer:\n 'V\u00E6r oppmerksom p\u00E5 at vurderingen som utf\u00F8res gir en estimert innbytteverdi. Den endelige verdien avgj\u00F8res n\u00E5r forhandleren kan bekrefte bilens tilstand.',\n no: 'Nei',\n changeButtonTitle: 'Endre',\n heading: 'Har du en innbyttebil?',\n tradeInDescription:\n 'Har du en bil du vil bytte inn n\u00E5r du kj\u00F8per din nye bil? Her f\u00E5r du en estimert innkj\u00F8pspris av oss direkte online.',\n yesButton: 'Jeg har innbyttebil',\n skipButton: 'Hopp over dette trinnet',\n veryGoodCondition: 'Meget god tilstand',\n goodCondition: 'God tilstand',\n okCondition: 'Helt ok tilstand',\n noScratches: 'Ingen riper eller skader',\n serviced: 'Servet ved hver anledning med stempler i serviceboken',\n goodTires: 'Dekk med veldig god m\u00F8nsterdybde (5-8 mm)',\n someScratches: 'Noen mindre riper og/eller skader',\n okTires: 'Dekk som ikke trenger \u00E5 byttes (m\u00F8nsterdybde p\u00E5 3-5 mm)',\n manyScratches: 'Det er en del riper og skader',\n notServiced: 'Ikke servet ved hver anledning',\n badTires: 'Dekk som m\u00E5 byttes (m\u00F8nsterdybde under 3 mm)',\n detailsHeading: 'Opplysninger om din innbyttebil',\n detailsDescription:\n 'Oppgi registreringsnummeret og aktuell kj\u00F8relengde for din innbyttebil s\u00E5 f\u00E5r du en estimert innkj\u00F8pspris av oss.',\n registrationNumber: 'Registreringsnummer',\n registrationNumberError: 'Et gyldig registreringsnummer i formatet AB12345 m\u00E5 oppgis',\n registrationNumberPlaceholder: 'Oppgi registreringsnummer',\n mileageError: 'En kj\u00F8relengde mellom 0 til 80 000 km m\u00E5 oppgis',\n mileagePlaceholder: 'Oppgi bilens kj\u00F8relengde',\n descriptionOptional: 'Beskrivelse (valgfritt)',\n descriptionError: 'Beskrivelsen er ikke gyldig',\n descriptionPlaceholder: 'Beskriv bilen',\n fetchValue: 'Hent estimert verdi',\n proceedButton: 'Bruk og g\u00E5 videre',\n fetchError:\n 'Vi fikk dessverre ingen treff p\u00E5 registreringsnummeret du oppga. Vennligst kontroller at registreringsnummeret stemmer.',\n },\n vehicleInfo: 'Kj\u00F8ret\u00F8yinformasjon',\n orderCallback: {\n thankYou: 'Takk for ditt kj\u00F8p',\n orderId: 'Ordre id',\n waykeId: 'Drive id',\n },\n howTo: {\n heading: 'Slik kj\u00F8per du bilen online',\n description:\n 'Hos oss kan du trygt kj\u00F8pe din neste bil online. Reserver bilen ved \u00E5 klikke deg gjennom v\u00E5r kj\u00F8psflyt med f\u00F8lgende trinn:',\n timelineAriaLabel: 'Fremgangsm\u00E5te',\n customerHeading: 'Dine kundeopplysninger',\n centralStorageHeading: 'Velg anlegg',\n centralStorageDescription: 'Velg hvilket anlegg du vil kj\u00F8pe bilen fra.',\n deliveryHeading: 'Velg leveringsm\u00E5te',\n tradeInHeading: 'Har du innbyttebil?',\n tradeInDescription: 'F\u00E5 den vurdert direkte online.',\n financialHeading: 'Finansiering',\n insuranceHeading: 'Vil du tegne en forsikring?',\n insuranceDescription: 'Se forslag p\u00E5 forsikringer som passer din nye bil.',\n accessoriesHeading: 'Tilbeh\u00F8r',\n accessoriesDescription: 'Bestill ekstra utstyr til bilen din.',\n financialDescriptionAll:\n 'Denne bilen kan du kj\u00F8pe kontant, privatleie eller finansiere med et bill\u00E5n.',\n financialDescriptionCashLease: 'Denne bilen kan du kj\u00F8pe kontant eller privatleie.',\n financialDescriptionCashLoan: 'Denne bilen kan du kj\u00F8pe kontant eller finansiere med et bill\u00E5n',\n financialDescriptionLoanLease: 'Denne bilen kan du privatleie eller finansiere med et bill\u00E5n',\n financialDescriptionCash: 'Denne bilen kan du kj\u00F8pe kontant.',\n financialDescriptionLoan: 'Denne bilen kan du finansiere med et bill\u00E5n',\n financialDescriptionLease: 'Denne bilen kan du privatleie.',\n deliveryDescriptionBoth: 'Hjemlevering eller hent hos forhandleren.',\n deliveryDescriptionPickup: 'Hent hos forhandleren.',\n deliveryDescriptionHome: 'Hjemlevering.',\n paymentHeading: 'Gjennomf\u00F8r forskuddsbetaling!',\n paymentDescription:\n 'Gjennomf\u00F8r forskuddsbetaling p\u00E5 5% av bilens verdi. (Gjennomf\u00F8r betaling av depositum tilsvarende 5% av bilens verdi.)',\n finalHeading: 'Klart!',\n finalDescription:\n 'Etter at bestillingen er gjennomf\u00F8rt tar {{contactName}} kontakt med deg for \u00E5 avtale detaljer rundt betaling og signere avtalen.',\n },\n preview: {\n heading: 'S\u00E5 g\u00F8y at du vil kj\u00F8pe denne bilen!',\n proceedButton: 'G\u00E5 videre',\n checklistTitle: 'Kj\u00F8p online hos Drive',\n checklistAriaLabel: 'Fordeler med \u00E5 kj\u00F8pe bilen online hos Drive',\n checklistItem1: 'Trygg h\u00E5ndtering av personopplysninger',\n checklistItem2: 'Reserver bilen n\u00E5 - betaling og avtalesignering skjer senere med forhandleren',\n checklistItem3: 'Ikke bindende f\u00F8r avtale er signert med forhandleren',\n checklistItem4: 'Kun kontrollerte biler',\n error: 'En feil oppstod og det var ikke mulig \u00E5 initiere modulen. Pr\u00F8v igjen.',\n reserved:\n 'Bilen er dessverre reservert av en annen kj\u00F8per og kan derfor ikke reserveres akkurat n\u00E5.',\n unavailable: 'Bilen er dessverre ikke lenger tilgjengelig og kan derfor ikke reserveres.',\n },\n};\n\nexport default nbNO;\n", "const svSE = {\n glossary: {\n change: '\u00C4ndra',\n showPrevious: 'Visa f\u00F6reg\u00E5ende',\n showNext: 'Visa n\u00E4sta',\n showPreviousImage: 'Visa f\u00F6reg\u00E5ende bild',\n showNextImage: 'Visa n\u00E4sta bild',\n readMore: 'L\u00E4s mer',\n closeModal: 'St\u00E4ng modalen',\n homeUrl: 'https://www.wayke.se',\n goToHome: 'G\u00E5 till wayke.se',\n company: 'Wayke',\n modalTitle: 'Wayke Ecom',\n add: 'L\u00E4gg till',\n chosen: 'Vald',\n ourAdvantages: 'F\u00F6rdelar med att k\u00F6pa bilen online hos oss',\n showHelp: 'St\u00E4ng hj\u00E4lp',\n closeHelp: 'St\u00E4ng hj\u00E4lp',\n whatDoesThisMean: 'Vad betyder detta?',\n buyOnline: 'K\u00F6p online hos oss',\n },\n confirmClose: {\n heading: 'Bilen \u00E4r inte reserverad \u00E4nnu',\n message:\n 'Du har inte klickat dig igenom alla steg som kr\u00E4vs f\u00F6r att ordern ska slutf\u00F6ras och bilen ska reserveras till dig. \u00C4r du s\u00E4ker p\u00E5 att du vill avsluta din order?',\n abortButton: 'Forts\u00E4tt min order',\n confirmButton: 'Avbryt min order',\n },\n accessoryItemInfo: {\n backButton: 'Tillbaka',\n logoAlt: 'Tillverkarens logotyp f\u00F6r',\n },\n accessories: {\n title: 'Tillbeh\u00F6r',\n noSelected: 'Inga valda',\n changeButtonTitle: '\u00C4ndra tillbeh\u00F6r',\n heading: 'Vill du k\u00F6pa till ett tillbeh\u00F6r till din nya bil?',\n description: 'H\u00E4r visar vi n\u00E5gra av de tillbeh\u00F6r som passar din nya bil.',\n proceedButton: 'G\u00E5 vidare',\n skipButton: 'Hoppa \u00F6ver detta steg',\n },\n centralStorage: {\n title: 'Centrallager',\n heading: 'Vilken anl\u00E4ggning vill du k\u00F6pa ifr\u00E5n?',\n description:\n 'Detta fordon \u00E4r en centrallagerbil och finns tillg\u00E4ngligt fr\u00E5n flera anl\u00E4ggningar. V\u00E4lj den anl\u00E4ggning du vill handla ifr\u00E5n.',\n changeButtonTitle: '\u00C4ndra',\n proceedButton: 'G\u00E5 vidare',\n errorMessage:\n 'Ett fel uppstod och det gick inte att v\u00E4lja ovanst\u00E5ende anl\u00E4ggning. F\u00F6rs\u00F6k igen.',\n dealerSelection: 'Val av anl\u00E4ggning',\n addressMissing: 'Adress saknas',\n },\n confirmation: {\n title: 'Slutf\u00F6r ordern',\n paymentTitle: 'Betalning',\n heading: 'Strax klart!',\n description:\n 'F\u00F6r att reservera bilen \u00E5t dig beh\u00F6ver vi bara verifiera din identitet med BankID. Efter det kommer {{name}} att kontakta dig f\u00F6r att slutf\u00F6ra k\u00F6pet.',\n description2:\n 'K\u00F6pet blir bindande f\u00F6rst n\u00E4r du signerat det definitiva aff\u00E4rsf\u00F6rslaget med {{name}}. Det \u00E4r \u00E4ven d\u00E5 betalningen sker.',\n ageError:\n 'Du m\u00E5ste vara \u00F6ver 18 \u00E5r f\u00F6r att kunna forts\u00E4tta. Identifiering med BankId visar att du \u00E4r under 18 \u00E5r gammal.',\n requestError: 'Ett fel uppstod och det gick inte att skapa ordern, f\u00F6rs\u00F6k igen.',\n notAvailable: 'Den h\u00E4r bilen finns tyv\u00E4rr inte l\u00E4ngre tillg\u00E4nglig.',\n socialIdNotMatchingError:\n 'Personnummret i f\u00F6rsta steget matchar inte med det som \u00E4r kopplat mot bankid',\n confirmConditionsTitle: 'Jag godk\u00E4nner {{link}}.',\n insuranceText: 'samt har tagit del av information kring f\u00F6rs\u00E4kringsf\u00F6rmedling',\n reserveButton: 'Reservera bilen',\n policyText: 'Dina personuppgifter behandlas och sparas i enlighet med v\u00E5r {{link}}.',\n reservationDisclaimer:\n 'Vi reserverar oss f\u00F6r eventuell \u00E4ndring i tillg\u00E5ngen av utbjudna bilar.',\n bankIdDescriptionQrCode:\n 'F\u00F6r att verifiera din identitet, starta din BankID applikation p\u00E5 din andra enhet.',\n bankIdDescriptionSameDevice: 'F\u00F6r att verifiera din identitet, starta din BankID-applikation.',\n bankIdErrorMessage: 'Det gick inte att h\u00E4mta status kring nuvanrade BankId signering.',\n bankIdQrCodeErrorMessage: 'Det gick inte att h\u00E4mta ny QR-kod f\u00F6r BankId signering.',\n bankIdInitErrorMessage: 'Det gick tyv\u00E4rr inte att initiera BankId. V\u00E4nligen f\u00F6rs\u00F6k igen.',\n bankIdCompletedMessage: 'Verifiering klar, ordern skapas nu...',\n paymentHeading: 'V\u00E4lj betals\u00E4tt',\n paymentDescription:\n 'Genomf\u00F6r en f\u00F6rskottsbetalning p\u00E5 5% av bilens pris (10 995 kr) f\u00F6r att reservera bilen. V\u00E4lj hur du vill genomf\u00F6ra betalningen.',\n paymentDescription2:\n 'Resterande del av kontantinsatsen 32 985 kr med eventuellt avdrag av v\u00E4rde f\u00F6r inbytesbil betalas hos {{name}} vid kontraktskrivning.',\n paymentCardType: 'Korttyp',\n paymentCardTypeValue: 'Credit',\n paymentCardNo3DSecure: 'Kort utan 3d secure',\n paymentCardNo3DSecureValue: '4925000000000004',\n paymentCard3DSecure: 'Kort med 3d secure',\n paymentCard3DSecureValue: '4761739001010416',\n paymentExpiry: 'MM/\u00C5\u00C5:',\n paymentExpiryValue: '12/25',\n paymentCVC: 'CVC:',\n paymentCVCValue: '123',\n privacyPolicy: 'personuppgiftspolicy',\n purchaseTermsAndCancellationPolicy: 'k\u00F6pvillkor och villkor f\u00F6r \u00E5ngerr\u00E4tt',\n noVerifyConfirmMessage:\n 'Ex exercitation excepteur commodo est reprehenderit ad pariatur cillum quis esse aute.',\n },\n customer: {\n title: 'Dina uppgifter',\n changeButtonTitle: '\u00C4ndra dina uppgifter',\n email: 'E-post',\n phone: 'Telefonnummer',\n socialId: 'Personnummer',\n name: 'Namn',\n givenName: 'F\u00F6rnamn',\n surname: 'Efternamn',\n address: 'Adress',\n street: 'Gatuadress',\n street2: 'L\u00E4genhet, v\u00E5ning, etc.',\n registeredAddress: 'Folkbokf\u00F6ringsadress',\n postalCode: 'Postnummer',\n city: 'Stad',\n contactInfoTitle: 'Kontaktuppgifter',\n contactInfoDescription: 'Ange din e-postadress och ditt telefonnummer.',\n emailPlaceholder: 'Ange din e-postadress',\n emailErrorMessage: 'En giltig e-postadress m\u00E5ste anges',\n phonePlaceholder: 'Ange ditt telefonnummer',\n phoneErrorMessage: 'Ange ditt telefonnummer',\n givenNamePlaceholder: 'Ange ditt f\u00F6rnamn',\n givenNameErrorMessage: 'Ange ditt f\u00F6rnamn',\n surnamePlaceholder: 'Ange ditt efternamn',\n surnameErrorMessage: 'Ange ditt efternamn',\n streetPlaceholder: 'Ange din gatuadress',\n streetErrorMessage: 'Ange din gatuadress',\n street2Placeholder: 'L\u00E4genhet, v\u00E5ning, etc.',\n street2ErrorMessage: 'L\u00E4genhet, v\u00E5ning, etc.',\n postalCodePlaceholder: 'Ange ditt postnummer',\n postalCodeErrorMessage: 'Ange ditt postnummer',\n cityPlaceholder: 'Ange din stad',\n cityErrorMessage: 'Ange din stad',\n proceedButton: 'G\u00E5 vidare',\n personalInfoTitle: 'Personuppgifter',\n personalInfoDescription: 'Ange ditt personnummer f\u00F6r att h\u00E4mta ditt namn och din adress.',\n socialIdPlaceholder: '\u00C5\u00C5\u00C5\u00C5MMDD-XXXX',\n socialIdErrorMessage: 'Ange personnummer i formatet \u00C5\u00C5\u00C5\u00C5MMDD-XXXX. M\u00E5ste vara \u00F6ver 18 \u00E5r.',\n fetchButton: 'H\u00E4mta uppgifter',\n fetchErrorMessage: 'Tyv\u00E4rr fick vi ingen tr\u00E4ff p\u00E5 personnumret du angav.',\n fetchInfoMessage: 'Vi kommer h\u00E4mta f\u00F6ljande uppgifter om dig:',\n policyText: 'Dina personuppgifter behandlas och sparas i enlighet med v\u00E5r {{link}}.',\n changeContactsButton: '\u00C4ndra',\n },\n delivery: {\n title: 'Leverans',\n deliveryMethod: 'Leveranss\u00E4tt',\n homeDelivery: 'Hemleverans',\n pickup: 'H\u00E4mta hos handlaren',\n changeDeliveryMethod: '\u00C4ndra leveranss\u00E4tt',\n heading: 'Hur vill du ha din bil levererad?',\n description:\n 'V\u00E4lj ifall du vill ha bilen levererad hem till dig eller ifall du vill h\u00E4mta den hos {{name}}.',\n free: 'Gratis',\n toYourAddress: 'Till din folkbokf\u00F6ringsadress',\n tooFarAway: 'Tyv\u00E4rr kan vi inte erbjuda hemleverans till din adress.',\n proceedButton: 'G\u00E5 vidare',\n },\n creditAssessment: {\n loanApplication: 'L\u00E5neans\u00F6kan',\n loanApplicationDescription:\n 'F\u00F6r att besvara din f\u00F6rfr\u00E5gan om bill\u00E5n beh\u00F6ver {{name}} n\u00E5gra fler uppgifter om dig och ditt hush\u00E5ll. Fr\u00E5gorna tar bara n\u00E5gon minut att besvara. Bekr\u00E4fta och signera sedan med BankID \u2013 d\u00E4refter f\u00E5r du ditt l\u00E5nebesked direkt p\u00E5 sk\u00E4rmen och kan g\u00E5 vidare med ditt bilk\u00F6p. Blir du godk\u00E4nd s\u00E5 g\u00E4ller l\u00E5nebeskedet genom hela k\u00F6pet s\u00E5 l\u00E4nge inga till\u00E4gg g\u00F6rs \u2013 men din ans\u00F6kan \u00E4r inte bindande.',\n maritalStatus: 'Civilstatus',\n employment: 'Syssels\u00E4ttning',\n children: 'Barn',\n income: 'Inkomst',\n housingType: 'Boendeform',\n housingTypeDescription: 'Ange typ av boende.',\n housingCost: 'Boendekostnad',\n debtsAndLiabilities: 'Skulder och Ansvarsf\u00F6rbindelser',\n debtsAndLiabilitiesDescription:\n 'Ange eventuella skulder och ansvarsf\u00F6rbindelser inom respektive kategori.',\n totalLoanAmount: 'Totalt l\u00E5nebelopp',\n noPaymentInfo:\n 'Du betalar inget i detta steg, detta \u00E4r bara en l\u00E5neans\u00F6kan. K\u00F6pet slutf\u00F6rs sedan vid m\u00F6te med {{name}}.',\n caseError: 'Det gick inte att starta en l\u00E5neans\u00F6kan, f\u00F6rs\u00F6k igen. {{caseError}}',\n bankIdError: 'Ett fel uppstod med BankId, f\u00F6rs\u00F6k igen.',\n performLoanApplication: 'Genomf\u00F6r l\u00E5neans\u00F6kan',\n disclaimer:\n 'Genom att klicka p\u00E5 \u201DGenomf\u00F6r l\u00E5neans\u00F6kan\u201D godk\u00E4nner jag att {{name}} g\u00F6r en kreditupplysning p\u00E5 mig baserat p\u00E5 informationen ovan och jag bekr\u00E4ftar att jag l\u00E4st {{link}}.',\n disclaimerSafe: 'Dina uppgifter lagras och sparas s\u00E4kert.',\n whyAnswer: 'Varf\u00F6r m\u00E5ste jag svara p\u00E5 allt detta?',\n whyAnswerDescription:\n '{{name}} m\u00E5ste ta in uppgifterna av kunden f\u00F6r att uppfylla best\u00E4mmelser i Konsumentkreditlagen (2010:1846) och Lag (2017:630) om \u00E5tg\u00E4rder mot penningtv\u00E4tt och finansiering av terrorism. {{link}}',\n waitingFor: 'V\u00E4ntar p\u00E5 {{name}}...',\n fetchingInfo: 'H\u00E4mtar uppgifter fr\u00E5n {{name}}. V\u00E4nta kvar det kan ta n\u00E5gra sekunder.',\n errorOccurred: 'Ett fel uppstod',\n bankIdStatusError: 'Det gick inte att h\u00E4mta status kring nuvanrade BankId signering',\n descriptionQrCode:\n 'F\u00F6r att h\u00E4mta dina uppgifter, starta din BankID applikation p\u00E5 din andra enhet.',\n descriptionSameDevice: 'F\u00F6r att h\u00E4mta dina uppgifter, starta din BankID-applikation.',\n incomePerMonth: 'Inkomst per m\u00E5nad f\u00F6re skatt',\n incomeError: 'Ange din inkomst per \u00E5r f\u00F6re skatt',\n incomeDescription: 'L\u00F6n och/eller pension, inte bidrag eller studiel\u00E5n.',\n childrenUnder18: 'Antal barn under 18 \u00E5r',\n childrenError: 'V\u00E4lj antal barn',\n selectChildren: 'V\u00E4lj antal barn',\n tenOrMore: '10 eller fler',\n myPartOfMonthlyFee: 'Min del av m\u00E5nadsavgiften',\n myPartOfMonthlyRent: 'Min del av m\u00E5nadshyran',\n excludingInterest: 'Exklusive r\u00E4nta och amortering',\n housingCostError: 'Ange boendekostnader per m\u00E5nad',\n cardCredits: 'Kortkrediter',\n cardCreditsError: 'Ange kortkrediter eller l\u00E4mna tomt',\n totalDebt: 'Total skuld',\n vehicleLoan: 'Bill\u00E5n',\n vehicleLoanError: 'Ange bill\u00E5n eller l\u00E4mna tomt',\n collateral: 'Borgens\u00E5tagande',\n collateralError: 'Ange borgens\u00E5tagande eller l\u00E4mna tomt',\n totalAmount: 'Totalt belopp.',\n leasingFees: 'Billeasing',\n leasingFeesError: 'Ang billeasingkostnader eller l\u00E4mna tomt',\n privateLoan: 'Privatl\u00E5n (ej bol\u00E5n och CSN)',\n privateLoanError: 'Ange privatl\u00E5n eller l\u00E4mna tomt',\n fullTimeEmployed: 'Fast eller tillsvidareanst\u00E4lld',\n temporarilyEmployed: 'Visstidsanst\u00E4lld',\n selfEmployed: 'Egen f\u00F6retagare',\n retired: 'Pension\u00E4r',\n student: 'Student',\n other: 'Annan',\n married: 'Gift/partnerskap',\n commonLaw: 'Sambo',\n single: 'Ensamst\u00E5ende',\n singleFamily: 'Villa',\n condominium: 'Bostadsr\u00E4tt',\n apartment: 'Hyresr\u00E4tt',\n proceedButton: 'G\u00E5 vidare',\n abortButton: 'Avbryt',\n assessManually:\n 'Kreditupplysningen m\u00E5ste g\u00F6ras manuellt. V\u00E4nligen kontakta {{name}} f\u00F6r att forts\u00E4tta.',\n dataProtectionPolicy: 'dataskyddspolicy',\n readMore: 'L\u00E4s mer om detta h\u00E4r',\n },\n financial: {\n title: 'Finansiell information',\n description: 'Ange din finansiella information f\u00F6r att forts\u00E4tta.',\n income: 'Inkomst',\n incomePlaceholder: 'Ange din inkomst',\n incomeErrorMessage: 'En giltig inkomst m\u00E5ste anges',\n expenses: 'Utgifter',\n expensesPlaceholder: 'Ange dina utgifter',\n expensesErrorMessage: 'Giltiga utgifter m\u00E5ste anges',\n assets: 'Tillg\u00E5ngar',\n assetsPlaceholder: 'Ange dina tillg\u00E5ngar',\n assetsErrorMessage: 'Giltiga tillg\u00E5ngar m\u00E5ste anges',\n liabilities: 'Skulder',\n liabilitiesPlaceholder: 'Ange dina skulder',\n liabilitiesErrorMessage: 'Giltiga skulder m\u00E5ste anges',\n proceedButton: 'G\u00E5 vidare',\n abortButton: 'Avbryt',\n heading: '\u00C4gandeform',\n howToFinance: 'Hur vill du finansiera din {{vehicleTitle}} {{vehicleDescription}}?',\n buyCar: 'K\u00F6p bilen',\n buyCarDescription:\n 'Du k\u00F6per bilen och \u00E4ger den sj\u00E4lv, antingen genom att betala hela bilen med egna medel eller genom ett bill\u00E5n. Du ansvarar sj\u00E4lv f\u00F6r f\u00F6rs\u00E4ljningen av bilen och v\u00E4ljer s\u00E5klart helt fritt n\u00E4r den ska \u00E4ga rum.',\n leaseCar: 'Leasa bilen',\n leaseCarDescription:\n 'N\u00E4r du privatleasar en bil \u00E4ger du den inte sj\u00E4lv utan betalar en m\u00E5nadsavgift under en avtalad tid och som t\u00E4cker en viss k\u00F6rstr\u00E4cka och andra avtalade tj\u00E4nster.',\n cash: 'Kontant',\n cashDescription:\n 'Betalning sker hos {{contactName}} vid kontraktskrivning. Inga kostnader tillkommer.',\n loanApplicationOnline: 'L\u00E5neans\u00F6kan online med BankID',\n loanApplicationResponse: ' \u2013 svar direkt!',\n paymentAtContract: 'Betalning sker hos {{contactName}} vid kontraktskrivning.',\n calculatedOn: 'Ber\u00E4knat p\u00E5 {{creditAmount}} kr, {{duration}} m\u00E5n, {{interest}}% r\u00E4nta.',\n from: 'Fr\u00E5n',\n proceed: 'G\u00E5 vidare',\n privateLeasing: 'Privatleasing',\n privateLeasingDescription:\n 'N\u00E4r du privatleasar en bil \u00E4ger du den inte sj\u00E4lv utan betalar en m\u00E5nadsavgift under en avtalad tid och som t\u00E4cker en viss k\u00F6rstr\u00E4cka och andra avtalade tj\u00E4nster.',\n financialInformationToggle: 'Finansiell information',\n financialCashSelected: 'Kontant betalning vald',\n financialLeaseSelected: 'Privatleasing vald',\n financialLoanSelected: 'Bill\u00E5n valt',\n financialCashSet: 'Kontant betalning satt',\n financialLeaseSet: 'Privatleasing satt',\n financialLoanSet: 'Bill\u00E5n satt',\n financialEdit: 'Redigera finansiering',\n },\n loan: {\n title: 'Bill\u00E5n',\n description: 'Finansiera bilen med bill\u00E5n via {{name}}.',\n creditScoringInfo:\n 'G\u00F6r din l\u00E5neans\u00F6kan h\u00E4r - och f\u00E5 besked direkt. Kom ih\u00E5g, k\u00F6pet \u00E4r inte bindande f\u00F6rr\u00E4n du signerat det definitiva aff\u00E4rsf\u00F6rslaget som tas fram av {{name}}.',\n instruction:\n 'Ange din t\u00E4nkta kontantinsats och hur m\u00E5nga m\u00E5nader du vill l\u00E4gga upp ditt l\u00E5n p\u00E5.',\n downPaymentTitle: 'Kontantinsats',\n downPaymentInfoTitle: 'Hur mycket av dina egna pengar vill du l\u00E4gga?',\n downPaymentInfoDescription:\n 'Kontantinsatsen \u00E4r en del av bilens pris som du betalar med egna pengar. Den beh\u00F6ver vara minst 20% av priset p\u00E5 bilen. Kontantinsatsen betalar du senare i samband med avtalsskrivning hos {{name}}. Ifall du har en inbytesbil kan du betala kontantinsatsen med den. Detta kommer du \u00F6verens om tillsammans med {{name}} vid avtalsskrivning.',\n durationTitle: 'Avbetalning',\n residualTitle: 'Restv\u00E4rde',\n errorOccurred: 'Ett fel uppstod, f\u00F6rs\u00F6k igen.',\n proceedButton: 'G\u00E5 vidare',\n },\n loanDetails: {\n disclaimerText:\n '*Ber\u00E4knat p\u00E5 {{interest}} % r\u00E4nta (effektivt {{effectiveInterest}} %). Den r\u00E4nta du f\u00E5r s\u00E4tts vid avtalskrivning.',\n showDetails: 'Visa detaljer',\n details: 'Detaljer',\n repaymentPeriod: 'Avbetalningsperoid',\n months: 'm\u00E5n',\n interest: 'R\u00E4nta',\n effectiveInterest: 'Effektiv r\u00E4nta',\n setupFee: 'Uppl\u00E4ggningskostnad',\n administrationFee: 'Administrativa kostnader',\n totalCreditCost: 'Total kreditkostnad',\n disclaimerText1:\n '*Det h\u00E4r \u00E4r inte den slutgiltiga offerten. R\u00E4ntan kan komma att \u00E4ndras ifall det sker justeringar i initial amorteringsplan, till\u00E4gg i utrustning eller andra \u00E4ndringar som p\u00E5verkar det initiala prisf\u00F6rslaget.',\n disclaimerText2:\n 'Om marknadsr\u00E4ntan f\u00F6r\u00E4ndras kan m\u00E5nadskostnaden komma att \u00E4ndras i motsvarande m\u00E5n. M\u00E5nadskostnaden kan ocks\u00E5 komma att p\u00E5verkas utifr\u00E5n den kreditriskbed\u00F6mning som g\u00F6rs efter en kreditupplysning.',\n moreInfo: 'Mer information om {{loanOrgName}}',\n },\n loanDetailsDetailed: {\n showDetails: 'Visa detaljer',\n details: 'Detaljer',\n repaymentPeriod: 'Avbetalningsperoid',\n months: 'm\u00E5n',\n interest: 'R\u00E4nta',\n effectiveInterest: 'Effektiv r\u00E4nta',\n setupFee: 'Uppl\u00E4ggningskostnad',\n administrationFee: 'Administrativa kostnader',\n totalCreditCost: 'Total kreditkostnad',\n disclaimerText1:\n '*Det h\u00E4r \u00E4r inte den slutgiltiga offerten. R\u00E4ntan kan komma att \u00E4ndras ifall det sker justeringar i initial amorteringsplan, till\u00E4gg i utrustning eller andra \u00E4ndringar som p\u00E5verkar det initiala prisf\u00F6rslaget.',\n disclaimerText2:\n 'Om marknadsr\u00E4ntan f\u00F6r\u00E4ndras kan m\u00E5nadskostnaden komma att \u00E4ndras i motsvarande m\u00E5n. M\u00E5nadskostnaden kan ocks\u00E5 komma att p\u00E5verkas utifr\u00E5n den kreditriskbed\u00F6mning som g\u00F6rs efter en kreditupplysning.',\n moreInfo: 'Mer information om {{loanOrgName}}',\n },\n loanDetailsMonthlyCost: {\n monthlyCost: 'M\u00E5nadskostnad f\u00F6r l\u00E5net',\n perMonth: 'kr/m\u00E5n*',\n },\n stageCompletedFinancial: {\n downPayment: 'Kontantinsats',\n loanAmount: 'L\u00E5nebelopp',\n repaymentPeriod: 'Avbetalningsperoid',\n months: 'm\u00E5n',\n monthlyCost: 'M\u00E5nadskostnad f\u00F6r l\u00E5net',\n disclaimerText:\n '*Ber\u00E4knat p\u00E5 {{interest}} % r\u00E4nta (effektivt {{effectiveInterest}} %). Den r\u00E4nta du f\u00E5r s\u00E4tts vid avtalskrivning.',\n orderAlmostReady: 'Ordern \u00E4r snart klar, h\u00E4r ser du ditt l\u00E5nebesked:',\n changeFinancing: '\u00C4ndra finansiering',\n financing: 'Finansiering',\n cash: 'Kontant',\n lease: 'Privatleasing',\n },\n stageCompletedFinancialCreditAssessment: {\n approved: 'Grattis! Din l\u00E5neans\u00F6kan har beviljats av {loanName}.',\n approvedDescription:\n 'Slutf\u00F6r ordern genom att klicka dig igenom n\u00E4stkommande steg. Har du fr\u00E5gor under tiden? Kontakta {{contactName}} p\u00E5 tel {{contactPhone}}.',\n assessManually:\n 'N\u00E4r ordern \u00E4r slutf\u00F6rd kommer vi att g\u00E5 igenom ditt \u00E4rende och \u00E5terkoppla till dig med ett l\u00E5nebesked.',\n assessManuallyDescription:\n 'Din bil \u00E4r fortfarande inte reserverad. G\u00E5 vidare till n\u00E4sta steg f\u00F6r att slutf\u00F6ra ordern, men det \u00E4r inte s\u00E4kert att ditt l\u00E5n kommer att beviljas. Har du fr\u00E5gor under tiden? Kontakta {{contactName}} p\u00E5 tel {{contactPhone}}.',\n declined: 'Vi kan tyv\u00E4rr inte bevilja din ans\u00F6kan om bill\u00E5n.',\n declinedDescription:\n 'Det kan finnas olika sk\u00E4l till att en ans\u00F6kan nekas. Du kommer inom kort f\u00E5 ett brev med bekr\u00E4ftelse och mer information om just din ans\u00F6kan.',\n declinedNextSteps:\n 'Ditt redan p\u00E5b\u00F6rjade k\u00F6p kan fortfarande genomf\u00F6ras och avslutas, f\u00F6r att g\u00E5 vidare kan du v\u00E4lja ett annat betals\u00E4tt.',\n contactInfo: 'Har du fr\u00E5gor under tiden? Kontakta {{contactName}} p\u00E5 tel {{contactPhone}}.',\n },\n loanSummary: {\n title: 'Bill\u00E5n',\n description: 'Ordern \u00E4r snart klar, h\u00E4r ser du ditt l\u00E5nebesked:',\n successMessage: 'Grattis! Din l\u00E5neans\u00F6kan har beviljats av {{loanName}}.',\n notReserved:\n 'Bilen \u00E4r inte reserverad \u00E4nnu. Slutf\u00F6r ordern genom att klicka dig igenom n\u00E4stkommande steg. Har du fr\u00E5gor under tiden? Kontakta [handlaren] p\u00E5 tel [telefonnummer].',\n downPayment: 'Kontantinsats',\n loanAmount: 'L\u00E5nebelopp',\n repaymentPeriod: 'Avbetalningsperoid',\n monthlyCost: 'M\u00E5nadskostnad f\u00F6r l\u00E5net',\n disclaimer:\n '*Ber\u00E4knat p\u00E5 X,XX % r\u00E4nta (effektivt X,XX %). Den r\u00E4nta du f\u00E5r s\u00E4tts vid avtalskrivning.',\n },\n summary: {\n financing: 'Finansiering',\n cash: 'Kontant',\n loan: 'Bill\u00E5n',\n leasing: 'Privatleasing',\n changeButton: '\u00C4ndra',\n centralStorageTitle: 'Centrallager',\n dealerSelection: 'Val av handlare',\n customerTitle: 'Kunduppgifter',\n customerName: 'F\u00F6r- och efternamn',\n customerSSN: 'Personnummer',\n customerAddress: 'Adress',\n customerEmail: 'E-post',\n customerPhone: 'Telefonnummer',\n deliveryTitle: 'Leverans',\n deliveryMethod: 'Leveranss\u00E4tt',\n homeDelivery: 'Hemleverans',\n pickup: 'H\u00E4mta hos handlaren',\n thankYou: 'Tack f\u00F6r din order!',\n whatHappensNext: 'Det h\u00E4r h\u00E4nder nu:',\n orderConfirmation: 'En orderbekr\u00E4ftelse kommer att skickas till din e-postadress {{email}}.*',\n contactFromDealer:\n '{{contactName}} tar kontakt med dig f\u00F6r att g\u00E5 igenom avtal, betalning och leverans.',\n driveSafely: 'Klart! K\u00F6r f\u00F6rsiktigt ute p\u00E5 v\u00E4garna.',\n orderConfirmationDisclaimer:\n '*Orderbekr\u00E4ftelsen skickas normalt inom 10 minuter, men kan i undantagsfall dr\u00F6ja upp till 48 timmar.',\n orderNumber: 'Ordernummer {{createdOrderId}}',\n orderTitle: 'Din order',\n paymentMethod: 'Betals\u00E4tt',\n perMonth: 'kr/m\u00E5n',\n lease: 'Privatleasing',\n from: 'Fr\u00E5n',\n accessories: 'Tillbeh\u00F6r',\n insurance: 'F\u00F6rs\u00E4kring',\n free: 'Gratis',\n tradeInTitle: 'Inbytesbil',\n mileage: 'Miltal',\n description: 'Beskrivning',\n condition: 'Bilens skick',\n estimatedValue: 'Ungef\u00E4rligt v\u00E4rde',\n no: 'Nej',\n },\n insurance: {\n heading: 'Vill du teckna en f\u00F6rs\u00E4kring p\u00E5 din nya bil?',\n description: 'Nedan visas f\u00F6rslag p\u00E5 f\u00F6rs\u00E4kringar som passar dig och din nya bil.',\n proceedButton: 'G\u00E5 vidare',\n backButton: 'Tillbaka',\n logoAlt: 'Tillverkarens logotyp f\u00F6r {{title}}',\n ifDescription:\n 'Ange din uppskattade k\u00F6rstr\u00E4cka f\u00F6r att se din f\u00F6rs\u00E4kringskostnad. D\u00E4refter presenterar vi f\u00F6rslag p\u00E5 f\u00F6rs\u00E4kringar som passar dig och din nya bil. I b\u00E5de hel- och halvf\u00F6rs\u00E4kring ing\u00E5r trafikf\u00F6rs\u00E4kring som \u00E4r obligatoriskt att ha. Ifall du har valt att finansiera bilen med ett bill\u00E5n \u00E4r priset du ser rabatterat.',\n showInsurances: 'Visa f\u00F6rs\u00E4kringar',\n ifAlert:\n 'Vi \u00E4r anknutna f\u00F6rs\u00E4kringsf\u00F6rmedlare till {{insuranceDisclaimerTitle}}, If Skadef\u00F6rs\u00E4kring. F\u00F6rs\u00E4kringsgivare \u00E4r If Skadef\u00F6rs\u00E4kring (publ). Vad detta inneb\u00E4r kan du l\u00E4sa mer om p\u00E5 f\u00F6rs\u00E4kringsf\u00F6rmedlarens hemsida.',\n ifDisclaimer:\n 'Genom att du klickar p\u00E5 Visa f\u00F6rs\u00E4kringar s\u00E5 godk\u00E4nner du att vi skickar dina uppgifter vidare till {{insuranceDisclaimerTitle}} f\u00F6r att de ska kunna ge dig ett pris p\u00E5 f\u00F6rs\u00E4kring. Hur de hanterar dina personuppgifter kan du l\u00E4sa om p\u00E5 deras hemsida.',\n skipButton: 'Hoppa \u00F6ver detta steg',\n perMonth: 'kr/m\u00E5n',\n addons: 'Tillval',\n includes: 'F\u00F6rs\u00E4kringen inneh\u00E5ller',\n update: 'Uppdatera',\n select: 'V\u00E4lj',\n estimatedMileage: 'Uppskattad k\u00F6rstr\u00E4cka',\n edit: '\u00C4ndra',\n fetchError: 'Det gick inte att h\u00E4mta f\u00F6rs\u00E4kringar.',\n retry: 'F\u00F6rs\u00F6k igen',\n title: 'F\u00F6rs\u00E4kring',\n none: 'Ingen',\n changeButtonTitle: '\u00C4ndra f\u00F6rs\u00E4kring',\n },\n tradeIn: {\n title: 'Inbytesbil',\n mileage: 'Miltal',\n description: 'Beskrivning',\n condition: 'Bilens skick',\n estimatedValue: 'Ungef\u00E4rligt v\u00E4rde',\n infoText: 'Vi skickar med uppgifter om din inbytesbil till bilhandlaren.',\n infoDisclaimer:\n 'Observera att v\u00E4rderingen som utf\u00F6rs ger ett uppskattat inbytesv\u00E4rde. Det slutgiltliga v\u00E4rdet avg\u00F6rs n\u00E4r handlare kan bekr\u00E4fta bilens skick.',\n no: 'Nej',\n changeButtonTitle: '\u00C4ndra',\n heading: 'Har du en inbytesbil?',\n tradeInDescription:\n 'Har du en bil du vill byta in n\u00E4r du k\u00F6per din nya bil? H\u00E4r f\u00E5r du ett uppskattat ink\u00F6pspris av oss direkt online.',\n yesButton: 'Jag har inbytesbil',\n skipButton: 'Hoppa \u00F6ver detta steg',\n veryGoodCondition: 'Mycket bra skick',\n goodCondition: 'Bra skick',\n okCondition: 'Helt okej skick',\n noScratches: 'Inga repor eller skador',\n serviced: 'Servad vid varje tillf\u00E4lle med st\u00E4mplar i serviceboken',\n goodTires: 'D\u00E4ck med v\u00E4ldigt bra m\u00F6nsterdjup (5-8 mm)',\n someScratches: 'N\u00E5gra mindre repor och/eller skador',\n okTires: 'D\u00E4ck som inte beh\u00F6ver bytas (m\u00F6nsterdjup om 3-5 mm)',\n manyScratches: 'Finns en del repor och skador',\n notServiced: 'Inte servad vid varje tillf\u00E4lle',\n badTires: 'D\u00E4ck som beh\u00F6ver bytas (m\u00F6nsterdjup under 3 mm)',\n detailsHeading: 'Uppgifter om din inbytesbil',\n detailsDescription:\n 'Ange registreringsnumret och aktuellt miltal f\u00F6r din inbytesbil s\u00E5 f\u00E5r du ett uppskattat ink\u00F6pspris av oss.',\n registrationNumber: 'Registreringsnummer',\n registrationNumberError:\n 'Ett giltig registreringsnummer i formatet ABC123 eller ABC12A m\u00E5ste anges',\n registrationNumberPlaceholder: 'Ange registreringsnummer',\n mileageError: 'Ett miltal mellan 0 till 80 000 mil m\u00E5ste anges',\n mileagePlaceholder: 'Ange bilens miltal',\n descriptionOptional: 'Beskrivning (valfritt)',\n descriptionError: 'Beskrivningen \u00E4r inte giltig',\n descriptionPlaceholder: 'Beskriv bilen',\n fetchValue: 'H\u00E4mta uppskattat v\u00E4rde',\n proceedButton: 'Anv\u00E4nd och g\u00E5 vidare',\n fetchError:\n 'Tyv\u00E4rr fick vi ingen tr\u00E4ff p\u00E5 registreringsnummret du angav. V\u00E4nligen kontrollera att registreringsnummret st\u00E4mmer.',\n },\n vehicleInfo: 'Fordonsinformation',\n orderCallback: {\n thankYou: 'Tack f\u00F6r ditt k\u00F6p',\n orderId: 'Order id',\n waykeId: 'Wayke id',\n },\n howTo: {\n heading: 'S\u00E5 h\u00E4r k\u00F6per du bilen online',\n description:\n 'Hos oss kan du tryggt k\u00F6pa din n\u00E4sta bil online. Reservera bilen genom att klicka dig igenom v\u00E5rt k\u00F6pfl\u00F6de med f\u00F6ljande steg:',\n timelineAriaLabel: 'Tillv\u00E4gag\u00E5ngss\u00E4tt',\n customerHeading: 'Dina kunduppgifter',\n centralStorageHeading: 'V\u00E4lj anl\u00E4ggning',\n centralStorageDescription: 'V\u00E4lj vilken anl\u00E4ggning du vill k\u00F6pa bilen ifr\u00E5n.',\n deliveryHeading: 'V\u00E4lj leveranss\u00E4tt',\n tradeInHeading: 'Har du inbytesbil?',\n tradeInDescription: 'F\u00E5 den v\u00E4rderad direkt online.',\n financialHeading: '\u00C4gandeform',\n insuranceHeading: 'Vill du teckna en f\u00F6rs\u00E4kring?',\n insuranceDescription: 'Se f\u00F6rslag p\u00E5 f\u00F6rs\u00E4kringar som passar din nya bil.',\n accessoriesHeading: 'Tillbeh\u00F6r',\n accessoriesDescription: 'Best\u00E4ll extra utrustning till din bil.',\n financialDescriptionAll:\n 'Denna bil kan du k\u00F6pa kontant, privatleasa eller finansiera med ett bill\u00E5n.',\n financialDescriptionCashLease: 'Denna bil kan du k\u00F6pa kontant eller privatleasa.',\n financialDescriptionCashLoan: 'Denna bil kan du k\u00F6pa kontant eller finansiera med ett bill\u00E5n',\n financialDescriptionLoanLease: 'Denna bil kan du privatleasa eller finansiera med ett bill\u00E5n',\n financialDescriptionCash: 'Denna bil kan du k\u00F6pa kontant.',\n financialDescriptionLoan: 'Denna bil kan du finansiera med ett bill\u00E5n',\n financialDescriptionLease: 'Denna bil kan du privatleasa.',\n deliveryDescriptionBoth: 'Hemleverans eller h\u00E4mta hos handlaren.',\n deliveryDescriptionPickup: 'H\u00E4mta hos handlaren.',\n deliveryDescriptionHome: 'Hemleverans.',\n paymentHeading: 'Genomf\u00F6r f\u00F6rskottsbetalning!',\n paymentDescription:\n 'Genomf\u00F6r f\u00F6rskottskottsbetalning p\u00E5 5% av bilens v\u00E4rde. (Genomf\u00F6r betalning av deposition motsvarande 5% av bilens v\u00E4rde.)',\n finalHeading: 'Klart!',\n finalDescription:\n 'Efter att ordern \u00E4r genomf\u00F6rd tar {{contactName}} kontakt med dig s\u00E5 kommer ni tillsammans fram till detaljer kring betalning och skriver avtal.',\n },\n preview: {\n heading: 'Vad roligt att du vill k\u00F6pa denna bil!',\n proceedButton: 'G\u00E5 vidare',\n checklistTitle: 'K\u00F6p online hos Wayke',\n checklistAriaLabel: 'F\u00F6rdelar med att k\u00F6pa bilen online hos Wayke',\n checklistItem1: 'Trygg hantering av personuppgifter',\n checklistItem2: 'Reservera bilen nu - betalning och avtalsskrivning sker senare med handlaren',\n checklistItem3: 'Inte bindande f\u00F6rr\u00E4n avtal skrivits ihop med handlaren',\n checklistItem4: 'Bara kontrollerade bilar',\n error: 'Ett fel uppstod och det gick inte att initiera modulen. F\u00F6rs\u00F6k igen.',\n reserved:\n 'Bilen \u00E4r tyv\u00E4rr reserverad av en annan k\u00F6pare och kan d\u00E4rf\u00F6r inte reserveras just nu.',\n unavailable: 'Bilen \u00E4r tyv\u00E4rr inte l\u00E4ngre tillg\u00E4nglig och kan d\u00E4rf\u00F6r inte reserveras.',\n },\n};\n\nexport default svSE;\n", "import { MarketCode } from '../@types/MarketCode';\n\nexport const getLanguage = (marketCode?: MarketCode) => {\n switch (marketCode) {\n case 'NO':\n return 'nb-NO';\n case 'SE':\n return 'sv-SE';\n default:\n return 'sv-SE';\n }\n};\n", "import './styles/styles.scss';\n\nimport i18next, { initializeI18N } from '@i18n';\nimport { config, IOrderOptionsResponse } from '@wayke-se/ecom';\nimport packageJson from '../package.json';\nimport { CallbackOrder } from './@types/CallbackOrder';\nimport { EcomSdkConfig } from './@types/EcomSdkConfig';\nimport { MarketCode } from './@types/MarketCode';\nimport { ViewTypes } from './@types/Navigation';\nimport { Vehicle } from './@types/Vehicle';\nimport Modal from './Components/Modal/Modal';\nimport { creditAssessmentCancelSigning } from './Data/creditAssessmentCancelSigning';\nimport { reset, setId, setState } from './Redux/action';\nimport { ReducerState } from './Redux/reducer';\nimport { createStore, WaykeStore } from './Redux/store';\nimport watch, { unregisterAllSubscriptions } from './Redux/watch';\nimport ecomEvent, {\n EcomEvent,\n EcomStep,\n EcomView,\n getLastHistory,\n registerEventListner,\n unregisterEventListner,\n} from './Utils/ecomEvent';\nimport { unregisterAllIntervals } from './Utils/intervals';\nimport { StageMapKeys } from './Utils/stage';\nimport { useVwListner } from './Utils/vw';\nimport ConfirmClose from './Views/ConfirmClose';\nimport Main from './Views/Main';\nimport OrderCallback from './Views/OrderCallback';\nimport Preview from './Views/Preview';\nimport Summary from './Views/Summary';\n\nconst OrderIdQueryString = 'order';\nconst Payment3DSecurityCallback = 'wayke-ecom-web-payment';\nconst OrderWaykeIdQueryString = 'wayke-ecom-web-id';\n\nexport const WAYKE_ECOM_MODAL_ID = 'wayke-ecom-modal';\n\nconst TEST_HOST = 'ecom.wayketech.se';\nconst PROD_HOST = 'ecom.wayke.se';\nconst resolveCdnMedia = (url: string) => {\n const _url = new URL(url);\n switch (_url.host) {\n case PROD_HOST:\n return 'https://cdn.wayke.se';\n case TEST_HOST:\n return 'https://test-cdn.wayketech.se';\n default:\n return undefined;\n }\n};\n\nexport interface AppState {\n stage: number;\n order?: IOrderOptionsResponse;\n}\n\ninterface AppProps {\n rootId?: string;\n id: string;\n vehicle?: Vehicle;\n ecomSdkConfig: EcomSdkConfig;\n logo?: string;\n logoX2?: string;\n onEvent?: (view: EcomView, event: EcomEvent, currentStep?: EcomStep, data?: any) => void;\n marketCode?: MarketCode;\n}\n\nclass App {\n private root: HTMLElement;\n private readonly props: AppProps;\n private view: ViewTypes;\n private stageOrderList: StageMapKeys[];\n private readonly cdnMedia?: string;\n private readonly contexts: {\n store: WaykeStore;\n modal?: Modal;\n lastTrigger?: HTMLElement; // The element that triggered the modal\n unsubribeVwListner?: () => void;\n } = {\n store: createStore(),\n };\n private marketCode: MarketCode;\n\n constructor(props: AppProps) {\n if (!props.id) throw 'Missing id';\n this.props = props;\n this.marketCode = props.marketCode || 'SE';\n initializeI18N(this.marketCode);\n\n if (!window.process) {\n window.process = {\n ...((window.process || {}) as NodeJS.Process),\n env: {},\n };\n }\n\n config.bind(props.ecomSdkConfig);\n this.cdnMedia = resolveCdnMedia(props.ecomSdkConfig.api.address);\n const createdRoot = document.createElement('div');\n createdRoot.className = 'waykeecom-root';\n\n if (this.marketCode === 'NO') {\n createdRoot.setAttribute('data-theme', 'drive');\n }\n\n this.root = createdRoot;\n if (this.props.rootId) {\n const rootNode = document.getElementById(this.props.rootId);\n if (!rootNode) throw 'Missing element with id wayke-ecom';\n rootNode.appendChild(createdRoot);\n } else {\n document.body.appendChild(this.root);\n }\n\n this.root.dataset.version = packageJson.version;\n\n // Stage order setup\n this.stageOrderList = [\n 'centralStorage',\n 'customer',\n 'financial',\n 'tradeIn',\n 'accessories',\n 'insurance',\n 'delivery',\n ];\n\n setId(props.id)(this.contexts.store.dispatch);\n\n this.view = this.contexts.store.getState().navigation.view;\n watch<ViewTypes>(\n this.contexts.store,\n 'navigation.view',\n (newVal) => {\n this.view = newVal;\n if (newVal !== 'preview') {\n this.render();\n }\n },\n true\n );\n\n const params = new URLSearchParams(location.search);\n const orderUrl = params.get(OrderIdQueryString) || undefined;\n const payment3dSecurityCallback = !!params.get(Payment3DSecurityCallback);\n const waykeId = params.get(OrderWaykeIdQueryString);\n if (waykeId && waykeId === this.props.id && (orderUrl || payment3dSecurityCallback)) {\n if (payment3dSecurityCallback) {\n const stateAsString = sessionStorage.getItem('wayke-ecom-state');\n sessionStorage.removeItem('wayke-ecom-state');\n const state = stateAsString\n ? (JSON.parse(stateAsString) as unknown as ReducerState | undefined)\n : undefined;\n if (state) {\n this.view = state.navigation.view;\n setState({ ...state, stateLoadedFromSession: true } as unknown as ReducerState)(\n this.contexts.store.dispatch\n );\n }\n } else if (orderUrl) {\n this.render({\n orderUrl,\n id: waykeId,\n });\n }\n }\n }\n\n close() {\n const lastEvent = getLastHistory();\n if (lastEvent) {\n ecomEvent(lastEvent.view, EcomEvent.CLOSE, lastEvent.currentStep);\n }\n const { caseId } = this.contexts.store.getState();\n const params = new URLSearchParams(location.search);\n const orderId = params.get(OrderIdQueryString);\n const orderWaykeId = params.get(OrderWaykeIdQueryString);\n let urlChanged = false;\n if (orderId) {\n params.delete(OrderIdQueryString);\n urlChanged = true;\n location.search = params.toString();\n }\n\n if (orderWaykeId) {\n params.delete(OrderWaykeIdQueryString);\n urlChanged = true;\n }\n\n if (urlChanged) {\n location.search = params.toString();\n }\n\n this.root.innerHTML = '';\n this.contexts?.unsubribeVwListner?.();\n\n unregisterAllIntervals();\n unregisterAllSubscriptions();\n if (caseId) {\n creditAssessmentCancelSigning(caseId);\n }\n sessionStorage.removeItem('wayke-ecom-state');\n reset(this.props.id)(this.contexts.store.dispatch);\n if (this.props.onEvent) {\n unregisterEventListner(this.props.onEvent);\n }\n\n // Set focus back to the element that triggered the modal\n if (this.contexts.lastTrigger) {\n this.contexts.lastTrigger.focus();\n this.contexts.lastTrigger = undefined;\n }\n }\n\n destroy() {\n this.close();\n this.root.remove();\n }\n\n private closeWithConfirm() {\n const { navigation, createdOrderId } = this.contexts.store.getState();\n const firstView = navigation.view === 'preview';\n unregisterAllIntervals();\n if (firstView || createdOrderId) {\n this.close();\n return;\n }\n\n this.contexts.modal = new Modal(this.root, {\n title: i18next.t('glossary.modalTitle'),\n id: WAYKE_ECOM_MODAL_ID,\n logo: this.props.logo,\n logoX2: this.props.logoX2,\n marketCode: this.marketCode,\n });\n\n const lastEvent = getLastHistory();\n if (lastEvent) {\n ecomEvent(lastEvent.view, EcomEvent.CONFIRM_CLOSE_ACTIVE);\n }\n new ConfirmClose(this.contexts.modal.content, {\n onConfirmClose: () => {\n const lastEvent = getLastHistory();\n ecomEvent(lastEvent.view, EcomEvent.CONFIRM_CLOSE_CONFIRMED, lastEvent.currentStep);\n this.close();\n },\n onAbortClose: () => {\n const lastEvent = getLastHistory();\n ecomEvent(lastEvent.view, EcomEvent.CONFIRM_CLOSE_ABORTED, lastEvent.currentStep);\n this.render();\n },\n });\n }\n\n start() {\n if (this.props.onEvent) {\n registerEventListner(this.props.onEvent);\n }\n\n ecomEvent(EcomView.PREVIEW, EcomEvent.START);\n this.render();\n }\n\n private focusModal() {\n if (this.contexts.modal?.content) {\n this.contexts.modal.content.setAttribute('tabindex', '-1');\n this.contexts.modal.content.focus();\n }\n }\n\n private render(callbackOrder?: CallbackOrder) {\n if (!this.contexts.lastTrigger) {\n this.contexts.lastTrigger = document.activeElement as HTMLElement;\n }\n if (!this.contexts.unsubribeVwListner) {\n this.contexts.unsubribeVwListner = useVwListner();\n }\n this.contexts.modal = new Modal(this.root, {\n title: i18next.t('glossary.modalTitle'),\n id: WAYKE_ECOM_MODAL_ID,\n logo: this.props.logo,\n logoX2: this.props.logoX2,\n onClose: () => this.closeWithConfirm(),\n marketCode: this.marketCode,\n });\n\n if (this.contexts.modal.content) {\n this.contexts.modal.content.innerHTML = '';\n\n if (callbackOrder) {\n new OrderCallback(this.contexts.modal.content, {\n store: this.contexts.store,\n callbackOrder,\n onClose: () => this.close(),\n });\n\n // Set focus to the modal to trap focus\n this.focusModal();\n\n return;\n }\n\n switch (this.view) {\n case 'preview':\n new Preview(this.contexts.modal.content, {\n store: this.contexts.store,\n stageOrderList: this.stageOrderList,\n vehicle: this.props.vehicle,\n cdnMedia: this.cdnMedia,\n });\n break;\n case 'main':\n new Main(this.contexts.modal.content, {\n store: this.contexts.store,\n cdnMedia: this.cdnMedia,\n marketCode: this.marketCode,\n });\n break;\n case 'summary':\n new Summary(this.contexts.modal.content, {\n store: this.contexts.store,\n cdnMedia: this.cdnMedia,\n onClose: () => this.close(),\n marketCode: this.marketCode,\n });\n break;\n default:\n throw 'Unknown view...';\n }\n\n // Set focus to the modal to trap focus\n this.focusModal();\n }\n }\n}\n\nexport default App;\n", "{\n \"name\": \"@wayke-se/ecom-web\",\n \"version\": \"2.1.1\",\n \"description\": \"Wayke Ecom Web\",\n \"type\": \"module\",\n \"module\": \"dist/index.mjs\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"homepage\": \"https://github.com/wayke-se/wayke-ecom-web\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/wayke-se/wayke-ecom-web.git\"\n },\n \"scripts\": {\n \"start\": \"node ./esbuild/start.js\",\n \"clip\": \"node ./esbuild/clip-ui.js && node ./clip-ui/start.js\",\n \"build\": \"npm run clean && node ./esbuild/lib.js && node ./esbuild/cdn.js && npm run build:types\",\n \"build:types\": \"tsc --project tsconfig.build.json --declaration --emitDeclarationOnly --outDir dist\",\n \"clean\": \"rimraf build && rimraf dist && rimraf dist-cdn\",\n \"test\": \"npm run lint && npm run typecheck\",\n \"typecheck\": \"tsc -noEmit\",\n \"typecheck:watch\": \"tsc -noEmit -watch\",\n \"lint\": \"npx @biomejs/biome check\",\n \"lint:fix\": \"npx @biomejs/biome check --write\",\n \"stylelint\": \"stylelint '**/*.scss'\",\n \"prepare\": \"husky\"\n },\n \"author\": \"Wayke\",\n \"license\": \"ISC\",\n \"lint-staged\": {\n \"*.{js,ts}\": [\n \"npx @biomejs/biome check\"\n ]\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.4.16\",\n \"@ourstudio/clip-ui\": \"^0.0.11\",\n \"@types/node\": \"^25.9.1\",\n \"@types/object-path\": \"^0.11.1\",\n \"@types/sanitize-html\": \"^2.16.1\",\n \"esbuild\": \"^0.28.0\",\n \"esbuild-sass-plugin\": \"^3.7.0\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^17.0.5\",\n \"rimraf\": \"^6.1.3\",\n \"stylelint\": \"^17.12.0\",\n \"stylelint-config-prettier-scss\": \"^1.0.0\",\n \"stylelint-config-standard-scss\": \"^17.0.0\",\n \"typescript\": \"^6.0.3\"\n },\n \"dependencies\": {\n \"@wayke-se/ecom\": \"^4.6.1\",\n \"i18next\": \"^26.3.0\",\n \"marked\": \"^18.0.4\",\n \"object-path\": \"^0.11.8\",\n \"redux\": \"^5.0.1\",\n \"sanitize-html\": \"^2.17.4\"\n },\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"volta\": {\n \"node\": \"24\"\n }\n}\n", "export function trapFocus(modalElement: HTMLElement) {\n modalElement.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n const focusableSelector =\n 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n const focusableElements = modalElement.querySelectorAll<HTMLElement>(focusableSelector);\n if (focusableElements.length === 0) return;\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === firstElement) {\n e.preventDefault();\n lastElement.focus();\n }\n } else {\n if (document.activeElement === lastElement) {\n e.preventDefault();\n firstElement.focus();\n }\n }\n }\n });\n}\n", "interface Attribute {\n key: string;\n value: string;\n}\n\nexport interface HtmlNodeSettings {\n htmlTag: keyof HTMLElementTagNameMap;\n className?: string;\n id?: string;\n attributes?: Attribute[];\n}\n\nclass HtmlNode {\n private element: HTMLElement;\n node: HTMLElement;\n\n constructor(element: HTMLElement | null | undefined, settings?: HtmlNodeSettings) {\n if (!element) throw 'Missing element';\n if (!settings) {\n // Attch only to given node\n this.element = element;\n this.node = element;\n return;\n }\n\n // Append to given node\n this.element = element;\n const existingElement = settings.id\n ? this.element.querySelector<HTMLElement>(`#${settings.id}`)\n : undefined;\n\n if (existingElement) {\n // Reuse node\n existingElement.className = settings.className || '';\n settings.attributes?.forEach((attribute) => {\n existingElement.setAttribute(attribute.key, attribute.value);\n });\n this.node = existingElement;\n } else {\n const item = document.createElement(settings.htmlTag);\n if (settings.id) {\n item.id = settings.id;\n }\n item.className = settings.className || '';\n settings.attributes?.forEach((attribute) => {\n item.setAttribute(attribute.key, attribute.value);\n });\n element.appendChild(item);\n\n this.node = item;\n }\n }\n}\n\nexport default HtmlNode;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalBodyProps {\n id: string;\n}\n\nclass ModalBody extends HtmlNode {\n constructor(element: HTMLElement, { id }: ModalBodyProps) {\n super(element, {\n htmlTag: 'div',\n className: 'waykeecom-modal__body',\n id,\n });\n }\n}\n\nexport default ModalBody;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalCenterProps {\n id: string;\n}\nclass ModalCenter extends HtmlNode {\n constructor(element: HTMLElement, { id }: ModalCenterProps) {\n super(element, {\n htmlTag: 'div',\n className: 'waykeecom-modal__center',\n id,\n });\n }\n}\n\nexport default ModalCenter;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonCloseProps {\n readonly title: string;\n readonly id?: string;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonClose extends HtmlNode {\n private readonly props: ButtonCloseProps;\n\n constructor(element: HTMLElement | null, props: ButtonCloseProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { title, id, onClick } = this.props;\n\n this.node.innerHTML = `\n <button\n title=\"${title}\"\n ${id ? `id=\"${id}\"` : ''}\n class=\"waykeecom-modal__close-btn\"\n >\n <span class=\"waykeecom-sr-only\">${title}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n aria-hidden=\"true\"\n >\n <path d=\"M9.1 8l5.9 5.9-1.1 1.1L8 9.1 2.1 15 1 13.9 6.9 8 1 2.1 2.1 1 8 6.9 13.9 1 15 2.1 9.1 8z\" />\n </svg>\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonClose;\n", "import i18next from '@i18n';\nimport ButtonClose from '../Button/ButtonClose';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalCloseProps {\n readonly id: string;\n readonly onClose?: () => void;\n}\nclass ModalClose extends HtmlNode {\n private readonly props: ModalCloseProps;\n\n constructor(element: HTMLElement, props: ModalCloseProps) {\n super(element, {\n htmlTag: 'div',\n className: 'waykeecom-modal__close',\n id: props.id,\n });\n\n this.props = props;\n this.render();\n\n // Add keydown listener for Escape key if onClose is provided\n if (this.props.onClose) {\n window.addEventListener('keydown', this.handleKeydown);\n }\n }\n\n private handleKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n this.props.onClose && this.props.onClose();\n }\n };\n\n render() {\n const { onClose } = this.props;\n this.node.innerHTML = '';\n\n if (onClose) {\n new ButtonClose(this.node, {\n title: i18next.t('glossary.closeModal'),\n onClick: () => onClose(),\n });\n }\n }\n}\n\nexport default ModalClose;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalContainerProps {\n id: string;\n}\nclass ModalContainer extends HtmlNode {\n constructor(element: HTMLElement, { id }: ModalContainerProps) {\n super(element, {\n htmlTag: 'div',\n className: 'waykeecom-modal__container',\n id,\n });\n }\n}\n\nexport default ModalContainer;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalDialogProps {\n id: string;\n}\nclass ModalDialog extends HtmlNode {\n constructor(element: HTMLElement, { id }: ModalDialogProps) {\n super(element, {\n htmlTag: 'div',\n className: 'waykeecom-modal__dialog',\n id,\n });\n }\n}\n\nexport default ModalDialog;\n", "import { MarketCode } from '../@types/MarketCode';\n\ninterface LogotypeProps {\n market: MarketCode;\n className?: string;\n}\n\nexport const getWordmarkLogotype = ({ market, className }: LogotypeProps) => {\n switch (market) {\n case 'SE':\n return `\n <svg ${!!className ? `class=\"${className}\"` : ''} viewBox=\"0 0 548.95 123.3\" preserveAspectRatio=\"xMinYMid\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <title>Wayke</title>\n <g>\n <path d=\"M275.16,48.31l-18.69,53.3h-12L219.59,28h15.08l16.84,52.57,18-52.88h12.29l18.08,53L316.68,28h13.64l-24.17,73.65H293.75Z\"></path>\n <path d=\"M348.51,102c-12.8,0-26.41-9.45-26.41-27s13.61-27,26.41-27c5.12,0,12.39,2,16,7.48l.76,1.16V49h12.92v52.29H365.26V93.18l-.77,1.22C361,100,353,102,348.51,102Zm1.92-41.62c-7.37,0-15,5.48-15,14.65a14.67,14.67,0,0,0,15,14.65c7.39,0,14.87-5,14.87-14.65S357.63,60.36,350.42,60.36Z\"></path>\n <path d=\"M408.36,123.3H395.14l9.92-22.93L381.51,49h14.88l15.39,35.53L427.16,49h13.43Z\"></path>\n <path d=\"M456.35,77.54V101.3h-13V25.83h13V70.31l24-21.28h17.25L469.78,73.41,499,101.3H481.34Z\"></path>\n <path d=\"M548.95,75.88v1.45H507.43c.52,8.16,6.5,14.36,15.18,14.36,8.37,0,11.78-4.23,12.71-5.68h13c-.83,5.37-8,16.63-25.72,16.63-16.94,0-28.4-11.77-28.4-27.47,0-16.22,11.36-27.47,27.37-27.47S548.95,58.84,548.95,75.88Zm-41.11-7.64h27.27c-2-6.61-6.82-10.33-13.53-10.33C514.45,57.92,509.49,61.73,507.84,68.24Z\"></path>\n </g>\n <g>\n <circle cx=\"4.25\" cy=\"39.68\" r=\"4.25\"></circle>\n <circle cx=\"25.15\" cy=\"68.03\" r=\"4.96\"></circle>\n <circle cx=\"46.04\" cy=\"96.38\" r=\"6.38\"></circle>\n <circle cx=\"66.93\" cy=\"68.03\" r=\"7.09\"></circle>\n <circle cx=\"87.82\" cy=\"39.68\" r=\"8.5\"></circle>\n <circle cx=\"108.72\" cy=\"68.03\" r=\"10.63\"></circle>\n <circle cx=\"129.61\" cy=\"96.38\" r=\"12.76\"></circle>\n <circle cx=\"150.5\" cy=\"68.03\" r=\"13.47\"></circle>\n <circle cx=\"171.4\" cy=\"39.68\" r=\"14.17\"></circle>\n <circle cx=\"129.61\" cy=\"39.68\" r=\"12.05\"></circle>\n <circle cx=\"66.93\" cy=\"11.34\" r=\"7.09\"></circle>\n <circle cx=\"150.5\" cy=\"11.34\" r=\"11.34\"></circle>\n <circle cx=\"108.72\" cy=\"11.34\" r=\"10.63\"></circle>\n <circle cx=\"46.04\" cy=\"39.68\" r=\"6.38\"></circle>\n <circle cx=\"25.15\" cy=\"11.34\" r=\"4.96\"></circle>\n </g>\n </svg>\n `;\n case 'NO':\n return `\n <svg ${!!className ? `class=\"${className}\"` : ''} xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 93\" preserveAspectRatio=\"xMinYMid\">\n <title>Drive</title>\n <path d=\"M234.501 0h21.343l7.478 74.395h3.583L295.466 0h21.343l-35.754 92.987h-36.947L234.501 0ZM221.882 18.631 224.504 0h-20.681l-2.609 18.631h20.668ZM198.617 37.12 190.763 93h20.668l7.854-55.88h-20.668ZM185.817 32.543C188.491 13.95 176.482 0 154.464 0h-46.022l-2.597 18.631h45.919c9.334 0 14.54 5.986 13.333 13.95-1.207 7.965-7.867 13.951-17.202 13.951h-25.302l1.298-9.373h-20.668l-7.79 55.867h20.681l3.895-27.888h23.368c3.739 9.554 7.478 18.462 11.477 27.888h22.07l-12.983-31.884a36.086 36.086 0 0 0 14.785-11.381 35.881 35.881 0 0 0 7.091-17.218ZM47.087 0H13.073L5.206 55.893h20.629l5.193-37.3h13.385c16.682 0 27.081 11.959 24.81 27.9A32.546 32.546 0 0 1 58.14 66.55a32.796 32.796 0 0 1-21.595 7.845H2.61L.013 93h34c28.679 0 52.151-20.583 55.89-46.545C93.642 20.493 75.765 0 47.087 0ZM325.975 0l-2.623 18.592h73.987L400 0h-74.025ZM336.101 74.395l2.674-18.592h42.024l2.661-18.606h-62.717L312.888 93h74.039l2.544-18.605h-53.37Z\"/>\n </svg>\n `;\n }\n};\n\n// Receive symbol logotype based on current market\n\nexport const getSymbolLogotype = ({ market, className }: LogotypeProps) => {\n switch (market) {\n case 'SE':\n return `\n <svg ${!!className ? `class=\"${className}\"` : ''} viewBox=\"0 0 185.57 109.13\" preserveAspectRatio=\"xMinYMid\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <title>Wayke</title>\n <circle cx=\"4.25\" cy=\"39.68\" r=\"4.25\"></circle>\n <circle cx=\"25.15\" cy=\"68.03\" r=\"4.96\"></circle>\n <circle cx=\"46.04\" cy=\"96.38\" r=\"6.38\"></circle>\n <circle cx=\"66.93\" cy=\"68.03\" r=\"7.09\"></circle>\n <circle cx=\"87.82\" cy=\"39.68\" r=\"8.5\"></circle>\n <circle cx=\"108.72\" cy=\"68.03\" r=\"10.63\"></circle>\n <circle cx=\"129.61\" cy=\"96.38\" r=\"12.76\"></circle>\n <circle cx=\"150.5\" cy=\"68.03\" r=\"13.47\"></circle>\n <circle cx=\"171.4\" cy=\"39.68\" r=\"14.17\"></circle>\n <circle cx=\"129.61\" cy=\"39.68\" r=\"12.05\"></circle>\n <circle cx=\"66.93\" cy=\"11.34\" r=\"7.09\"></circle>\n <circle cx=\"150.5\" cy=\"11.34\" r=\"11.34\"></circle>\n <circle cx=\"108.72\" cy=\"11.34\" r=\"10.63\"></circle>\n <circle cx=\"46.04\" cy=\"39.68\" r=\"6.38\"></circle>\n <circle cx=\"25.15\" cy=\"11.34\" r=\"4.96\"></circle>\n </svg>\n `;\n case 'NO':\n return `\n <svg ${!!className ? `class=\"${className} waykeecom-modal__norway-footer-logo\"` : ''} xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 37 38\">\n <title>Drive</title>\n <path d=\"M19.27 0H5.348L2.126 22.838h8.445l2.126-15.241h5.479c6.83 0 11.086 4.886 10.156 11.4a13.292 13.292 0 0 1-4.537 8.195 13.441 13.441 0 0 1-8.84 3.206H1.063L0 38h13.919c11.74 0 21.349-8.41 22.88-19.018C38.328 8.373 31.01 0 19.27 0Z\" />\n </svg>\n `;\n }\n};\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../@types/MarketCode';\nimport { getSymbolLogotype } from '../../Templates/Logotype';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalFooterProps {\n readonly id: string;\n readonly marketCode: MarketCode;\n}\nclass ModalFooter extends HtmlNode {\n private readonly props: ModalFooterProps;\n\n constructor(element: HTMLElement, props: ModalFooterProps) {\n super(element, {\n htmlTag: 'footer',\n className: 'waykeecom-modal__footer',\n id: props.id,\n });\n\n this.props = props;\n this.render();\n }\n\n render() {\n this.node.innerHTML = `\n <div class=\"waykeecom-hstack waykeecom-hstack--spacing-1 waykeecom-hstack--align-center\">\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\">\n ${getSymbolLogotype({\n market: this.props.marketCode,\n className: 'waykeecom-modal__footer-logo',\n })} \n </div>\n <div class=\"waykeecom-hstack__item\">\n Powered by <a href=\"${i18next.t('glossary.homeUrl')}\" title=\"${i18next.t('glossary.goToHome')}\" target=\"_blank\" rel=\"noopener noreferer\" class=\"waykeecom-link waykeecom-link--no-external-icon waykeecom-link--current-color waykeecom-link--underline\">${i18next.t('glossary.company')}</a>\n </div>\n </div>\n `;\n }\n}\n\nexport default ModalFooter;\n", "import { MarketCode } from '../../@types/MarketCode';\nimport { getWordmarkLogotype } from '../../Templates/Logotype';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ModalHeaderProps {\n readonly title: string;\n readonly id: string;\n readonly logo?: string;\n readonly logoX2?: string;\n readonly onClose?: () => void;\n readonly marketCode: MarketCode;\n}\n\nclass ModalHeader extends HtmlNode {\n private readonly props: ModalHeaderProps;\n\n constructor(element: HTMLElement, props: ModalHeaderProps) {\n super(element, {\n htmlTag: 'header',\n className: 'waykeecom-modal__header',\n id: props.id,\n });\n this.props = props;\n this.render();\n }\n\n render() {\n const { title, logo, logoX2, onClose } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-header\">\n <div class=\"waykeecom-header__logo\">\n <h2 class=\"waykeecom-no-margin\">\n ${\n logo\n ? `\n <img\n src=\"${logo}\"\n ${logoX2 ? `srcset=\"${logoX2} 2x\"` : ''}\n alt=\"${title}\"\n class=\"waykevaluation-image\"\n />\n `\n : getWordmarkLogotype({\n market: this.props.marketCode,\n className: 'waykevaluation-header__logo--svg',\n })\n }\n </h2>\n </div>\n </div>\n `;\n if (onClose) {\n this.node.querySelectorAll<HTMLButtonElement>('button').forEach((button) => {\n button.addEventListener('click', () => onClose());\n });\n }\n }\n}\n\nexport default ModalHeader;\n", "import { MarketCode } from '../../@types/MarketCode';\nimport { trapFocus } from '../../Utils/trapFocus';\nimport HtmlNode from '../Extension/HtmlNode';\nimport ModalBody from './ModalBody';\nimport ModalCenter from './ModalCenter';\nimport ModalClose from './ModalClose';\nimport ModalContainer from './ModalContainer';\nimport ModalDialog from './ModalDialog';\nimport ModalFooter from './ModalFooter';\nimport ModalHeader from './ModalHeader';\n\ninterface ModalProps {\n readonly title: string;\n readonly id: string;\n readonly logo?: string;\n readonly logoX2?: string;\n readonly onClose?: () => void;\n readonly marketCode: MarketCode;\n}\n\nclass Modal extends HtmlNode {\n private readonly props: ModalProps;\n content: HTMLElement;\n\n constructor(element: HTMLElement, props: ModalProps) {\n super(element, {\n htmlTag: 'div',\n className: 'waykeecom-modal',\n attributes: [\n {\n key: 'role',\n value: 'dialog',\n },\n { key: 'aria-modal', value: 'true' },\n { key: 'aria-labelledby', value: 'wayke-ecom-title' },\n ],\n id: props.id,\n });\n this.props = props;\n this.content = this.render();\n trapFocus(this.node); // Trap focus within the modal\n }\n\n render() {\n const { title, id, onClose } = this.props;\n const container = new ModalContainer(this.node, { id: `${id}-container` });\n const center = new ModalCenter(container.node, { id: `${id}-center` });\n const dialog = new ModalDialog(center.node, { id: `${id}-dialog` });\n new ModalClose(dialog.node, { id: `${id}-close`, onClose });\n new ModalHeader(dialog.node, {\n title,\n logo: this.props.logo,\n logoX2: this.props.logoX2,\n onClose,\n id: `${id}-header`,\n marketCode: this.props.marketCode,\n });\n const body = new ModalBody(dialog.node, {\n id: `${id}-body`,\n });\n new ModalFooter(dialog.node, {\n id: `${id}-footer`,\n marketCode: this.props.marketCode,\n });\n\n return body.node;\n }\n}\n\nexport default Modal;\n", "import { creditAssessment } from '@wayke-se/ecom';\n\nexport const creditAssessmentCancelSigning = (caseId: string) => {\n const request = creditAssessment.cancelSigning(caseId);\n return request;\n};\n", "import { ICreditAssessmentStatusResponse } from '@wayke-se/ecom';\nimport { OrderOptionsResponse } from '@wayke-se/ecom/dist-types/orders/order-options-response';\nimport { PaymentLookupResponse } from '@wayke-se/ecom/dist-types/payments/payment-lookup-response';\nimport { VehicleLookupResponse } from '@wayke-se/ecom/dist-types/vehicles/vehicle-lookup-response';\nimport { ICreditAssessmentStatus } from '../@types/CreditAssessmentStatus';\nimport { OrderOptions } from '../@types/OrderOptions';\nimport { PaymentLookup } from '../@types/PaymentLookup';\nimport { VehicleLookup } from '../@types/VehicleLookup';\n\nexport const convertPaymentLookupResponse = (plr: PaymentLookupResponse): PaymentLookup => {\n const response: PaymentLookup = {\n costs: plr.getCosts(),\n fees: plr.getFees(),\n interests: plr.getInterests(),\n durationSpec: plr.getDurationSpec(),\n downPaymentSpec: plr.getDownPaymentSpec(),\n residualValueSpec: plr.getResidualValueSpec(),\n totalResidualValue: plr.getTotalResidualValue(),\n publicURL: plr.getPublicURL(),\n shouldUseCreditScoring: plr.shouldUseCreditScoring(),\n financialProductCode: plr.getFinancialProductCode(),\n price: plr.getPrice(),\n creditAmount: plr.getCreditAmount(),\n hasPrivacyPolicy: plr.hasPrivacyPolicy(),\n privacyPolicyUrl: plr.getPrivacyPolicyUrl(),\n moneyLaunderingInformationURL: plr.getMoneyLaunderingInformationURL(),\n financialOptionId: plr.getFinancialOptionId(),\n };\n return response;\n};\n\nexport const convertCreditAssessmentStatusResponse = (cCAr: ICreditAssessmentStatusResponse) => {\n const response: ICreditAssessmentStatus = {\n status: cCAr.getStatus(),\n hasPendingSigning: cCAr.hasPendingSigning(),\n hintCode: cCAr.getHintCode(),\n signingMessage: cCAr.getSigningMessage(),\n shouldRenewSigning: cCAr.shouldRenewSigning(),\n isSigned: cCAr.isSigned(),\n address: undefined, // cCAr.getAddress(),\n pendingScoring: cCAr.hasPendingScoring(),\n isScored: cCAr.isScored(),\n hasScoringError: cCAr.hasScoringError(),\n scoringId: cCAr.getScoringId(),\n recommendation: cCAr.getRecommendation(),\n decision: cCAr.getDecision(),\n isAccepted: cCAr.isAccepted(),\n };\n return response;\n};\n\nexport const convertOrderOptionsResponse = (cOOR: OrderOptionsResponse) => {\n const response: OrderOptions = {\n orderVehicle: cOOR.getOrderVehicle(),\n accessories: cOOR.getAccessories(),\n requiresDealerSelection: cOOR.requiresDealerSelection(),\n dealerSites: cOOR.getDealerSites(),\n paymentOptions: cOOR.getPaymentOptions().map((option) => ({\n ...option,\n loanDetails: option.loanDetails\n ? convertPaymentLookupResponse(option.loanDetails)\n : undefined,\n })),\n deliveryOptions: cOOR.getDeliveryOptions(),\n insuranceOption: cOOR.getInsuranceOption(),\n orderConditions: cOOR.getOrderConditions(),\n orderReturnConditions: cOOR.getOrderReturnConditions(),\n conditionsPdfUri: cOOR.getConditionsPdfUri(),\n contactInformation: cOOR.getContactInformation(),\n allowsTradeIn: cOOR.allowsTradeIn(),\n isUnavailable: cOOR.isUnavailable(),\n isReserved: cOOR.isReserved(),\n isPaymentRequired: cOOR.isPaymentRequired(),\n };\n return response;\n};\n\nexport const convertVehicleLookupResponse = (cVLR: VehicleLookupResponse): VehicleLookup => {\n const response: VehicleLookup = {\n vehicle: cVLR.getVehicle(),\n };\n\n return response;\n};\n", "import {\n DrivingDistance,\n IAddress,\n IAvailableInsuranceOption,\n IInsuranceAddon,\n IInsuranceOption,\n IVehicle,\n PaymentType,\n} from '@wayke-se/ecom';\nimport { IAccessory } from '@wayke-se/ecom/dist-types/orders/types';\nimport { PaymentLookupResponse } from '@wayke-se/ecom/dist-types/payments/payment-lookup-response';\nimport { Dispatch } from 'redux';\nimport { BaseAction } from '../@types/BaseAction';\nimport { ICreditAssessmentStatus } from '../@types/CreditAssessmentStatus';\nimport { PartialCustomer } from '../@types/Customer';\nimport { ViewTypes } from '../@types/Navigation';\nimport { OrderOptions } from '../@types/OrderOptions';\nimport { PaymentLookup } from '../@types/PaymentLookup';\nimport { StageTypes } from '../@types/Stages';\nimport { TradeInCarData } from '../@types/TradeIn';\nimport { Vehicle } from '../@types/Vehicle';\nimport { convertPaymentLookupResponse } from '../Utils/convert';\nimport { ReducerState } from './reducer';\n\nexport const RESET = 'RESET';\nexport type RESET_TYPE = BaseAction<typeof RESET> & {\n id: string;\n};\nexport const reset = (id: string) => (dispatch: Dispatch) => dispatch({ type: RESET, id });\n\nexport const SET_ORDER = 'SET_ORDER';\nexport type SET_ORDER_TYPE = BaseAction<typeof SET_ORDER> & {\n order: OrderOptions;\n vehicle?: Vehicle;\n};\nexport const setOrder = (order: OrderOptions, vehicle?: Vehicle) => (dispatch: Dispatch) =>\n dispatch({ type: SET_ORDER, order, vehicle });\n\nexport const SET_ID = 'SET_ID';\nexport type SET_ID_TYPE = BaseAction<typeof SET_ID> & {\n id: string;\n};\nexport const setId = (id: string) => (dispatch: Dispatch) => dispatch({ type: SET_ID, id });\n\nexport const SET_CONTACT_EMAIL_AND_PHONE = 'SET_CONTACT_EMAIL_AND_PHONE';\nexport type SET_CONTACT_EMAIL_AND_PHONE_TYPE = BaseAction<typeof SET_CONTACT_EMAIL_AND_PHONE> & {\n value: PartialCustomer;\n};\nexport const setContactAndPhone = (value: PartialCustomer) => (dispatch: Dispatch) =>\n dispatch({ type: SET_CONTACT_EMAIL_AND_PHONE, value });\n\nexport const SET_SOCIAL_ID_AND_ADDRESS = 'SET_SOCIAL_ID_AND_ADDRESS';\nexport type SET_SOCIAL_ID_AND_ADDRESS_TYPE = BaseAction<typeof SET_SOCIAL_ID_AND_ADDRESS> & {\n socialId: string;\n address: IAddress;\n lastStage: boolean;\n};\nexport const setSocialIdAndAddress =\n (socialId: string, address: IAddress, lastStage: boolean) => (dispatch: Dispatch) =>\n dispatch({ type: SET_SOCIAL_ID_AND_ADDRESS, socialId, address, lastStage });\n\nexport const SET_ADDRESS = 'SET_ADDRESS';\nexport type SET_ADDRESS_TYPE = BaseAction<typeof SET_ADDRESS> & {\n address: IAddress;\n lastStage: boolean;\n};\nexport const setAddress = (address: IAddress, lastStage: boolean) => (dispatch: Dispatch) =>\n dispatch({ type: SET_ADDRESS, address, lastStage });\n\nexport const SET_HOME_DELIVERY = 'SET_HOME_DELIVERY';\nexport type SET_HOME_DELIVERY_TYPE = BaseAction<typeof SET_HOME_DELIVERY> & {\n homeDelivery: boolean;\n lastStage: boolean;\n};\nexport const setHomeDelivery =\n (homeDelivery: boolean, lastStage: boolean) => (dispatch: Dispatch) =>\n dispatch({ type: SET_HOME_DELIVERY, homeDelivery, lastStage });\n\nexport const SET_DEALER = 'SET_DEALER';\nexport type SET_DEALER_TYPE = BaseAction<typeof SET_DEALER> & {\n dealer: string;\n lastStage: boolean;\n};\nexport const setDealer = (dealer: string, lastStage: boolean) => (dispatch: Dispatch) =>\n dispatch({ type: SET_DEALER, dealer, lastStage });\n\nexport const INIT_TRADE_IN = 'INIT_TRADE_IN';\nexport type INIT_TRADE_IN_TYPE = BaseAction<typeof INIT_TRADE_IN> & {\n lastStage: boolean;\n};\nexport const initTradeIn = (lastStage: boolean) => (dispatch: Dispatch) =>\n dispatch({ type: INIT_TRADE_IN, lastStage });\n\nexport const SET_TRADE_IN = 'SET_TRADE_IN';\nexport type SET_TRADE_IN_TYPE = BaseAction<typeof SET_TRADE_IN> & {\n lastStage: boolean;\n tradeIn?: TradeInCarData;\n tradeInVehicle?: IVehicle;\n};\nexport const setTradeIn =\n (lastStage: boolean, tradeIn?: TradeInCarData | undefined, tradeInVehicle?: IVehicle) =>\n (dispatch: Dispatch) =>\n dispatch({ type: SET_TRADE_IN, lastStage, tradeIn, tradeInVehicle });\n\nexport const SET_FINANCIAL = 'SET_FINANCIAL';\nexport type SET_FINANCIAL_TYPE = BaseAction<typeof SET_FINANCIAL> & {\n paymentType: PaymentType;\n lastStage: boolean;\n};\nexport const setFinancial =\n (paymentType: PaymentType, lastStage: boolean) => (dispatch: Dispatch) =>\n dispatch({ type: SET_FINANCIAL, paymentType, lastStage });\n\nexport const SET_PAYMENT_LOOKUP_RESPONSE = 'SET_PAYMENT_LOOKUP_RESPONSE';\nexport type SET_PAYMENT_LOOKUP_RESPONSE_TYPE = BaseAction<typeof SET_PAYMENT_LOOKUP_RESPONSE> & {\n paymentLookupResponse: PaymentLookup;\n};\nexport const setPaymentLookupResponse =\n (paymentLookupResponse: PaymentLookupResponse) => (dispatch: Dispatch) =>\n dispatch({\n type: SET_PAYMENT_LOOKUP_RESPONSE,\n paymentLookupResponse: convertPaymentLookupResponse(paymentLookupResponse),\n });\n\nexport const RESET_PAYMENT_LOOKUP_RESPONSE = 'RESET_PAYMENT_LOOKUP_RESPONSE';\nexport type RESET_PAYMENT_LOOKUP_RESPONSE_TYPE = BaseAction<typeof RESET_PAYMENT_LOOKUP_RESPONSE>;\nexport const resetPaymentLookupResponse = () => (dispatch: Dispatch) =>\n dispatch({\n type: RESET_PAYMENT_LOOKUP_RESPONSE,\n });\n\nexport const SET_DRIVING_DISTANCE = 'SET_DRIVING_DISTANCE';\nexport type SET_DRIVING_DISTANCE_TYPE = BaseAction<typeof SET_DRIVING_DISTANCE> & {\n drivingDistance: DrivingDistance;\n};\n\nexport const setDrivingDistance = (drivingDistance: DrivingDistance) => (dispatch: Dispatch) =>\n dispatch({ type: SET_DRIVING_DISTANCE, drivingDistance });\n\nexport const COMPLETE_STAGE = 'COMPLETE_STAGE';\nexport type COMPLETE_STAGE_TYPE = BaseAction<typeof COMPLETE_STAGE> & {\n lastStage: boolean;\n};\nexport const completeStage = (lastStage: boolean) => (dispatch: Dispatch) =>\n dispatch({ type: COMPLETE_STAGE, lastStage });\n\nexport const SET_OR_REMOVE_INSURANCE = 'SET_OR_REMOVE_INSURANCE';\nexport type SET_OR_REMOVE_INSURANCE_TYPE = BaseAction<typeof SET_OR_REMOVE_INSURANCE> & {\n insurance?: IInsuranceOption;\n};\nexport const addOrRemoveInsurance = (insurance?: IInsuranceOption) => (dispatch: Dispatch) =>\n dispatch({ type: SET_OR_REMOVE_INSURANCE, insurance });\n\nexport const SET_OR_REMOVE_INSURANCE_ADDONS = 'SET_OR_REMOVE_INSURANCE_ADDONS';\nexport type SET_OR_REMOVE_INSURANCE_ADDONS_TYPE = BaseAction<\n typeof SET_OR_REMOVE_INSURANCE_ADDONS\n> & {\n insurance: IInsuranceOption;\n insuranceAddons: IInsuranceAddon[];\n};\nexport const addOrRemoveInsuranceAddon =\n (insurance: IInsuranceOption, insuranceAddons: IInsuranceAddon[]) => (dispatch: Dispatch) =>\n dispatch({ type: SET_OR_REMOVE_INSURANCE_ADDONS, insurance, insuranceAddons });\n\nexport const SET_OR_REMOVE_FREE_INSURANCE = 'SET_OR_REMOVE_FREE_INSURANCE';\nexport type SET_OR_REMOVE_FREE_INSURANCE_TYPE = BaseAction<typeof SET_OR_REMOVE_FREE_INSURANCE> & {\n freeInsurance?: IAvailableInsuranceOption;\n};\nexport const addOrRemoveFreeInsurance =\n (freeInsurance: IAvailableInsuranceOption) => (dispatch: Dispatch) =>\n dispatch({ type: SET_OR_REMOVE_FREE_INSURANCE, freeInsurance });\n\nexport const SET_OR_REMOVE_ACCESSORY = 'SET_OR_REMOVE_ACCESSORY';\nexport type SET_OR_REMOVE_ACCESSORY_TYPE = BaseAction<typeof SET_OR_REMOVE_ACCESSORY> & {\n accessory: IAccessory;\n};\nexport const addOrRemoveAccessory = (accessory: IAccessory) => (dispatch: Dispatch) =>\n dispatch({ type: SET_OR_REMOVE_ACCESSORY, accessory });\n\nexport const GO_TO = 'GO_TO';\nexport type GO_TO_TYPE = BaseAction<typeof GO_TO> & {\n view: ViewTypes;\n index?: number;\n subStage?: number;\n};\nexport const goTo = (view: ViewTypes, index?: number, subStage?: number) => (dispatch: Dispatch) =>\n dispatch({ type: GO_TO, view, index, subStage });\n\nexport const SET_STAGES = 'SET_STAGES';\nexport type SET_STAGES_TYPE = BaseAction<typeof SET_STAGES> & {\n stages: StageTypes[];\n};\nexport const setStages = (stages: StageTypes[]) => (dispatch: Dispatch) =>\n dispatch({ type: SET_STAGES, stages });\n\nexport const SET_CREATED_ORDER_ID = 'SET_CREATED_ORDER_ID';\nexport type SET_CREATED_ORDER_ID_TYPE = BaseAction<typeof SET_CREATED_ORDER_ID> & {\n id: string | null | undefined;\n payment?: { type: string; url: string };\n};\nexport const setCreatedOrderId =\n (id: string | null | undefined, payment?: { type: string; url: string }) =>\n (dispatch: Dispatch) =>\n dispatch({ type: SET_CREATED_ORDER_ID, id, payment });\n\nexport const SET_CREDIT_ASSESSMENT_RESPONSE = 'SET_CREDIT_ASSESSMENT_RESPONSE';\nexport type SET_CREDIT_ASSESSMENT_RESPONSE_TYPE = BaseAction<\n typeof SET_CREDIT_ASSESSMENT_RESPONSE\n> & {\n caseId?: string;\n creditAssessmentResponse?: ICreditAssessmentStatus;\n};\nexport const setCreditAssessmentResponse =\n (caseId?: string, creditAssessmentResponse?: ICreditAssessmentStatus) => (dispatch: Dispatch) =>\n dispatch({ type: SET_CREDIT_ASSESSMENT_RESPONSE, caseId, creditAssessmentResponse });\n\nexport const SET_STATE = 'SET_STATE';\nexport type SET_STATE_TYPE = BaseAction<typeof SET_STATE> & {\n state: ReducerState;\n};\nexport const setState = (state: ReducerState) => (dispatch: Dispatch) =>\n dispatch({ type: SET_STATE, state });\n\nexport type Action =\n | RESET_TYPE\n | SET_ORDER_TYPE\n | SET_ID_TYPE\n | SET_CONTACT_EMAIL_AND_PHONE_TYPE\n | SET_SOCIAL_ID_AND_ADDRESS_TYPE\n | SET_ADDRESS_TYPE\n | SET_HOME_DELIVERY_TYPE\n | SET_DEALER_TYPE\n | INIT_TRADE_IN_TYPE\n | SET_TRADE_IN_TYPE\n | SET_FINANCIAL_TYPE\n | SET_PAYMENT_LOOKUP_RESPONSE_TYPE\n | RESET_PAYMENT_LOOKUP_RESPONSE_TYPE\n | SET_DRIVING_DISTANCE_TYPE\n | SET_OR_REMOVE_INSURANCE_ADDONS_TYPE\n | SET_OR_REMOVE_INSURANCE_TYPE\n | SET_OR_REMOVE_FREE_INSURANCE_TYPE\n | SET_OR_REMOVE_ACCESSORY_TYPE\n | GO_TO_TYPE\n | SET_STAGES_TYPE\n | COMPLETE_STAGE_TYPE\n | SET_CREATED_ORDER_ID_TYPE\n | SET_CREDIT_ASSESSMENT_RESPONSE_TYPE\n | SET_STATE_TYPE;\n", "import { createStore as createReduxStore, Store } from 'redux';\nimport { Action } from './action';\n\nimport reducers, { ReducerState } from './reducer';\n\nexport type WaykeStore = Store<ReducerState, Action>;\nexport const createStore = () => createReduxStore(reducers);\n", "import {\n DrivingDistance,\n IAddress,\n IAvailableInsuranceOption,\n IInsuranceOption,\n IVehicle,\n PaymentType,\n} from '@wayke-se/ecom';\nimport { IAccessory, IOrderVehicle } from '@wayke-se/ecom/dist-types/orders/types';\nimport { ICreditAssessmentStatus } from '../@types/CreditAssessmentStatus';\nimport { Customer } from '../@types/Customer';\nimport { Insurance } from '../@types/Insurance';\nimport { Navigation } from '../@types/Navigation';\nimport { OrderOptions, PaymentOption } from '../@types/OrderOptions';\nimport { PaymentLookup } from '../@types/PaymentLookup';\nimport { StageTypes } from '../@types/Stages';\nimport { TradeInCarDataPartial } from '../@types/TradeIn';\nimport { isSame } from '../Utils/compare';\nimport {\n Action,\n COMPLETE_STAGE,\n GO_TO,\n INIT_TRADE_IN,\n RESET,\n RESET_PAYMENT_LOOKUP_RESPONSE,\n SET_ADDRESS,\n SET_CONTACT_EMAIL_AND_PHONE,\n SET_CREATED_ORDER_ID,\n SET_CREDIT_ASSESSMENT_RESPONSE,\n SET_DEALER,\n SET_DRIVING_DISTANCE,\n SET_FINANCIAL,\n SET_HOME_DELIVERY,\n SET_ID,\n SET_OR_REMOVE_ACCESSORY,\n SET_OR_REMOVE_FREE_INSURANCE,\n SET_OR_REMOVE_INSURANCE,\n SET_OR_REMOVE_INSURANCE_ADDONS,\n SET_ORDER,\n SET_PAYMENT_LOOKUP_RESPONSE,\n SET_SOCIAL_ID_AND_ADDRESS,\n SET_STAGES,\n SET_STATE,\n SET_TRADE_IN,\n} from './action';\n\nlet mock = {};\ntry {\n //mock = require('../../statemock.json');\n} catch (_e) {\n mock = {};\n}\n\nexport interface ReducerState {\n id: string;\n topNavigation: Navigation;\n navigation: Navigation;\n vehicle?: IOrderVehicle;\n order?: OrderOptions;\n customer: Customer;\n address?: IAddress;\n homeDelivery: boolean;\n wantTradeIn?: boolean;\n tradeIn?: TradeInCarDataPartial;\n tradeInVehicle?: IVehicle;\n paymentType?: PaymentType;\n paymentLookupResponse?: PaymentLookup;\n stages?: StageTypes[];\n accessories: IAccessory[];\n drivingDistance: DrivingDistance;\n insurance?: IInsuranceOption;\n insuranceAddOns?: Insurance;\n freeInsurance?: IAvailableInsuranceOption;\n createdOrderId?: string | null;\n creditAssessmentResponse?: ICreditAssessmentStatus;\n caseId?: string;\n dealer?: string;\n payment?: { type: string; url: string };\n stateLoadedFromSession?: boolean;\n}\n\nconst initNavigation: Navigation = {\n view: 'preview',\n stage: 1,\n subStage: 1,\n};\n\nconst initialState: ReducerState = {\n id: '',\n topNavigation: {\n ...initNavigation,\n },\n navigation: {\n ...initNavigation,\n },\n customer: {\n email: '',\n phone: '',\n givenName: '',\n surname: '',\n socialId: '',\n },\n homeDelivery: false,\n accessories: [],\n drivingDistance: DrivingDistance.Between0And1000,\n ...mock,\n};\n\nconst getNextNavigationState = (currentStage: number, lastStage: boolean): Navigation =>\n lastStage\n ? { view: 'summary', stage: 1, subStage: 1 }\n : { view: 'main', stage: currentStage + 1, subStage: 1 };\n\nconst getNextTopNavigationState = (currentTopNavigation: Navigation, nextNavigation: Navigation) =>\n nextNavigation.view === 'main'\n ? currentTopNavigation.stage < nextNavigation.stage\n ? nextNavigation\n : next.topNavigation\n : { ...currentTopNavigation, stage: currentTopNavigation.stage + 1 }; // all stages are completed\n\nconst resolveDefaultPaymentOption = (paymentOptions?: PaymentOption[]) => {\n if (!paymentOptions) return undefined;\n // If only cash payment is available, pre select\n const paymentType =\n paymentOptions?.length === 1 && paymentOptions?.[0].type === PaymentType.Cash\n ? PaymentType.Cash\n : undefined;\n return paymentType;\n};\n\nlet next: ReducerState;\nlet index: number;\nconst reducer = (state = initialState, action: Action): ReducerState => {\n let navigation: Navigation;\n let topNavigation: Navigation;\n next = { ...state };\n\n switch (action.type) {\n case RESET:\n return { ...initialState, id: action.id };\n case SET_STAGES:\n return { ...next, stages: action.stages };\n case SET_ID:\n return { ...next, id: action.id };\n case SET_ORDER:\n return {\n ...state,\n order: action.order,\n paymentType: resolveDefaultPaymentOption(action.order?.paymentOptions),\n vehicle: { ...action.order.orderVehicle, ...(action.vehicle || {}) },\n };\n case SET_CONTACT_EMAIL_AND_PHONE:\n const clean: ReducerState = {\n ...next,\n customer: { ...state.customer, email: action.value.email, phone: action.value.phone },\n navigation: { view: 'main', stage: state.navigation.stage, subStage: 2 },\n };\n\n delete clean.wantTradeIn;\n delete clean.tradeIn;\n delete clean.tradeInVehicle;\n clean.paymentType = resolveDefaultPaymentOption(state.order?.paymentOptions);\n delete clean.paymentLookupResponse;\n delete clean.insurance;\n delete clean.insuranceAddOns;\n delete clean.freeInsurance;\n delete clean.dealer;\n clean.accessories = [];\n\n return clean;\n case SET_SOCIAL_ID_AND_ADDRESS:\n navigation = getNextNavigationState(next.navigation.stage, action.lastStage);\n topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n next = {\n ...state,\n navigation,\n topNavigation,\n address: action.address,\n customer: { ...state.customer, socialId: action.socialId },\n };\n\n return next;\n case SET_ADDRESS:\n navigation = getNextNavigationState(next.navigation.stage, action.lastStage);\n topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n next = {\n ...state,\n navigation,\n topNavigation,\n address: action.address,\n customer: { ...state.customer },\n };\n\n return next;\n\n case SET_DEALER:\n navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n topNavigation = { ...navigation }; // reset current stage\n\n next = {\n ...state,\n navigation,\n topNavigation,\n dealer: action.dealer,\n };\n\n delete next.wantTradeIn;\n delete next.tradeIn;\n delete next.tradeInVehicle;\n next.paymentType = resolveDefaultPaymentOption(state.order?.paymentOptions);\n delete next.paymentLookupResponse;\n delete next.insurance;\n delete next.insuranceAddOns;\n delete next.freeInsurance;\n next.accessories = [];\n\n return next;\n\n case SET_HOME_DELIVERY:\n navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n next = {\n ...state,\n navigation,\n topNavigation,\n homeDelivery: action.homeDelivery,\n };\n\n return next;\n\n case INIT_TRADE_IN:\n navigation = { view: 'main', stage: state.navigation.stage, subStage: 1 };\n topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n next = {\n ...state,\n navigation,\n wantTradeIn: true,\n topNavigation,\n tradeIn: state.tradeIn || {\n registrationNumber: '',\n mileage: '',\n description: '',\n },\n };\n return next;\n\n case SET_TRADE_IN:\n navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n next = {\n ...state,\n navigation,\n topNavigation,\n wantTradeIn: !!action.tradeIn,\n tradeIn: action.tradeIn,\n tradeInVehicle: action.tradeInVehicle,\n };\n\n return next;\n\n case SET_FINANCIAL:\n navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n return {\n ...next,\n navigation,\n topNavigation,\n paymentType: action.paymentType,\n };\n\n case RESET_PAYMENT_LOOKUP_RESPONSE:\n return { ...next, paymentLookupResponse: undefined };\n\n case SET_PAYMENT_LOOKUP_RESPONSE:\n return { ...next, paymentLookupResponse: action.paymentLookupResponse };\n\n case SET_DRIVING_DISTANCE:\n return { ...next, drivingDistance: action.drivingDistance };\n\n case COMPLETE_STAGE:\n navigation = getNextNavigationState(state.navigation.stage, action.lastStage);\n topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n next = {\n ...state,\n navigation,\n topNavigation,\n };\n\n return next;\n\n case SET_OR_REMOVE_INSURANCE_ADDONS:\n next.insurance = action.insurance;\n next.insuranceAddOns = {\n insurance: action.insurance.name,\n addOns: action.insuranceAddons,\n };\n return next;\n\n case SET_OR_REMOVE_INSURANCE:\n if (!isSame(next.insurance, action.insurance)) {\n next.insurance = action.insurance;\n } else {\n next.insurance = undefined;\n }\n\n if (next.insuranceAddOns?.insurance) {\n next.insuranceAddOns = undefined;\n }\n\n return next;\n\n case SET_OR_REMOVE_FREE_INSURANCE:\n if (!isSame(next.freeInsurance, action.freeInsurance)) {\n next.freeInsurance = action.freeInsurance;\n } else {\n next.freeInsurance = undefined;\n }\n\n return next;\n\n case SET_OR_REMOVE_ACCESSORY:\n index = next.accessories.findIndex((accessory) => accessory.id === action.accessory.id);\n next.accessories = [...next.accessories];\n\n if (index > -1) {\n next.accessories.splice(index, 1);\n } else {\n next.accessories.push(action.accessory);\n }\n\n return { ...next, accessories: [...next.accessories] };\n\n case GO_TO:\n return {\n ...state,\n navigation: { view: action.view, stage: action.index || 1, subStage: action.subStage || 1 },\n };\n\n case SET_CREATED_ORDER_ID:\n if (action.payment) {\n navigation = { view: 'main', stage: state.navigation.stage, subStage: 2 };\n } else {\n navigation = getNextNavigationState(state.navigation.stage, true);\n }\n topNavigation = getNextTopNavigationState(next.topNavigation, navigation);\n\n next = {\n ...state,\n navigation,\n topNavigation,\n createdOrderId: action.id,\n payment: action.payment,\n };\n\n return next;\n\n case SET_CREDIT_ASSESSMENT_RESPONSE:\n return {\n ...next,\n caseId: action.caseId,\n creditAssessmentResponse: action.creditAssessmentResponse,\n };\n\n case SET_STATE:\n return { ...action.state };\n default:\n return state;\n }\n};\n\nexport type RootState = ReturnType<typeof reducer>;\n\nexport default reducer;\n", "export const isSame = (a: any, b: any) =>\n a !== undefined && b !== undefined\n ? JSON.stringify(a).localeCompare(JSON.stringify(b)) === 0\n : a === b;\n", "import { get as getValue } from 'object-path';\nimport { ReducerState } from './reducer';\n\nimport { WaykeStore } from './store';\n\nconst defaultCompare = (a: any, b: any) => {\n return a === b;\n};\n\nconst reduxWatch = <T>(\n getState: () => ReducerState,\n objectPath: FieldPath,\n compare?: (a: any, b: any) => boolean\n) => {\n const selectedCompare = compare || defaultCompare;\n let currentValue = getValue(getState(), objectPath);\n\n return (fn: (newValue: T, oldValue: T, pathToField: FieldPath) => void) => {\n return () => {\n const newValue = getValue(getState(), objectPath);\n if (!selectedCompare(currentValue, newValue)) {\n const oldValue = currentValue;\n currentValue = newValue;\n fn(newValue, oldValue, objectPath);\n }\n };\n };\n};\n\nconst subscriptions: (() => void)[] = [];\n\nconst registerSubsription = (s: () => void) => {\n subscriptions.push(s);\n return s;\n};\n\nexport const unregisterAllSubscriptions = () => subscriptions.forEach((s) => s());\n\ntype FieldPath = string | number | Array<string | number>;\n\nconst watch = <T>(\n store: WaykeStore,\n path: FieldPath,\n callback: (newValue: T, oldValue: T, pathToField: FieldPath) => void,\n doNotRegister?: boolean\n) => {\n const w = reduxWatch<T>(store.getState, path);\n if (doNotRegister) {\n store.subscribe(w(callback));\n } else {\n return registerSubsription(store.subscribe(w(callback)));\n }\n};\n\nexport default watch;\n", "export enum EcomEvent {\n START = 'START',\n CLOSE = 'CLOSE',\n CONFIRM_CLOSE_ACTIVE = 'CONFIRM_CLOSE_ACTIVE',\n CONFIRM_CLOSE_CONFIRMED = 'CONFIRM_CLOSE_CONFIRMED',\n CONFIRM_CLOSE_ABORTED = 'CONFIRM_CLOSE_ABORTED',\n\n PREVIEW_PROCEED = 'PREVIEW_PROCEED',\n\n CENTRAL_STORAGE_ACTIVE = 'CENTRAL_STORAGE_ACTIVE',\n CENTRAL_STORAGE_EDIT = 'CENTRAL_STORAGE_EDIT',\n CENTRAL_STORAGE_SELECTED = 'CENTRAL_STORAGE_SELECTED',\n CENTRAL_STORAGE_SET = 'CENTRAL_STORAGE_SET',\n\n CUSTOMER_ACTIVE = 'CUSTOMER_ACTIVE',\n CUSTOMER_EDIT = 'CUSTOMER_EDIT',\n CUSTOMER_EMAIL_AND_PHONE_SET = 'CUSTOMER_EMAIL_AND_PHONE_SET',\n CUSTOMER_ADDRESS_BY_SSN_REQUESTED = 'CUSTOMER_ADDRESS_BY_SSN_REQUESTED',\n CUSTOMER_ADDRESS_BY_SSN_SUCCEEDED = 'CUSTOMER_ADDRESS_BY_SSN_SUCCEEDED',\n CUSTOMER_ADDRESS_BY_SSN_FAILED = 'CUSTOMER_ADDRESS_BY_SSN_FAILED',\n CUSTOMER_ADDRESS_SET = 'CUSTOMER_ADDRESS_SET',\n CUSTOMER_ADDRESS_EDIT = 'CUSTOMER_ADDRESS_EDIT',\n\n FINANCIAL_INFORMATION_TOGGLE = 'FINANCIAL_INFORMATION_TOGGLE',\n FINANCIAL_ACTIVE = 'FINANCIAL_ACTIVE',\n FINANCIAL_EDIT = 'FINANCIAL_EDIT',\n FINANCIAL_CASH_SELECTED = 'FINANCIAL_CASH_SELECTED',\n FINANCIAL_LOAN_SELECTED = 'FINANCIAL_LOAN_SELECTED',\n FINANCIAL_LEASE_SELECTED = 'FINANCIAL_LEASE_SELECTED',\n FINANCIAL_CASH_SET = 'FINANCIAL_CASH_SET',\n FINANCIAL_LEASE_SET = 'FINANCIAL_LEASE_SET',\n FINANCIAL_LOAN_SET = 'FINANCIAL_LOAN_SET',\n FINANCIAL_LOAN_DOWNPAYMENT_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DOWNPAYMENT_INFORMATION_TOGGLE',\n FINANCIAL_LOAN_KYC_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_KYC_INFORMATION_TOGGLE',\n FINANCIAL_LOAN_HOUSEHOLD_COST_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_HOUSEHOLD_COST_INFORMATION_TOGGLE',\n FINANCIAL_LOAN_HOUSEHOLD_DEBT_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_HOUSEHOLD_DEBT_INFORMATION_TOGGLE',\n FINANCIAL_LOAN_DEBT_SPECIFICATION_CARD_CREDIT_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_CARD_CREDIT_INFORMATION_TOGGLE',\n FINANCIAL_LOAN_DEBT_SPECIFICATION_CAR_LOAN_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_CAR_LOAN_INFORMATION_TOGGLE',\n FINANCIAL_LOAN_DEBT_SPECIFICATION_COLLATERAL_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_COLLATERAL_INFORMATION_TOGGLE',\n FINANCIAL_LOAN_DEBT_SPECIFICATION_LEASING_FEES_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_LEASING_FEES_INFORMATION_TOGGLE',\n FINANCIAL_LOAN_DEBT_SPECIFICATION_PRIVATE_LOAN_INFORMATION_TOGGLE = 'FINANCIAL_LOAN_DEBT_SPECIFICATION_PRIVATE_LOAN_INFORMATION_TOGGLE',\n FINANCIAL_CREDIT_SCORING_ABORTED = 'FINANCIAL_CREDIT_SCORING_ABORTED',\n FINANCIAL_CREDIT_SCORING_CREATE_CASE_REQUESTED = 'FINANCIAL_CREDIT_SCORING_CREATE_CASE_REQUESTED',\n FINANCIAL_CREDIT_SCORING_CREATE_CASE_SUCCEEDED = 'FINANCIAL_CREDIT_SCORING_CREATE_CASE_SUCCEEDED',\n FINANCIAL_CREDIT_SCORING_CREATE_CASE_FAILED = 'FINANCIAL_CREDIT_SCORING_CREATE_CASE_FAILED',\n FINANCIAL_CREDIT_SCORING_BANKID_INIT_REQUESTED = 'FINANCIAL_CREDIT_SCORING_BANKID_INIT_REQUESTED',\n FINANCIAL_CREDIT_SCORING_BANKID_INIT_SUCCEEDED = 'FINANCIAL_CREDIT_SCORING_BANKID_INIT_SUCCEEDED',\n FINANCIAL_CREDIT_SCORING_BANKID_INIT_FAILED = 'FINANCIAL_CREDIT_SCORING_BANKID_INIT_FAILED',\n FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_REQUESTED = 'FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_REQUESTED',\n FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_SUCCEEDED = 'FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_SUCCEEDED',\n FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_REQUESTED = 'FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_REQUESTED',\n FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_SUCCEEDED = 'FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_SUCCEEDED',\n FINANCIAL_CREDIT_SCORING_SIGNING_SIGNED = 'FINANCIAL_CREDIT_SCORING_SIGNING_SIGNED',\n FINANCIAL_CREDIT_SCORING_SIGNING_SCORED = 'FINANCIAL_CREDIT_SCORING_SIGNING_SCORED',\n\n TRADE_IN_ACTIVE = 'TRADE_IN_ACTIVE',\n TRADE_IN_EDIT = 'TRADE_IN_EDIT',\n TRADE_IN_SELECTED = 'TRADE_IN_SELECTED',\n TRADE_IN_SKIPPED = 'TRADE_IN_SKIPPED',\n TRADE_IN_CONDITION_VERY_GOOD_SELECTED = 'TRADE_IN_CONDITION_VERY_GOOD_SELECTED',\n TRADE_IN_CONDITION_GOOD_SELECTED = 'TRADE_IN_CONDITION_GOOD_SELECTED',\n TRADE_IN_CONDITION_OK_SELECTED = 'TRADE_IN_CONDITION_OK_SELECTED',\n TRADE_IN_VALUATION_REQUESTED = 'TRADE_IN_VALUATION_REQUESTED',\n TRADE_IN_VALUATION_SUCCEEDED = 'TRADE_IN_VALUATION_SUCCEEDED',\n TRADE_IN_VALUATION_FAILED = 'TRADE_IN_VALUATION_FAILED',\n TRADE_IN_SET = 'TRADE_IN_SET',\n\n INSURANCE_ACTIVE = 'INSURANCE_ACTIVE',\n INSURANCE_EDIT = 'INSURANCE_EDIT',\n INSURANCE_MILEAGE_BETWEEN_0_AND_1000_SELECTED = 'INSURANCE_MILEAGE_BETWEEN_0_AND_1000_SELECTED',\n INSURANCE_MILEAGE_BETWEEN_1000_AND_1500_SELECTED = 'INSURANCE_MILEAGE_BETWEEN_1000_AND_1500_SELECTED',\n INSURANCE_MILEAGE_BETWEEN_1500_AND_2000_SELECTED = 'INSURANCE_MILEAGE_BETWEEN_1500_AND_2000_SELECTED',\n INSURANCE_MILEAGE_BETWEEN_2000_AND_2500_SELECTED = 'INSURANCE_MILEAGE_BETWEEN_2000_AND_2500_SELECTED',\n INSURANCE_MILEAGE_OVER_2500_SELECTED = 'INSURANCE_MILEAGE_OVER_2500_SELECTED',\n INSURANCE_EDIT_MILEAGE = 'INSURANCE_EDIT_MILEAGE',\n INSURANCE_SKIPPED = 'INSURANCE_SKIPPED',\n INSURANCE_SHOW = 'INSURANCE_SHOW',\n INSURANCE_SET = 'INSURANCE_SET',\n INSURANCE_SELECTED = 'INSURANCE_SELECTED',\n INSURANCE_UNSELECTED = 'INSURANCE_UNSELECTED',\n INSURANCE_ADDON_SELECTED = 'INSURANCE_ADDON_SELECTED',\n INSURANCE_ADDON_UNSELECTED = 'INSURANCE_ADDON_UNSELECTED',\n INSURANCE_GET_INSURANCES_REQUESTED = 'INSURANCE_GET_INSURANCES_REQUESTED',\n INSURANCE_GET_INSURANCES_SUCCEEDED = 'INSURANCE_GET_INSURANCES_SUCCEEDED',\n INSURANCE_GET_INSURANCES_FAILED = 'INSURANCE_GET_INSURANCES_FAILED',\n INSURANCE_INFORMATION_TOGGLE = 'INSURANCE_INFORMATION_TOGGLE',\n INSURANCE_ARROW = 'INSURANCE_ARROW',\n\n DELIVERY_ACTIVE = 'DELIVERY_ACTIVE',\n DELIVERY_EDIT = 'DELIVERY_EDIT',\n DELIVERY_DEALER_SELECTED = 'DELIVERY_DEALER_SELECTED',\n DELIVERY_HOME_SELECTED = 'DELIVERY_HOME_SELECTED',\n DELIVERY_DEALER_SET = 'DELIVERY_DEALER_SET',\n DELIVERY_HOME_SET = 'DELIVERY_HOME_SET',\n\n ACCESSORY_ACTIVE = 'ACCESSORY_ACTIVE',\n ACCESSORY_EDIT = 'ACCESSORY_EDIT',\n ACCESSORY_EXPOSURE = 'ACCESSORY_EXPOSURE',\n ACCESSORY_SKIPPED = 'ACCESSORY_SKIPPED',\n ACCESSORY_SELECTED = 'ACCESSORY_SELECTED',\n ACCESSORY_UNSELECTED = 'ACCESSORY_UNSELECTED',\n ACCESSORY_INFORMATION_OPEN = 'ACCESSORY_INFORMATION_OPEN',\n ACCESSORY_INFORMATION_CLOSE = 'ACCESSORY_INFORMATION_CLOSE',\n ACCESSORY_INFORMATION_GALLERY_IMAGE_PAGING = 'ACCESSORY_INFORMATION_GALLERY_IMAGE_PAGING',\n ACCESSORY_ARROWS = 'ACCESSORY_ARROWS',\n\n CONFIRMATION_BANKID_ABORTED = 'CONFIRMATION_BANKID_ABORTED',\n CONFIRMATION_BANKID_INIT_REQUESTED = 'CONFIRMATION_BANKID_INIT_REQUESTED',\n CONFIRMATION_BANKID_INIT_SUCCEEDED = 'CONFIRMATION_BANKID_INIT_SUCCEEDED',\n CONFIRMATION_BANKID_INIT_FAILED = 'CONFIRMATION_BANKID_INIT_FAILED',\n CONFIRMATION_BANKID_STATUS_QR_REQUESTED = 'CONFIRMATION_BANKID_STATUS_QR_REQUESTED',\n CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED = 'CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED',\n CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_NOT_OVER_18 = 'CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_NOT_OVER_18',\n CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_SSN_MISSMATCH = 'CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_SSN_MISSMATCH',\n CONFIRMATION_BANKID_STATUS_SAME_DEVICE_REQUESTED = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_REQUESTED',\n CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SHOULD_RENEW = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SHOULD_RENEW',\n CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED',\n CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_NOT_OVER_18 = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_NOT_OVER_18',\n CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_SSN_MISSMATCH = 'CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_SSN_MISSMATCH',\n CONFIRMATION_CREATE_ORDER_REQUESTED = 'CONFIRMATION_CREATE_ORDER_REQUESTED',\n CONFIRMATION_CREATE_ORDER_SUCCEEDED = 'CONFIRMATION_CREATE_ORDER_SUCCEEDED',\n CONFIRMATION_CREATE_ORDER_FAILED = 'CONFIRMATION_CREATE_ORDER_FAILED',\n CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_REQUEST = 'CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_REQUEST',\n CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_SUCCEEDED = 'CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_SUCCEEDED',\n CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_FAILED = 'CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_FAILED',\n\n SUMMARY_ACTIVE = 'SUMMARY_ACTIVE',\n}\n\nexport enum EcomStep {\n CENTRAL_STORAGE = 'CENTRAL_STORAGE',\n\n CUSTOMER_EMAIL_AND_PHONE = 'CUSTOMER_EMAIL_AND_PHONE',\n CUSTOMER_ADDRESS = 'CUSTOMER_ADDRESS',\n\n FINANCIAL = 'FINANCIAL',\n FINANCIAL_CREDIT_SCORING = 'FINANCIAL_CREDIT_SCORING',\n\n TRADE_IN = 'TRADE_IN',\n TRADE_IN_DETAILS = 'TRADE_IN_DETAILS',\n\n INSURANCE = 'INSURANCE',\n INSURANCE_IF = 'INSURANCE_IF',\n\n DELIVERY = 'DELIVERY',\n\n ACCESSORY = 'ACCESSORY',\n\n CONFIRMATION = 'CONFIRMATION',\n}\n\nexport enum EcomView {\n PREVIEW = 'PREVIEW',\n MAIN = 'MAIN',\n SUMMARY = 'SUMMARY',\n}\n\ntype Listner = (\n view: EcomView,\n ecomEvent: EcomEvent,\n currentStep?: EcomStep,\n data?: { [key: string]: any }\n) => void;\n\nconst listners: Listner[] = [];\n\nexport const registerEventListner = (fn: Listner) => {\n listners.push(fn);\n};\n\nexport const unregisterEventListner = (fn: Listner) => {\n const index = listners.findIndex((f) => f === fn);\n if (index > -1) {\n listners.splice(index, 1);\n }\n};\n\ninterface EventHistory {\n view: EcomView;\n ecomEvent: EcomEvent;\n currentStep?: EcomStep;\n data?: { [key: string]: any };\n}\n\nexport const eventHistory: EventHistory[] = [];\nexport const getLastHistory = () => eventHistory[eventHistory.length - 1];\nconst ecomEvent = (\n view: EcomView,\n ecomEvent: EcomEvent,\n currentStep?: EcomStep,\n data?: { [key: string]: any }\n) => {\n eventHistory.push({ view, ecomEvent, currentStep });\n listners.forEach((fn) => fn(view, ecomEvent, currentStep, data));\n};\n\nexport default ecomEvent;\n", "const intervals: { [key: string]: number | undefined } = {};\n\nexport const registerInterval = (key: string, interval: number) => {\n intervals[key] = interval;\n};\n\nexport const unregisterAllIntervals = () => {\n Object.keys(intervals).forEach((key) => {\n clearInterval(intervals[key]);\n delete intervals[key];\n });\n};\n", "const setVw = () => {\n const vw = document.documentElement.clientWidth / 100;\n document.documentElement.style.setProperty('--waykeecom-vw', `${vw}px`);\n};\n\nexport const useVwListner = () => {\n setVw();\n window.addEventListener('resize', setVw);\n\n return () => window.removeEventListener('resize', setVw);\n};\n", "type LoaderType = 'inline';\n\ninterface LoaderProps {\n type?: LoaderType;\n}\n\nconst getType = (type?: LoaderType) => {\n switch (type) {\n case 'inline':\n return 'waykeecom-loader--inline-block';\n default:\n return '';\n }\n};\n\nconst Loader = (props?: LoaderProps) => {\n const classList = ['waykeecom-loader'];\n const classType = getType(props?.type);\n if (classType) {\n classList.push(classType);\n }\n\n return `\n <div class=\"${classList.join(' ')}\" role=\"status\">\n <div class=\"waykeecom-loader__spinner\" aria-hidden=\"true\"></div>\n <div class=\"waykeecom-sr-only\">Laddar...</div>\n </div>\n`;\n};\n\nexport default Loader;\n", "import Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonProps {\n readonly title: string;\n readonly id?: string;\n disabled?: boolean;\n loading?: boolean;\n readonly onClick?: (e: Event) => void;\n}\n\nclass Button extends HtmlNode {\n private readonly props: ButtonProps;\n\n constructor(element: HTMLDivElement | null, props: ButtonProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n isDisabled() {\n return this.props.disabled;\n }\n\n disabled(disabled: boolean) {\n if (this.props.disabled !== disabled) {\n this.props.disabled = disabled;\n this.render();\n }\n }\n\n loading(loading: boolean) {\n if (this.props.loading !== loading) {\n this.props.loading = loading;\n this.props.disabled = loading;\n this.render();\n }\n }\n\n render() {\n const { title, id, disabled, loading, onClick } = this.props;\n this.node.innerHTML = `\n <button\n type=\"button\"\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n ${disabled && `disabled=\"\"`}\n class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action\"\n >\n <span class=\"waykeecom-button__content\">${title}</span>\n ${\n loading\n ? `\n <span class=\"waykeecom-button__content\">\n ${Loader({ type: 'inline' })}\n </span>`\n : ''\n }\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default Button;\n", "import Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonAltProps {\n readonly title: string;\n readonly id?: string;\n disabled?: boolean;\n loading?: boolean;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonAlt extends HtmlNode {\n private readonly props: ButtonAltProps;\n\n constructor(element: HTMLDivElement | null, props: ButtonAltProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n isDisabled() {\n return this.props.disabled;\n }\n\n disabled(disabled: boolean) {\n if (this.props.disabled !== disabled) {\n this.props.disabled = disabled;\n this.render();\n }\n }\n\n loading(loading: boolean) {\n if (this.props.loading !== loading) {\n this.props.loading = loading;\n this.props.disabled = loading;\n this.render();\n }\n }\n\n render() {\n const { title, id, disabled, loading, onClick } = this.props;\n this.node.innerHTML = `\n <button\n type=\"button\"\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n ${disabled && `disabled=\"\"`}\n class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action-alt\"\n >\n <span class=\"waykeecom-button__content\">${title}</span>\n ${\n loading\n ? `\n <span class=\"waykeecom-button__content\">\n ${Loader({ type: 'inline' })}\n </span>`\n : ''\n }\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonAlt;\n", "import i18next from '@i18n';\nimport Button from '../../Components/Button/Button';\nimport ButtonAlt from '../../Components/Button/ButtonAlt';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\n\nconst CONFIRM_CLOSE_NODE = 'confirm-close-node';\nconst ABORT_CLOSE_NODE = 'abort-close-node';\n\ninterface ConfirmCloseProps {\n readonly onConfirmClose: () => void;\n readonly onAbortClose: () => void;\n}\n\nclass ConfirmClose extends HtmlNode {\n private readonly props: ConfirmCloseProps;\n constructor(element: HTMLElement, props: ConfirmCloseProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n render() {\n const { onConfirmClose, onAbortClose } = this.props;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-hstack waykeecom-hstack--spacing-2 waykeecom-hstack--align-center\">\n <div class=\"waykeecom-hstack__item\" aria-hidden=\"true\">\n <div class=\"waykeecom-icon-backdrop waykeecom-icon-backdrop--error\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Exclamation mark\"\n >\n <path d=\"M7.1 9.6 6.7 2h2.7L9 9.6H7.1zM8 11c-.8 0-1.5.7-1.5 1.5S7.2 14 8 14s1.5-.7 1.5-1.5S8.8 11 8 11z\" />\n </svg>\n </div>\n </div>\n <div class=\"waykeecom-hstack__item\">\n <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${i18next.t('confirmClose.heading')}</h3>\n </div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('confirmClose.message')}</p>\n </div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${ABORT_CLOSE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${CONFIRM_CLOSE_NODE}\"></div>\n </div>\n `;\n\n new Button(this.node.querySelector<HTMLDivElement>(`#${ABORT_CLOSE_NODE}`), {\n title: i18next.t('confirmClose.abortButton'),\n onClick: () => onAbortClose(),\n });\n\n new ButtonAlt(this.node.querySelector<HTMLDivElement>(`#${CONFIRM_CLOSE_NODE}`), {\n title: i18next.t('confirmClose.confirmButton'),\n onClick: () => onConfirmClose(),\n });\n }\n}\n\nexport default ConfirmClose;\n", "export const toCdnMedia = (url: string, cdn?: string) => {\n if (!cdn) return url;\n const asUrl = new URL(url);\n return `${cdn}${asUrl.pathname}`;\n};\n", "import { Vehicle } from '../@types/Vehicle';\n\nexport const removeSpaces = (value: string | number) => value.toString().replace(/\\s/g, '');\n\ninterface PrettyNumberSettings {\n postfix?: string | number;\n prefix?: string | number;\n decimals?: number;\n}\n\nconst formatDecimals = (value: number, decimals: number) => {\n if (!decimals) return value;\n const upper = Math.pow(10, decimals);\n return (Math.round(value * upper) / upper).toFixed(decimals);\n};\n\nexport const prettyNumber = (value: number | null | undefined, settings?: PrettyNumberSettings) => {\n if (value === undefined || value === null) return '???';\n const formattedValue = formatDecimals(\n value,\n settings?.decimals !== undefined ? settings.decimals : 0\n );\n return `${settings?.prefix ? `${settings.prefix}` : ''}${removeSpaces(formattedValue).replace(\n /\\B(?=(\\d{3})+(?!\\d))/g,\n ' '\n )}${settings?.postfix ? ` ${settings.postfix}` : ''}`;\n};\n\nconst removeParts = (orginal: string, remove: string) => {\n const orginalSplitt = orginal.split(' ');\n const removeSplitted = remove.split(' ').map((x) => x.toLowerCase());\n return orginalSplitt.filter((x) => !removeSplitted.includes(x.toLowerCase())).join(' ');\n};\n\nexport const formatShortDescription = (vehicle?: Vehicle) => {\n if (!vehicle) return undefined;\n return removeParts(vehicle.shortDescription || '', vehicle.title || '');\n};\n", "import { OrderOptions } from '../@types/OrderOptions';\nimport { Vehicle } from '../@types/Vehicle';\nimport { toCdnMedia } from '../Utils/cdn';\nimport { formatShortDescription, prettyNumber } from '../Utils/format';\n\ninterface ItemTileSmallProps {\n vehicle?: Vehicle;\n order?: OrderOptions;\n cdnMedia?: string;\n}\n\nconst ItemTileSmall = ({ vehicle, order, cdnMedia }: ItemTileSmallProps) => {\n const imageUrl = vehicle?.imageUrls?.[0];\n const vehicleTitle = vehicle?.title;\n const price = prettyNumber(vehicle?.price || NaN);\n\n const sellerName = order?.contactInformation?.name;\n\n return `\n <div class=\"waykeecom-preview-card\">\n ${\n imageUrl\n ? `\n <div class=\"waykeecom-preview-card__media\">\n <img src=\"${toCdnMedia(imageUrl, cdnMedia)}?spec=200x&format=webp\" alt=\"\" class=\"waykeecom-preview-card__image\" />\n </div>\n `\n : ''\n }\n <dl class=\"waykeecom-preview-card__body\">\n <dt class=\"waykeecom-sr-only\">S\u00E4ljare</dt>\n <dd class=\"waykeecom-preview-card__seller\">${sellerName}</dd>\n <dt class=\"waykeecom-sr-only\">Modell</dt>\n <dd class=\"waykeecom-preview-card__heading\">\n <span class=\"waykeecom-preview-card__title\">${vehicleTitle}</span> ${formatShortDescription(\n vehicle\n )}\n </dd>\n <dt class=\"waykeecom-sr-only\">Pris</dt>\n <dd class=\"waykeecom-preview-card__price\">${price} kr</dd>\n </dl>\n </div>\n`;\n};\n\nexport default ItemTileSmall;\n", "import Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonArrowRightProps {\n readonly title: string;\n readonly id?: string;\n disabled?: boolean;\n loading?: boolean;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonArrowRight extends HtmlNode {\n private readonly props: ButtonArrowRightProps;\n\n constructor(element: HTMLElement | null, props: ButtonArrowRightProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n isDisabled() {\n return this.props.disabled;\n }\n\n disabled(disabled: boolean) {\n if (this.props.disabled !== disabled) {\n this.props.disabled = disabled;\n this.render();\n }\n }\n\n loading(loading: boolean) {\n if (this.props.loading !== loading) {\n this.props.loading = loading;\n this.props.disabled = loading;\n this.render();\n }\n }\n\n render() {\n const { title, id, disabled, loading, onClick } = this.props;\n this.node.innerHTML = `\n <button\n type=\"button\"\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n ${disabled && `disabled=\"\"`}\n class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action\"\n >\n <span class=\"waykeecom-button__content\">${title}</span>\n <span class=\"waykeecom-button__content\">\n ${\n loading\n ? Loader({ type: 'inline' })\n : `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Arrow right\"\n >\n <path d=\"m15.2 8.8-4.8 4.8-1.7-1.7 2.7-2.7H1.2C.5 9.2 0 8.7 0 8s.5-1.2 1.2-1.2h10.2L8.7 4.1l1.7-1.7 4.8 4.8.8.8-.8.8z\" />\n </svg>`\n }\n </span>\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonArrowRight;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonSkipProps {\n title: string;\n id?: string;\n onClick?: (e: Event) => void;\n}\n\nclass ButtonSkip extends HtmlNode {\n private readonly props: ButtonSkipProps;\n\n constructor(element: HTMLDivElement | null, props: ButtonSkipProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { title, id, onClick } = this.props;\n\n this.node.innerHTML = `\n <button\n type=\"button\"\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action-clear\"\n >\n <span class=\"waykeecom-button__content\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Skip\"\n >\n <path d=\"m14.5 7-4.7 4.7-1.4-1.4L10.6 8H6.5c-1.1 0-2 .9-2 2v2c0 .6-.4 1-1 1s-1-.4-1-1v-2c0-2.2 1.8-4 4-4h4.1L8.3 3.7l1.4-1.4L14.5 7z\" />\n </svg>\n </span>\n <span class=\"waykeecom-button__content\">${title}</span>\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonSkip;\n", "export interface KeyValueListItemImage {\n src: string;\n srcSet?: string;\n alt: string;\n}\nexport interface KeyValueListItemProps {\n key: string | number;\n value: string | number;\n image?: KeyValueListItemImage;\n}\n\nconst KeyValueListItem = ({ key, value, image }: KeyValueListItemProps) => `\n <li class=\"waykeecom-key-value-list__item\">\n ${\n image\n ? `<div class=\"waykeecom-key-value-list__key\">\n <img src=\"${image.src}\" ${image.srcSet ? `srcSet=\"${image.srcSet}\"` : ''} alt=\"${\n image.alt\n }\" class=\"waykeecom-key-value-list__key-image\" />\n <div class=\"waykeecom-key-value-list__key-label\">${key}</div>\n </div>`\n : `<div class=\"waykeecom-key-value-list__key\">${key}</div>`\n }\n <div class=\"waykeecom-key-value-list__value\">${value}</div>\n </li>\n`;\n\nexport default KeyValueListItem;\n", "import i18next from '@i18n';\nimport KeyValueListItem, { KeyValueListItemProps } from '../Templates/KeyValueListItem';\nimport HtmlNode from './Extension/HtmlNode';\n\ninterface StageCompletedProps {\n keyValueList: KeyValueListItemProps[];\n changeButtonTitle: string;\n onEdit?: () => void;\n}\n\nclass StageCompleted extends HtmlNode {\n private props;\n\n constructor(element: HTMLDivElement, props: StageCompletedProps) {\n super(element, { htmlTag: 'div' });\n this.props = props;\n this.render();\n }\n\n render() {\n const { keyValueList, changeButtonTitle, onEdit } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${keyValueList\n .map((keyValue) =>\n KeyValueListItem({\n key: keyValue.key,\n image: keyValue.image,\n value: keyValue.value,\n })\n )\n .join('')}\n </ul>\n </div>\n ${\n onEdit\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-align waykeecom-align--end\">\n <button type=\"button\" title=\"${changeButtonTitle}\" class=\"waykeecom-link\">${i18next.t('glossary.change')}</button>\n </div>\n </div>\n `\n : ''\n }\n `;\n\n if (onEdit) {\n this.node.querySelector('button')?.addEventListener('click', () => onEdit());\n }\n }\n}\n\nexport default StageCompleted;\n", "interface ListItemProps {\n title: string;\n active?: boolean;\n completed?: boolean;\n id: string;\n index: number;\n}\n\nconst ListItem = (element: HTMLElement, props: ListItemProps) => {\n const { title, active, completed, id } = props;\n const existingListItem = document.getElementById(id);\n\n const item = existingListItem ? existingListItem : document.createElement('li');\n //item.setAttribute('aria-label', title);\n\n if (!existingListItem) {\n item.setAttribute('id', id);\n }\n\n const className = ['waykeecom-stepper__item'];\n item.removeAttribute('aria-current');\n item.removeAttribute('aria-disabled');\n\n if (active) {\n className.push('waykeecom-stepper__item--is-active');\n item.setAttribute('aria-current', 'step');\n } else if (completed) {\n className.push('waykeecom-stepper__item--is-complete');\n } else {\n className.push('waykeecom-stepper__item--is-disabled');\n item.setAttribute('aria-disabled', 'true');\n }\n\n item.className = className.join(' ');\n item.innerHTML = `\n <header class=\"waykeecom-stepper__header\">\n <div class=\"waykeecom-stepper__icon\" aria-hidden=\"true\">\n <div class=\"waykeecom-icon-backdrop waykeecom-icon-backdrop--success\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Check\"\n >\n <path d=\"M12.3 3.3 6 9.6 3.7 7.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4l3 3c.4.4 1 .4 1.4 0l7-7c.4-.4.4-1 0-1.4-.4-.4-1-.4-1.4 0z\"/>\n </svg>\n </div>\n </div>\n <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">\n <span class=\"waykeecom-stepper__stage\">\n Steg ${props.index} \u2013\n </span>\n ${title}\n ${completed ? '<span class=\"waykeecom-sr-only\">(F\u00E4rdigst\u00E4llt)</span>' : ''}\n </h3>\n </header>\n <div class=\"waykeecom-stepper__body\"></div>\n `;\n\n if (!existingListItem) {\n element.appendChild(item);\n }\n\n const content = item.querySelector<HTMLDivElement>('.waykeecom-stepper__body');\n if (!content) throw 'Err no element';\n return content;\n};\n\nexport default ListItem;\n", "import i18next from '@i18n';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ArrowProps {\n direction: 'left' | 'right';\n hide?: boolean;\n onClick: () => void;\n}\n\nclass Arrow extends HtmlNode {\n private props: ArrowProps;\n\n constructor(element: HTMLElement | null, props: ArrowProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n hide(hide: boolean) {\n if (this.props.hide !== hide) {\n this.props.hide = hide;\n this.render();\n }\n }\n\n private render() {\n if (this.props.hide) {\n this.node.innerHTML = '';\n return;\n }\n\n const { title, dataIcon, path } =\n this.props.direction === 'left'\n ? {\n title: i18next.t('glossary.showPrevious'),\n dataIcon: 'Chevron left',\n path: '<path d=\"m5.4 7 5.2-5 1 1-5.2 5 5.2 5-1.1 1-5.2-5-1-1 1.1-1z\" />',\n }\n : {\n title: i18next.t('glossary.showNext'),\n dataIcon: 'Chevron right',\n path: '<path d=\"m10.5 9-5.2 5-1-1 5.2-5-5.2-5 1.1-1 5.2 5 1 1-1.1 1z\" />',\n };\n\n this.node.innerHTML = `\n <button type=\"button\" title=\"${title}\" class=\"waykeecom-icon-button\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"${dataIcon}\"\n >\n ${path}\n </svg>\n </button>\n `;\n\n this.node\n .querySelector<HTMLUListElement>(`button`)\n ?.addEventListener('click', () => this.props.onClick());\n }\n}\n\nexport default Arrow;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport Arrow from './Arrow';\n\nconst getRightVariables = (ref: HTMLUListElement | undefined | null) => {\n const itemWidth = ref?.children?.[0]?.clientWidth || 0;\n const scrollWidth = ref?.scrollWidth || 0;\n const scrollLeft = ref?.scrollLeft || 0;\n const overflowElementWidth = ref?.offsetWidth || 0;\n const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n return {\n itemWidth,\n scrollWidth,\n scrollLeft,\n overflowElementWidth,\n overflowElementScrollWidth,\n };\n};\ninterface OverflowGridListProps {\n id: string;\n onClick?: () => void;\n}\n\nclass OverflowGridList extends HtmlNode {\n private readonly props: OverflowGridListProps;\n overflowElement?: HTMLUListElement | null;\n private timeout?: NodeJS.Timeout;\n private contexts: {\n left?: Arrow;\n right?: Arrow;\n } = {};\n\n constructor(element: HTMLElement, props: OverflowGridListProps) {\n super(element, { htmlTag: 'div', className: 'waykeecom-overflow-grid' });\n this.props = props;\n this.render();\n }\n\n onPrev() {\n if (this.props.onClick) {\n this.props.onClick();\n }\n const listRef = this.overflowElement;\n if (listRef) {\n const itemWidth = listRef.children?.[0]?.clientWidth || 0;\n const scrollLeft = listRef.scrollLeft || 0;\n if (scrollLeft > 0) {\n this.contexts.right?.hide(false);\n const left = scrollLeft - itemWidth;\n listRef.scroll({\n left,\n behavior: 'smooth',\n });\n if (left <= 0) {\n this.contexts.left?.hide(true);\n }\n }\n }\n }\n\n onNext() {\n if (this.props.onClick) {\n this.props.onClick();\n }\n const listRef = this.overflowElement;\n if (listRef) {\n const { itemWidth, scrollLeft, overflowElementScrollWidth } = getRightVariables(listRef);\n if (overflowElementScrollWidth !== scrollLeft) {\n this.contexts.left?.hide(false);\n const left = scrollLeft + itemWidth;\n listRef.scroll({\n left,\n behavior: 'smooth',\n });\n if (left >= overflowElementScrollWidth) {\n this.contexts.right?.hide(true);\n }\n }\n }\n }\n\n scrollHandler() {\n clearTimeout(this.timeout as unknown as number);\n this.timeout = setTimeout(() => {\n const listRef = this.overflowElement;\n if (listRef) {\n const scrollWidth = listRef.scrollWidth || 0;\n if (scrollWidth <= listRef.offsetWidth) return;\n\n const scrollLeft = listRef.scrollLeft || 0;\n this.contexts.left?.hide(scrollLeft <= 0);\n\n const overflowElementWidth = listRef.offsetWidth || 0;\n const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n this.contexts.right?.hide(overflowElementScrollWidth === scrollLeft);\n }\n }, 50);\n }\n\n render() {\n const PREV_ID = `${this.props.id}-prev`;\n const NEXT_ID = `${this.props.id}-next`;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-overflow-grid__nav waykeecom-overflow-grid__nav--prev\" id=\"${PREV_ID}\"></div>\n <div class=\"waykeecom-overflow-grid__nav waykeecom-overflow-grid__nav--next\" id=\"${NEXT_ID}\"></div>\n <div class=\"waykeecom-overflow-grid__list-wrapper\">\n <ul class=\"waykeecom-overflow-grid__list\" id=\"${this.props.id}\"></ul>\n </div>\n `;\n\n this.overflowElement =\n this.node.querySelector<HTMLUListElement>(`#${this.props.id}`) || undefined;\n this.overflowElement?.addEventListener('scroll', () => this.scrollHandler());\n\n this.contexts.left = new Arrow(this.node.querySelector<HTMLUListElement>(`#${PREV_ID}`), {\n direction: 'left',\n hide: true,\n onClick: () => this.onPrev(),\n });\n\n this.contexts.right = new Arrow(this.node.querySelector<HTMLUListElement>(`#${NEXT_ID}`), {\n direction: 'right',\n hide: true,\n onClick: () => this.onNext(),\n });\n\n setTimeout(() => {\n const { itemWidth, scrollLeft, overflowElementScrollWidth } = getRightVariables(\n this.overflowElement\n );\n const left = scrollLeft + itemWidth;\n const rightHide =\n overflowElementScrollWidth === scrollLeft && left >= overflowElementScrollWidth;\n this.contexts.right?.hide(rightHide);\n }, 50);\n }\n}\n\nexport default OverflowGridList;\n", "import i18next from '@i18n';\nimport Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonAddRemoveProps {\n readonly id?: string;\n disabled?: boolean;\n loading?: boolean;\n readonly selected?: boolean;\n readonly fullSize?: boolean;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonAddRemove extends HtmlNode {\n private readonly props: ButtonAddRemoveProps;\n\n constructor(element: HTMLDivElement | null, props: ButtonAddRemoveProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n isDisabled() {\n return this.props.disabled;\n }\n\n disabled(disabled: boolean) {\n if (this.props.disabled !== disabled) {\n this.props.disabled = disabled;\n this.render();\n }\n }\n\n loading(loading: boolean) {\n if (this.props.loading !== loading) {\n this.props.loading = loading;\n this.props.disabled = loading;\n this.render();\n }\n }\n\n render() {\n const { id, disabled, loading, selected, fullSize, onClick } = this.props;\n\n const title = selected ? i18next.t('glossary.chosen') : i18next.t('glossary.add');\n\n const buttonClassName = [\n 'waykeecom-button',\n fullSize ? 'waykeecom-button--full-width' : 'waykeecom-button--size-small',\n ];\n if (selected) {\n buttonClassName.push('waykeecom-button--success');\n } else {\n buttonClassName.push('waykeecom-button--action-alt');\n }\n\n const selectedIcon = selected\n ? '<path d=\"M12.3 3.3 6 9.6 3.7 7.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4l3 3c.4.4 1 .4 1.4 0l7-7c.4-.4.4-1 0-1.4-.4-.4-1-.4-1.4 0z\"/>'\n : '<path d=\"M14 7v2H9v5H7V9H2V7h5V2h2v5h5z\" />';\n\n this.node.innerHTML = `\n <button\n type=\"button\"\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n ${disabled && `disabled=\"\"`} \n class=\"${buttonClassName.join(' ')}\"\n >\n <span class=\"waykeecom-button__content\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"${selected ? 'Check' : 'Plus'}\"\n >\n ${selectedIcon}\n </svg>\n </span>\n <span class=\"waykeecom-button__content\">${title}</span>\n ${\n loading\n ? `<span class=\"waykeecom-button__content\">${Loader({ type: 'inline' })}</div>`\n : ''\n }\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonAddRemove;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonAsLinkProps {\n readonly title: string;\n readonly id?: string;\n disabled?: boolean;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonAsLink extends HtmlNode {\n private readonly props: ButtonAsLinkProps;\n\n constructor(element: HTMLDivElement | null, props: ButtonAsLinkProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n disabled(disable: boolean) {\n this.props.disabled = !disable;\n this.render();\n }\n\n render() {\n const { title, id, disabled, onClick } = this.props;\n this.node.innerHTML = `\n <button\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n class=\"waykeecom-link\"\n ${disabled ? `disabled=\"\"` : ''}\n >\n ${title}\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonAsLink;\n", "import i18next from '@i18n';\nimport ButtonAddRemove from '../Button/ButtonAddRemove';\nimport ButtonAsLink from '../Button/ButtonAsLink';\nimport HtmlNode from '../Extension/HtmlNode';\n\nconst BUTTON_ADD_REMOVE = 'button-add-remove';\nconst BUTTON_ADD_REMOVE_NODE = `${BUTTON_ADD_REMOVE}-node`;\n\nconst READ_MORE = 'read-more';\nconst READ_MORE_NODE = `${READ_MORE}-node`;\n\ninterface GridItemProps {\n readonly id?: string;\n readonly title: string;\n readonly image?: string;\n readonly logo?: string;\n readonly price?: string;\n readonly priceDetails?: { key: string; value: string }[];\n readonly description?: string;\n readonly selected?: boolean;\n readonly onClick: () => void;\n readonly onInfo?: () => void;\n readonly inViewPort?: () => void;\n}\n\nclass GridItem extends HtmlNode {\n private readonly props: GridItemProps;\n private hasBeenInViewPort = false;\n\n constructor(element: HTMLElement, props: GridItemProps, id: string) {\n super(element, { htmlTag: 'li', className: 'waykeecom-overflow-grid__item', id });\n this.props = props;\n this.render();\n this.attachInViewportTrigger();\n }\n\n private attachInViewportTrigger() {\n if (this.props.inViewPort && !this.hasBeenInViewPort) {\n const observer = new IntersectionObserver(\n (changes) => {\n if (!this.hasBeenInViewPort) {\n for (const change of changes) {\n if (change.intersectionRatio === 1) {\n this.hasBeenInViewPort = true;\n if (this.props.inViewPort) {\n this.props.inViewPort();\n }\n }\n }\n }\n },\n { threshold: [1] }\n );\n observer.observe(this.node);\n }\n }\n\n render() {\n const { id, title, image, logo, price, priceDetails, description, selected, onClick, onInfo } =\n this.props;\n\n const onInfoId = id && onInfo ? `${READ_MORE_NODE}-${id}` : undefined;\n const addRemoveButtonNodeId = id ? `${BUTTON_ADD_REMOVE_NODE}-${id}` : undefined;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-tile\">\n ${image ? `<img src=\"${image}\" alt=\"${title}\" class=\"waykeecom-tile__hero\" />` : ''}\n <div class=\"waykeecom-tile__body\">\n <div class=\"waykeecom-tile__header\">\n <div class=\"waykeecom-tile__title\">${title}</div>\n <div class=\"waykeecom-tile__image\">\n <div class=\"waykeecom-logo\">\n <img src=\"${logo}\" alt=\"\" class=\"waykeecom-logo__image waykeecom-logo__image--right\" />\n </div>\n </div>\n </div>\n ${price ? `<div class=\"waykeecom-tile__price\">${price}</div>` : ''}\n ${\n priceDetails?.length\n ? `<div class=\"waykeecom-tile__price-disclaimer\">+ ${priceDetails\n .map((d) => `${d.key} (${d.value})`)\n .join(', ')}</div>`\n : ''\n }\n <div class=\"waykeecom-tile__description\">\n ${description || ''}\n </div>\n ${\n onInfoId\n ? `\n <div class=\"waykeecom-tile__read-more\" id=\"${onInfoId}\"></div>`\n : ''\n }\n </div>\n <div class=\"waykeecom-tile__footer\" id=\"${addRemoveButtonNodeId}\"></div>\n </div>\n `;\n\n if (onInfo) {\n new ButtonAsLink(this.node.querySelector(`#${onInfoId}`), {\n title: i18next.t('glossary.readMore'),\n onClick: () => onInfo(),\n });\n }\n\n new ButtonAddRemove(this.node.querySelector(`#${addRemoveButtonNodeId}`), {\n selected,\n onClick: () => onClick(),\n });\n }\n}\n\nexport default GridItem;\n", "export const createPortal = () => {\n destroyPortal();\n const el = document.getElementById('wayke-ecom-modal-body');\n if (el) {\n (el.firstElementChild as HTMLDivElement).setAttribute('hidden', '');\n }\n const element = document.createElement('div');\n element.className = 'waykeecom-portal';\n el?.appendChild(element);\n return element;\n};\n\nexport const destroyPortal = () => {\n const el = document.getElementById('wayke-ecom-modal-body');\n if (el) {\n (el.firstElementChild as HTMLDivElement).removeAttribute('hidden');\n }\n el?.childNodes.forEach((node, index) => {\n if (index > 0) {\n node.remove();\n }\n });\n};\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonAsLinkArrowLeftProps {\n readonly title: string;\n readonly id?: string;\n disabled?: boolean;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonAsLinkArrowLeft extends HtmlNode {\n private readonly props: ButtonAsLinkArrowLeftProps;\n\n constructor(element: HTMLDivElement | null, props: ButtonAsLinkArrowLeftProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n disabled(disable: boolean) {\n this.props.disabled = !disable;\n this.render();\n }\n\n render() {\n const { title, id, disabled, onClick } = this.props;\n this.node.innerHTML = `\n <button\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n class=\"waykeecom-link waykeecom-link--has-content\"\n ${disabled && `disabled=\"\"`}\n >\n <span class=\"waykeecom-link__content\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Arrow left\"\n >\n <path d=\"m.8 7.2 4.8-4.8 1.7 1.7-2.7 2.7h10.2c.7 0 1.2.5 1.2 1.2s-.5 1.2-1.2 1.2H4.6l2.7 2.7-1.7 1.7L.8 8.8 0 8l.8-.8z\"/>\n </svg>\n </span>\n <span class=\"waykeecom-link__content\">${title}</span>\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonAsLinkArrowLeft;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonClearProps {\n readonly title: string;\n readonly id?: string;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonClear extends HtmlNode {\n private readonly props: ButtonClearProps;\n\n constructor(element: HTMLDivElement | null, props: ButtonClearProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { title, id, onClick } = this.props;\n\n this.node.innerHTML = `\n <button type=\"button\" id=\"${id}\" title=\"${title}\" class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action-clear\">\n ${title}\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonClear;\n", "import i18next from '@i18n';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ArrowProps {\n direction: 'left' | 'right';\n hide?: boolean;\n onClick: () => void;\n}\n\nclass Arrow extends HtmlNode {\n private props: ArrowProps;\n\n constructor(element: HTMLElement | null, props: ArrowProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n hide(hide: boolean) {\n if (this.props.hide !== hide) {\n this.props.hide = hide;\n this.render();\n }\n }\n\n private render() {\n if (this.props.hide) {\n this.node.innerHTML = '';\n return;\n }\n\n const { title, dataIcon, path } =\n this.props.direction === 'left'\n ? {\n title: i18next.t('glossary.showPreviousImage'),\n dataIcon: 'Chevron left',\n path: '<path d=\"m5.4 7 5.2-5 1 1-5.2 5 5.2 5-1.1 1-5.2-5-1-1 1.1-1z\" />',\n }\n : {\n title: i18next.t('glossary.showNextImage'),\n dataIcon: 'Chevron right',\n path: '<path d=\"m10.5 9-5.2 5-1-1 5.2-5-5.2-5 1.1-1 5.2 5 1 1-1.1 1z\" />',\n };\n\n this.node.innerHTML = `\n <button type=\"button\" title=\"${title}\" class=\"waykeecom-icon-button\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"${dataIcon}\"\n >\n ${path}\n </svg>\n </button>\n `;\n\n this.node\n .querySelector<HTMLUListElement>(`button`)\n ?.addEventListener('click', () => this.props.onClick());\n }\n}\n\nexport default Arrow;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport Arrow from './Arrow';\n\ninterface Media {\n url: string;\n alt: string;\n}\n\ninterface GalleryProps {\n id: string;\n media: Media[];\n onGalleryImagePaging?: () => void;\n}\n\nconst getRightVariables = (ref: HTMLUListElement | undefined) => {\n const itemWidth = ref?.children?.[0]?.clientWidth || 0;\n const scrollWidth = ref?.scrollWidth || 0;\n const scrollLeft = ref?.scrollLeft || 0;\n const overflowElementWidth = ref?.offsetWidth || 0;\n const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n return {\n itemWidth,\n scrollWidth,\n scrollLeft,\n overflowElementWidth,\n overflowElementScrollWidth,\n };\n};\n\nclass Gallery extends HtmlNode {\n private readonly props: GalleryProps;\n private timeout?: NodeJS.Timeout;\n private contexts: {\n overflowElement?: HTMLUListElement;\n left?: Arrow;\n right?: Arrow;\n } = {};\n\n constructor(element: HTMLElement | null, props: GalleryProps) {\n super(element, { htmlTag: 'div', className: 'waykeecom-overflow-gallery' });\n this.props = props;\n this.render();\n }\n\n onPrev() {\n const listRef = this.contexts.overflowElement;\n if (listRef) {\n const itemWidth = listRef?.clientWidth || 0;\n const scrollLeft = listRef.scrollLeft || 0;\n if (scrollLeft > 0) {\n this.contexts.right?.hide(false);\n const left = scrollLeft - itemWidth;\n listRef.scroll({\n left,\n behavior: 'smooth',\n });\n if (left <= 0) {\n this.contexts.left?.hide(true);\n }\n if (this.props.onGalleryImagePaging) {\n this.props.onGalleryImagePaging();\n }\n }\n }\n }\n\n onNext() {\n const listRef = this.contexts.overflowElement;\n if (listRef) {\n const { itemWidth, scrollLeft, overflowElementScrollWidth } = getRightVariables(listRef);\n if (overflowElementScrollWidth !== scrollLeft) {\n this.contexts.left?.hide(false);\n const left = scrollLeft + itemWidth;\n listRef.scroll({\n left,\n behavior: 'smooth',\n });\n if (left >= overflowElementScrollWidth) {\n this.contexts.right?.hide(true);\n }\n if (this.props.onGalleryImagePaging) {\n this.props.onGalleryImagePaging();\n }\n }\n }\n }\n\n scrollHandler() {\n clearTimeout(this.timeout as unknown as number);\n this.timeout = setTimeout(() => {\n const listRef = this.contexts.overflowElement;\n if (listRef) {\n const scrollWidth = listRef.scrollWidth || 0;\n if (scrollWidth <= listRef.offsetWidth) return;\n\n const scrollLeft = listRef.scrollLeft || 0;\n this.contexts.left?.hide(scrollLeft <= 0);\n\n const overflowElementWidth = listRef.offsetWidth || 0;\n const overflowElementScrollWidth = scrollWidth - overflowElementWidth;\n this.contexts.right?.hide(overflowElementScrollWidth === scrollLeft);\n }\n }, 50);\n }\n\n render() {\n const PREV_ID = `${this.props.id}-prev`;\n const NEXT_ID = `${this.props.id}-next`;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-overflow-gallery__nav waykeecom-overflow-gallery__nav--prev\" id=\"${PREV_ID}\"></div>\n <div class=\"waykeecom-overflow-gallery__nav waykeecom-overflow-gallery__nav--next\" id=\"${NEXT_ID}\"></div>\n <ul class=\"waykeecom-overflow-gallery__list\" id=\"${this.props.id}\">\n ${this.props.media\n .map(\n (m) => `\n <li class=\"waykeecom-overflow-gallery__item\">\n <img src=\"${m.url}\" alt=\"${m.alt}\" class=\"waykeecom-overflow-gallery__image\" />\n </li>\n `\n )\n .join('')}\n </ul>\n `;\n\n this.contexts.overflowElement =\n this.node.querySelector<HTMLUListElement>(`#${this.props.id}`) || undefined;\n this.contexts.overflowElement?.addEventListener('scroll', () => this.scrollHandler());\n\n this.contexts.left = new Arrow(this.node.querySelector<HTMLUListElement>(`#${PREV_ID}`), {\n direction: 'left',\n hide: true,\n onClick: () => this.onPrev(),\n });\n\n this.contexts.right = new Arrow(this.node.querySelector<HTMLUListElement>(`#${NEXT_ID}`), {\n direction: 'right',\n hide: true,\n onClick: () => this.onNext(),\n });\n\n setTimeout(() => {\n const { itemWidth, scrollLeft, overflowElementScrollWidth } = getRightVariables(\n this.contexts.overflowElement\n );\n const left = scrollLeft + itemWidth;\n const rightHide =\n overflowElementScrollWidth === scrollLeft && left >= overflowElementScrollWidth;\n this.contexts.right?.hide(rightHide);\n }, 50);\n }\n}\n\nexport default Gallery;\n", "import { marked } from 'marked';\nimport sanitizeHtml from 'sanitize-html';\n\nexport const asHtml = (s?: string) =>\n sanitizeHtml(marked.parse(s || '', { async: false }), {\n allowedTags: [...sanitizeHtml.defaults.allowedTags, 'img'],\n allowedAttributes: {\n ...sanitizeHtml.defaults.allowedAttributes,\n a: [...(sanitizeHtml.defaults.allowedAttributes.a || []), 'rel'],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height', 'loading'],\n },\n selfClosing: [...sanitizeHtml.defaults.selfClosing, 'img'],\n transformTags: {\n a: sanitizeHtml.simpleTransform('a', { target: '_blank', rel: 'noopener noreferrer' }, true),\n },\n });\n", "import { WAYKE_ECOM_MODAL_ID } from '../App';\n\nexport const scrollTop = () => {\n const elementScrollDesktop = document.getElementById(WAYKE_ECOM_MODAL_ID);\n const elementScrollMobile = document.getElementById(`${WAYKE_ECOM_MODAL_ID}-dialog`);\n if (elementScrollDesktop) {\n elementScrollDesktop.scrollTop = 0;\n }\n if (elementScrollMobile) {\n elementScrollMobile.scrollTop = 0;\n }\n};\n", "import i18next from '@i18n';\nimport { IAccessory } from '@wayke-se/ecom/dist-types/orders/types';\nimport ButtonAddRemove from '../../../Components/Button/ButtonAddRemove';\nimport ButtonAsLinkArrowLeft from '../../../Components/Button/ButtonAsLinkArrowLeft';\nimport ButtonClear from '../../../Components/Button/ButtonClear';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport Gallery from '../../../Components/Gallery/Gallery';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport { asHtml } from '../../../Utils/parser';\nimport { scrollTop } from '../../../Utils/scroll';\n\nconst BUTTON_TOP_LEFT_NODE = 'accessory-button-top-left-node';\nconst BUTTON_BOTTOM_LEFT_NODE = 'accessory-button-bottom-left-node';\nconst BUTTON_ACCESSORY_ADD_REMOVE_NODE = 'accessory-add-remove-node';\nconst ACCESSORY_GALLERY_NODE = 'accessory-gallery-node';\n\ninterface AccessoryItemInfoProps {\n readonly accessory: IAccessory;\n readonly selected: boolean;\n readonly onClick: () => void;\n readonly onClose: () => void;\n}\n\nclass AccessoryItemInfo extends HtmlNode {\n private readonly props: AccessoryItemInfoProps;\n\n constructor(element: HTMLElement, props: AccessoryItemInfoProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n private onGalleryImagePaging() {\n const { accessory } = this.props;\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.ACCESSORY_INFORMATION_GALLERY_IMAGE_PAGING,\n EcomStep.ACCESSORY,\n {\n id: accessory.id,\n label: accessory.name,\n }\n );\n }\n\n render() {\n const { accessory, selected, onClick, onClose } = this.props;\n const { name, media, logoUrl, price, shortDescription, longDescription, salePrice } = accessory;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-nav-banner\" id=\"${BUTTON_TOP_LEFT_NODE}\"></div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n\n <div class=\"waykeecom-hstack waykeecom-hstack--align-center waykeecom-hstack--spacing-3\">\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--grow\">\n <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${name}</h3>\n </div>\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\">\n <div class=\"waykeecom-logo\">\n <img src=\"${logoUrl}\" alt=\"${i18next.t('accessoryItemInfo.logoAlt')} ${name}\" class=\"waykeecom-logo__image waykeecom-logo__image--right\" />\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${ACCESSORY_GALLERY_NODE}\"></div>\n \n <div class=\"waykeecom-stack waykeecom-stack--3\">\n ${\n salePrice\n ? `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(salePrice, {\n postfix: 'kr',\n })}<span class=\"waykeecom-text waykeecom-text--tone-alt waykeecom-text--line-through\"> (${prettyNumber(\n price,\n {\n postfix: 'kr',\n }\n )})</span></div>`\n : `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(price, {\n postfix: 'kr',\n })}</div>`\n }\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-content waykeecom-text waykeecom-text--font-medium\">\n <p class=\"waykeecom-content__p\">${shortDescription}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${asHtml(longDescription)}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_ACCESSORY_ADD_REMOVE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_BOTTOM_LEFT_NODE}\"></div>\n </div>\n `;\n\n new Gallery(this.node.querySelector(`#${ACCESSORY_GALLERY_NODE}`), {\n id: `gallery-${accessory.id}`,\n media: media.map((m, i) => ({ url: m.url, alt: `Bild ${i + 1}` })),\n onGalleryImagePaging: () => this.onGalleryImagePaging(),\n });\n\n new ButtonAsLinkArrowLeft(this.node.querySelector(`#${BUTTON_TOP_LEFT_NODE}`), {\n title: i18next.t('accessoryItemInfo.backButton'),\n onClick: () => onClose(),\n });\n\n new ButtonClear(this.node.querySelector(`#${BUTTON_BOTTOM_LEFT_NODE}`), {\n title: i18next.t('accessoryItemInfo.backButton'),\n onClick: () => onClose(),\n });\n\n new ButtonAddRemove(this.node.querySelector(`#${BUTTON_ACCESSORY_ADD_REMOVE_NODE}`), {\n selected,\n fullSize: true,\n onClick: () => onClick(),\n });\n\n scrollTop();\n }\n}\n\nexport default AccessoryItemInfo;\n", "import { IAccessory } from '@wayke-se/ecom/dist-types/orders/types';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\n\nimport GridItem from '../../../Components/OverflowGrid/OverflowGridItem';\nimport { addOrRemoveAccessory } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport { createPortal, destroyPortal } from '../../../Utils/portal';\nimport AccessoryItemInfo from './AccessoryItemInfo';\n\ninterface AccessoryItemProps {\n readonly store: WaykeStore;\n readonly accessory: IAccessory;\n readonly key: string;\n}\n\nclass AccessoryItem extends HtmlNode {\n private readonly props: AccessoryItemProps;\n private displayInfo = false;\n private exposureTracked = false;\n\n constructor(element: HTMLElement, props: AccessoryItemProps) {\n super(element);\n this.props = props;\n\n watch<IAccessory[]>(this.props.store, 'accessories', (newValue, oldValue) => {\n if (\n newValue.some((x) => x.id === this.props.accessory.id) !==\n oldValue.some((x) => x.id === this.props.accessory.id)\n ) {\n this.render();\n }\n });\n\n this.render();\n }\n\n private onInfoOpen() {\n const { accessory } = this.props;\n ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_INFORMATION_OPEN, EcomStep.ACCESSORY, {\n id: accessory.id,\n label: accessory.name,\n });\n this.displayInfo = true;\n this.render();\n }\n\n private onInfoClose() {\n const { accessory } = this.props;\n ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_INFORMATION_CLOSE, EcomStep.ACCESSORY, {\n id: accessory.id,\n label: accessory.name,\n });\n this.displayInfo = false;\n destroyPortal();\n this.render();\n this.node.parentElement?.scrollIntoView();\n }\n\n private onClick() {\n const { store, accessory } = this.props;\n const state = store.getState();\n const selected =\n state.accessories.findIndex((_accessory) => _accessory.id === accessory.id) > -1;\n ecomEvent(\n EcomView.MAIN,\n !selected ? EcomEvent.ACCESSORY_SELECTED : EcomEvent.ACCESSORY_UNSELECTED,\n EcomStep.ACCESSORY,\n {\n id: accessory.id,\n label: accessory.name,\n }\n );\n\n addOrRemoveAccessory(this.props.accessory)(this.props.store.dispatch);\n }\n\n private trackExposure() {\n const { accessory } = this.props;\n this.exposureTracked = true;\n ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_EXPOSURE, EcomStep.ACCESSORY, {\n id: accessory.id,\n label: accessory.name,\n });\n }\n\n render() {\n const { store, accessory, key } = this.props;\n const state = store.getState();\n const selected =\n state.accessories.findIndex((_accessory) => _accessory.id === accessory.id) > -1;\n\n if (this.displayInfo) {\n new AccessoryItemInfo(createPortal(), {\n accessory,\n selected,\n onClick: () => {\n this.onInfoClose();\n this.onClick();\n },\n onClose: () => this.onInfoClose(),\n });\n }\n\n new GridItem(\n this.node,\n {\n id: accessory.id,\n title: accessory.name,\n description: accessory.shortDescription,\n logo: accessory.logoUrl,\n image: accessory.media?.[0]?.url,\n price: prettyNumber(accessory.price, { postfix: 'kr' }),\n selected,\n onClick: () => this.onClick(),\n onInfo: () => this.onInfoOpen(),\n inViewPort: this.exposureTracked ? undefined : () => this.trackExposure(),\n },\n key\n );\n }\n}\n\nexport default AccessoryItem;\n", "import { IAccessory } from '@wayke-se/ecom/dist-types/orders/types';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\n\nimport OverflowGridList from '../../../Components/OverflowGrid/OverflowGridList';\nimport { WaykeStore } from '../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport AccessoryItem from './AccessoryItem';\n\ninterface AccessoryListProps {\n readonly store: WaykeStore;\n readonly accessories: IAccessory[];\n}\n\nclass AccessoryList extends HtmlNode {\n private readonly props: AccessoryListProps;\n\n constructor(element: HTMLElement | null, props: AccessoryListProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n render() {\n const { accessories, store } = this.props;\n const listRef = new OverflowGridList(this.node, {\n id: 'accessories-list',\n onClick: () => ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_ARROWS, EcomStep.ACCESSORY),\n });\n const { overflowElement } = listRef;\n if (overflowElement) {\n overflowElement.innerHTML = '';\n accessories.forEach(\n (accessory, index) =>\n new AccessoryItem(overflowElement, {\n store,\n accessory,\n key: `accessory-${accessory.id}-${index}`,\n })\n );\n }\n }\n}\n\nexport default AccessoryList;\n", "import i18next from '@i18n';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonSkip from '../../../Components/Button/ButtonSkip';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { completeStage, goTo } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ListItem from '../../../Templates/ListItem';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport AccessoryList from './AccessoryList';\n\nconst PROCEED = 'button-accessories-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst SKIP = 'button-accessories-skip';\nconst SKIP_NODE = `${SKIP}-node`;\n\nconst ACCESSORY_GRID_LIST_NODE = 'accessory-grid-list-node';\n\ninterface AccessoriesProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n}\n\nclass Accessories extends HtmlNode {\n private readonly props: AccessoriesProps;\n\n constructor(element: HTMLElement, props: AccessoriesProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'navigation', () => {\n this.render();\n });\n\n this.render();\n }\n\n private onProceed() {\n completeStage(this.props.lastStage)(this.props.store.dispatch);\n }\n\n private onEdit() {\n ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_EDIT, EcomStep.ACCESSORY);\n goTo('main', this.props.index)(this.props.store.dispatch);\n }\n\n render() {\n const { store, index } = this.props;\n const state = store.getState();\n\n const completed = state.topNavigation.stage > index;\n const active = state.navigation.stage === index;\n if (active) {\n ecomEvent(EcomView.MAIN, EcomEvent.ACCESSORY_ACTIVE, EcomStep.ACCESSORY);\n }\n const content = ListItem(this.node, {\n completed,\n title: i18next.t('accessories.title'),\n active,\n id: 'accessories',\n index: index,\n });\n\n const part = document.createElement('div');\n\n if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n new StageCompleted(content, {\n keyValueList: !!state.accessories.length\n ? state.accessories.map((accessory) => ({\n key: accessory.name,\n image: accessory.media[0]\n ? {\n src: `${accessory.media[0].url}?w=32&h=32`,\n srcSet: `${accessory.media[0].url}?w=64&h=64 2x`,\n alt: accessory.name,\n }\n : undefined,\n value: prettyNumber(accessory.price, { postfix: 'kr' }),\n }))\n : [\n {\n key: i18next.t('accessories.title'),\n value: i18next.t('accessories.noSelected'),\n },\n ],\n changeButtonTitle: i18next.t('accessories.changeButtonTitle'),\n onEdit: !state.createdOrderId ? () => this.onEdit() : undefined,\n });\n } else if (state.navigation.stage === index) {\n const accessories = state.order?.accessories || [];\n\n part.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('accessories.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('accessories.description')}</p>\n </div>\n </div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${ACCESSORY_GRID_LIST_NODE}\"></div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SKIP_NODE}\"></div>\n </div>\n `;\n\n new AccessoryList(part.querySelector<HTMLDivElement>(`#${ACCESSORY_GRID_LIST_NODE}`), {\n store,\n accessories,\n });\n\n new ButtonArrowRight(part.querySelector(`#${PROCEED_NODE}`), {\n id: PROCEED,\n title: i18next.t('accessories.proceedButton'),\n onClick: () => this.onProceed(),\n });\n\n new ButtonSkip(part.querySelector<HTMLDivElement>(`#${SKIP_NODE}`), {\n title: i18next.t('accessories.skipButton'),\n onClick: () => this.onProceed(),\n });\n }\n\n content.appendChild(part);\n if (state.navigation.stage === index) {\n content.parentElement?.scrollIntoView();\n }\n }\n}\n\nexport default Accessories;\n", "import HtmlNode from '../Extension/HtmlNode';\n\nconst errorInputClassName = 'waykeecom-input-error';\n\ninterface InputErrorProps {\n error?: boolean;\n id?: string;\n readonly errorMessage: string;\n}\n\nclass InputError extends HtmlNode {\n private readonly props: InputErrorProps;\n\n constructor(element: HTMLElement, props: InputErrorProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n setError(error: boolean) {\n this.props.error = error;\n this.render();\n }\n\n render() {\n const { error, errorMessage } = this.props;\n const errorNode = this.node.querySelector(`.${errorInputClassName}`);\n if (errorNode) {\n if (!error) {\n errorNode.remove();\n }\n } else {\n if (error) {\n const errorElement = document.createElement('div');\n errorElement.className = errorInputClassName;\n errorElement.setAttribute('aria-live', 'assertive');\n errorElement.innerHTML = errorMessage;\n this.node.appendChild(errorElement);\n\n if (this.props.id) {\n errorElement.id = this.props.id;\n }\n }\n }\n }\n}\n\nexport default InputError;\n", "import i18next from '@i18n';\nimport HtmlNode from '../Extension/HtmlNode';\n\nconst helpClassName = 'waykeecom-input-label__help';\nconst foldoutClassName = 'waykeecom-input-label__foldout';\n\ninterface InputInformationProps {\n readonly information?: string;\n readonly onClickInformation?: (visible: boolean) => void;\n}\n\nclass InputInformation extends HtmlNode {\n private readonly props: InputInformationProps;\n private open: boolean = false;\n\n constructor(element: HTMLElement | null | undefined, props: InputInformationProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n onClick() {\n this.open = !this.open;\n if (this.props.onClickInformation) {\n this.props.onClickInformation(this.open);\n }\n this.render();\n }\n\n render() {\n const { information } = this.props;\n if (information) {\n const existHelp = this.node.querySelector(`.${helpClassName}`);\n const existFoldout = this.node.querySelector(`.${foldoutClassName}`);\n\n const label = existHelp || document.createElement('div');\n if (!existHelp) {\n label.className = helpClassName;\n }\n\n if (this.open) {\n label.innerHTML = `\n <button class=\"waykeecom-input-label__help-btn\" title=\"${i18next.t('glossary.whatDoesThisMean')}\">\n <span class=\"waykeecom-sr-only\">${i18next.t('glossary.closeHelp')}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n aria-hidden=\"true\"\n data-icon=\"Close circle\"\n >\n <path d=\"M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6zm3.5-8.1L9.4 8l2.1 2.1-1.4 1.4L8 9.4l-2.1 2.1-1.4-1.4L6.6 8 4.5 5.9l1.4-1.4L8 6.6l2.1-2.1 1.4 1.4z\" />\n </svg>\n </button>\n `;\n const informationElement = document.createElement('div');\n informationElement.className = foldoutClassName;\n informationElement.innerHTML = information;\n label.parentNode?.appendChild(informationElement);\n } else {\n existFoldout?.remove();\n label.innerHTML = `\n <button class=\"waykeecom-input-label__help-btn\" title=\"${i18next.t('glossary.whatDoesThisMean')}\">\n <span class=\"waykeecom-sr-only\">${i18next.t('glossary.showHelp')}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n aria-hidden=\"true\"\n data-icon=\"Questionmark circle\"\n >\n <path d=\"M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6zm-1.4-3.8h1.9V12H6.6v-1.8zm3.8-3.4c0 1-.5 1.5-1.4 2l-.4.3c-.3.1-.3.2-.3.4v.1H6.7v-.3c0-.6.1-.9.8-1.3l.7-.4c.3-.2.6-.4.6-.8s-.3-.7-.7-.7c-.5 0-.8.3-.8.8v.3H5.7v-.4c0-1.2.8-2 2.3-2 1.5 0 2.4.7 2.4 2z\" />\n </svg>\n </button>\n `;\n }\n\n label.querySelector('button')?.addEventListener('click', () => this.onClick());\n if (!existHelp) {\n this.node.appendChild(label);\n }\n }\n }\n}\n\nexport default InputInformation;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface InputRadioFieldProps {\n readonly title: string;\n readonly value: string;\n readonly name: string;\n readonly description?: string;\n readonly meta?: string;\n readonly id: string;\n readonly checked: boolean;\n readonly disabled?: boolean;\n readonly onClick?: (e: Event) => void;\n}\n\nclass InputRadioField extends HtmlNode {\n private readonly props: InputRadioFieldProps;\n\n constructor(element: HTMLDivElement | null, props: InputRadioFieldProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { id, title, value, name, checked, meta, description, disabled, onClick } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-input-selection\" role=\"radio\">\n <input\n type=\"radio\"\n id=\"${id}\"\n value=\"${value}\"\n name=\"${name}\"\n ${checked ? 'checked=\"true\"' : ''}\n ${disabled ? 'disabled=\"\"' : ''} \n class=\"waykeecom-input-selection__input\"\n />\n <div class=\"waykeecom-input-selection__header\">\n <label for=\"${id}\" class=\"waykeecom-input-selection__label\">${title}</label>\n ${meta ? `<div class=\"waykeecom-input-selection__meta\">${meta}</div>` : ''}\n </div>\n ${\n description\n ? `\n <label for=\"${id}\" class=\"waykeecom-input-selection__description\">\n ${description}\n </label>\n `\n : ''\n }\n </div>\n `;\n\n const input = this.node.querySelector(`#${id}`);\n if (input) {\n if (onClick) {\n input.addEventListener('click', onClick);\n }\n }\n }\n}\n\nexport default InputRadioField;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputError from './InputError';\nimport InputInformation from './InputInformation';\nimport InputRadioField from './InputRadioField';\n\nexport interface RadioItem {\n id: string;\n value: string;\n title?: string;\n description?: string;\n meta?: string;\n}\n\ninterface InputRadioGroupProps {\n readonly title?: string;\n readonly name: string;\n readonly checked?: string;\n readonly options: RadioItem[];\n error?: boolean;\n information?: string;\n footer?: string;\n readonly errorMessage?: string;\n readonly onClick: (e: Event) => void;\n readonly onClickInformation?: (visible: boolean) => void;\n}\n\nclass InputRadioGroup extends HtmlNode {\n private readonly props: InputRadioGroupProps;\n private contexts: {\n error?: InputError;\n } = {};\n\n constructor(element: HTMLElement | null, props: InputRadioGroupProps) {\n super(element);\n\n this.props = props;\n this.render();\n }\n\n private updateBorder() {\n const border = this.node.querySelector('.waykeecom-input-text');\n if (border) {\n if (this.props.error) {\n border?.classList.add('waykeecom-input-text--has-error');\n } else {\n border?.classList.remove('waykeecom-input-text--has-error');\n }\n }\n }\n\n setError(error: boolean) {\n this.props.error = error;\n this.updateBorder();\n this.contexts.error?.setError(error);\n }\n\n render() {\n const {\n title,\n options,\n name,\n checked,\n error,\n errorMessage,\n information,\n footer,\n onClick,\n onClickInformation,\n } = this.props;\n this.node.innerHTML = `\n <fieldset class=\"waykeecom-input-group\" role=\"radiogroup\" aria-required=\"true\">\n ${\n title\n ? `<legend class=\"waykeecom-input-label\"><div class=\"waykeecom-input-label__label\">${title}</div></legend>`\n : ''\n}\n ${options\n .map((option) => `<div class=\"waykeecom-input-group__item\" id=\"${option.id}-node\"></div>`)\n .join('')}\n ${footer ? `<div class=\"waykeecom-input-group__footer\">${footer}</div>` : ''}\n </fieldset>\n `;\n\n this.updateBorder();\n if (errorMessage) {\n this.contexts.error = new InputError(this.node, {\n error,\n errorMessage,\n });\n }\n\n options.forEach(\n (option) =>\n new InputRadioField(this.node.querySelector<HTMLDivElement>(`#${option.id}-node`), {\n id: option.id,\n name,\n title: option.title || option.value,\n value: option.value,\n checked: checked === option.value,\n description: option.description,\n meta: option.meta,\n onClick: (e) => onClick(e),\n })\n );\n\n if (information) {\n new InputInformation(this.node.querySelector<HTMLElement>('.waykeecom-input-label'), {\n information,\n onClickInformation,\n });\n }\n }\n}\n\nexport default InputRadioGroup;\n", "import { orders } from '@wayke-se/ecom';\n\nexport const getOrder = (id: string, dealer?: string) => {\n const request = dealer\n ? orders.newOptionsRequest().forVehicle(id).forDealer(dealer)\n : orders.newOptionsRequest().forVehicle(id);\n return orders.getOptions(request.build());\n};\n", "type Tones = 'success' | 'warning' | 'error' | 'info';\n\ninterface AlertProps {\n tone?: Tones;\n children?: string | Element;\n polite?: boolean;\n}\n\nconst Alert = ({ tone, children, polite }: AlertProps) => `\n <div class=\"waykeecom-alert ${tone ? `waykeecom-alert--${tone}` : ''}\" role=\"${polite ? 'status' : 'alert'}\" ${polite ? 'aria-live=\"polite\"' : ''}>\n <div class=\"waykeecom-alert__icon\">\n <div class=\"waykeecom-alert__icon-badge\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Info\"\n >\n <path d=\"M7 6h2v8H7V6zm0-4v2h2V2H7z\" />\n </svg>\n </div>\n </div>\n <div class=\"waykeecom-alert__content\">\n ${children}\n </div>\n </div>\n`;\n\nexport default Alert;\n", "import i18next from '@i18n';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputRadioGroup, { RadioItem } from '../../../Components/Input/InputRadioGroup';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { getOrder } from '../../../Data/getOrder';\nimport { goTo, setDealer, setOrder } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport Alert from '../../../Templates/Alert';\nimport ListItem from '../../../Templates/ListItem';\nimport { convertOrderOptionsResponse } from '../../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\n\nconst PROCEED = 'button-central-storage-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst CENTRAL_STORAGE_BRANCH = 'central-storage-branch';\nconst CENTRAL_STORAGE_BRANCH_NODE = `${CENTRAL_STORAGE_BRANCH}-node`;\n\ninterface CentralStorageProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n}\n\nclass CentralStorage extends HtmlNode {\n private readonly props: CentralStorageProps;\n private selectedDealer?: string;\n private requestError = false;\n private notOrderable?: 'reserved' | 'unavailable';\n private contexts: {\n proceedButton?: ButtonArrowRight;\n } = {};\n\n constructor(element: HTMLElement, props: CentralStorageProps) {\n super(element);\n this.props = props;\n watch(this.props.store, 'navigation', () => {\n this.render();\n });\n\n this.selectedDealer = this.props.store.getState().dealer;\n\n this.render();\n }\n\n private async updateOrder(selectedDealer: string) {\n if (this.requestError) {\n this.requestError = false;\n this.render();\n }\n const { id, vehicle } = this.props.store.getState();\n try {\n this.contexts.proceedButton?.loading(true);\n\n const order = await getOrder(id, selectedDealer);\n const convertedOrder = convertOrderOptionsResponse(order);\n\n if (convertedOrder.isReserved || convertedOrder.isUnavailable) {\n this.notOrderable = convertedOrder.isReserved ? 'reserved' : 'unavailable';\n this.contexts.proceedButton?.loading(false);\n this.render();\n return;\n }\n this.notOrderable = undefined;\n\n ecomEvent(EcomView.MAIN, EcomEvent.CENTRAL_STORAGE_SET, EcomStep.CENTRAL_STORAGE);\n setOrder(convertedOrder, vehicle);\n setDealer(selectedDealer, this.props.lastStage)(this.props.store.dispatch);\n\n this.contexts.proceedButton?.loading(false);\n } catch (_e) {\n this.contexts.proceedButton?.loading(false);\n this.requestError = true;\n this.render();\n }\n }\n\n private onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const value = currentTarget.value;\n this.selectedDealer = value;\n this.contexts.proceedButton?.disabled(false);\n ecomEvent(EcomView.MAIN, EcomEvent.CENTRAL_STORAGE_SELECTED, EcomStep.CENTRAL_STORAGE);\n }\n\n private onEdit() {\n ecomEvent(EcomView.MAIN, EcomEvent.CENTRAL_STORAGE_EDIT, EcomStep.CENTRAL_STORAGE);\n goTo('main', this.props.index)(this.props.store.dispatch);\n }\n\n private onProceed() {\n if (this.selectedDealer) {\n this.updateOrder(this.selectedDealer);\n }\n }\n\n render() {\n const { order, navigation, topNavigation, createdOrderId } = this.props.store.getState();\n const { index } = this.props;\n const dealers = order?.dealerSites || [];\n\n const completed = topNavigation.stage > index;\n const active = navigation.stage === index;\n\n if (active) {\n ecomEvent(EcomView.MAIN, EcomEvent.CENTRAL_STORAGE_ACTIVE, EcomStep.CENTRAL_STORAGE);\n }\n\n const content = ListItem(this.node, {\n completed,\n active,\n title: i18next.t('centralStorage.title'),\n id: 'central-storage',\n index: index,\n });\n\n if (\n (navigation.stage > index || (completed && navigation.stage !== index)) &&\n this.selectedDealer\n ) {\n const dealer = dealers.find((x) => x.id === this.selectedDealer);\n new StageCompleted(content, {\n keyValueList: [\n {\n key: i18next.t('centralStorage.dealerSelection'),\n value: dealer?.name || '',\n },\n ],\n changeButtonTitle: i18next.t('centralStorage.changeButtonTitle'),\n onEdit: !createdOrderId ? () => this.onEdit() : undefined,\n });\n } else if (navigation.stage === index) {\n content.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('centralStorage.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('centralStorage.description')}</p>\n </div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${CENTRAL_STORAGE_BRANCH_NODE}\"></div>\n\n ${\n this.requestError\n ? `<div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n tone: 'error',\n children: i18next.t('centralStorage.errorMessage'),\n })}</div>`\n : ''\n }\n\n ${\n this.notOrderable\n ? `<div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n tone: 'warning',\n children: i18next.t(\n this.notOrderable === 'reserved' ? 'preview.reserved' : 'preview.unavailable'\n ),\n })}</div>`\n : ''\n }\n\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>\n `;\n\n const options: RadioItem[] = dealers.map((dealer) => {\n const address =\n !dealer.location?.address || !dealer.location?.city\n ? i18next.t('centralStorage.addressMissing')\n : `${dealer.location?.address}, ${dealer.location?.city}`;\n\n return {\n id: `central-storage-${dealer.id}`,\n value: dealer.id,\n title: dealer.name,\n description: `\n <div class=\"waykeecom-box\">\n <div class=\"waykeecom-icon-content\">\n <div class=\"waykeecom-icon-content__icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Location pin\"\n >\n <path d=\"M12.2 2C11.1.9 9.6.3 8 .3S4.9.9 3.8 2C2.6 3.2 2 4.7 2 6.3 2 9 5.3 12.9 7.3 15l.7.7.7-.7c2-2.1 5.3-6 5.3-8.7 0-1.6-.6-3.1-1.8-4.3zM8 12.8C5.5 10 4 7.6 4 6.3c0-1.1.4-2.1 1.2-2.9.7-.7 1.7-1.1 2.8-1.1 1.1 0 2.1.4 2.8 1.2.8.7 1.2 1.7 1.2 2.8 0 1.3-1.5 3.7-4 6.5zm2-6.5c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z\" />\n </svg>\n </div>\n <div class=\"waykeecom-icon-content__content\">\n <div class=\"waykeecom-icon-content__meta\">\n ${address}\n </div>\n </div>\n </div>\n </div>`,\n } as RadioItem;\n });\n\n new InputRadioGroup(\n content.querySelector<HTMLDivElement>(`#${CENTRAL_STORAGE_BRANCH_NODE}`),\n {\n checked: this.selectedDealer,\n name: 'dealer',\n options,\n onClick: (e) => this.onChange(e),\n }\n );\n\n this.contexts.proceedButton = new ButtonArrowRight(\n content.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n {\n title: i18next.t('centralStorage.proceedButton'),\n id: PROCEED,\n disabled: !this.selectedDealer,\n onClick: () => this.onProceed(),\n }\n );\n }\n\n if (navigation.stage === index) {\n content.parentElement?.scrollIntoView();\n }\n }\n}\n\nexport default CentralStorage;\n", "export const maskText = (text: string) => {\n if (text.length < 2) {\n return text;\n }\n if (text.length === 2) {\n return `${text.substring(0, 1)}***`;\n }\n if (text.length === 3) {\n return `${text.substring(0, 2)}***`;\n }\n return `${text.substring(0, 3)}***`;\n};\n\nexport const maskSSn = (ssn: string) => `${ssn.substring(0, ssn.length - 4)}****`;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputError from './InputError';\nimport InputInformation from './InputInformation';\n\ninterface InputFieldProps {\n readonly title: string;\n readonly value: string;\n readonly name: string;\n readonly id: string;\n readonly unit?: string;\n readonly min?: number;\n error?: boolean;\n errorMessage?: string;\n readonly placeholder?: string;\n readonly information?: string;\n readonly type?: string;\n readonly autocomplete?: string;\n readonly pattern?: string;\n readonly inputmode?: string;\n readonly help?: string;\n readonly onChange?: (e: Event) => void;\n readonly onBlur?: (e: Event) => void;\n readonly onClickInformation?: (visible: boolean) => void;\n}\n\nclass InputField extends HtmlNode {\n private readonly props: InputFieldProps;\n private contexts: {\n error?: InputError;\n } = {};\n\n constructor(element: HTMLElement | null, props: InputFieldProps) {\n super(element);\n\n this.props = props;\n this.render();\n }\n\n private updateBorder() {\n const border = this.node.querySelector('.waykeecom-input-text');\n if (border) {\n if (this.props.error) {\n border?.classList.add('waykeecom-input-text--has-error');\n } else {\n border?.classList.remove('waykeecom-input-text--has-error');\n }\n }\n }\n\n setError(error: boolean, errorMessage?: string) {\n this.props.error = error;\n if (errorMessage) {\n this.props.errorMessage = errorMessage;\n }\n this.updateBorder();\n this.contexts.error?.setError(error);\n\n const { id } = this.props;\n if (error) {\n document.getElementById(id)?.setAttribute('aria-invalid', 'true');\n document.getElementById(id)?.setAttribute('aria-describedby', `${id}-error`);\n } else {\n document.getElementById(id)?.removeAttribute('aria-invalid');\n document.getElementById(id)?.removeAttribute('aria-describedby');\n }\n }\n\n private render() {\n const {\n id,\n title,\n type,\n name,\n min,\n value,\n autocomplete,\n placeholder,\n unit,\n error,\n errorMessage,\n information,\n pattern,\n inputmode,\n help,\n onChange,\n onBlur,\n onClickInformation,\n } = this.props;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-input-label\">\n <label for=\"${id}\" class=\"waykeecom-input-label__label\">${title}</label>\n </div>\n <div class=\"waykeecom-input-text\">\n <input\n ${type ? `type=\"${type}\"` : 'type=\"text\"'}\n ${type === 'number' ? `pattern=\"[0-9]*\" inputmode=\"numeric\"` : ''}\n id=\"${id}\"\n ${pattern ? `pattern=\"${pattern}\"` : ''}\n ${inputmode ? `inputmode=\"${inputmode}\"` : ''}\n value=\"${value}\"\n name=\"${name}\"\n ${min !== undefined ? `min=\"${min}\"` : ''}\n ${autocomplete ? `autocomplete=\"${autocomplete}\"` : ''}\n ${placeholder ? `placeholder=\"${placeholder}\"` : ''}\n ${help ? `aria-describedby=\"${id}-help\"` : ''}\n class=\"waykeecom-input-text__input\"\n />\n ${unit ? `<div class=\"waykeecom-input-text__unit\">${unit}</div>` : ''}\n </div>\n ${help ? `<div class=\"waykeecom-input-help\" id=\"${id}-help\">${help}</div>` : ''}\n `;\n\n this.updateBorder();\n\n if (errorMessage) {\n this.contexts.error = new InputError(this.node, {\n error,\n errorMessage,\n id: `${id}-error`,\n });\n }\n\n if (information) {\n new InputInformation(this.node.querySelector<HTMLElement>('.waykeecom-input-label'), {\n information,\n onClickInformation,\n });\n }\n\n const input = this.node.querySelector('input');\n if (input) {\n if (onChange) {\n input.addEventListener('input', onChange);\n }\n if (onBlur) {\n input.addEventListener('blur', onBlur);\n }\n }\n }\n}\n\nexport default InputField;\n", "export const regexEmail = /\\S+@\\S+\\.\\S+/;\nexport const regexPhoneNumberVariant = /^[0-9\\-\\+\\(\\)\\ ]+$/;\nexport const regexZip = /^[0-9\\ \\-]+$/;\nexport const regexPersonalNumber = /^(19|20)(\\d{6}(-|\\s)\\d{4}|(?!19|20)\\d{10})$/;\nexport const regexRegistrationNumberSweden = /[a-zA-Z]{3}\\d{2}(d||[a-zA-Z]){1}/;\nexport const regexRegistrationNumberNorway = /^[A-Z]{2}\\d{5}$/;\nexport const regexNumber = /\\D/g;\n", "import { MarketCode } from '../@types/MarketCode';\nimport {\n regexEmail,\n regexNumber,\n regexPersonalNumber,\n regexPhoneNumberVariant,\n regexRegistrationNumberNorway,\n regexRegistrationNumberSweden,\n regexZip,\n} from './regex';\n\nexport const validationMethods = {\n requiredEmail: (s: string) => {\n return regexEmail.test(s);\n },\n requiredTelephone: (s: string) => {\n return regexPhoneNumberVariant.test(s);\n },\n requiredSsn: (s: string) => {\n return regexPersonalNumber.test(s);\n },\n requiredSsnOver18: (s: string) => {\n if (validationMethods.requiredSsn(s)) {\n const cleaned = s.replace(regexNumber, '');\n const nonLast = cleaned.slice(0, 8);\n const asDate = `${nonLast.slice(0, 4)}-${nonLast.slice(4, 6)}-${nonLast.slice(6, 8)}`;\n\n const years =\n new Date(new Date().valueOf() - new Date(asDate).valueOf()).getFullYear() - 1970;\n\n return years > 17;\n }\n return false;\n },\n requiredZip: (s: string) => {\n return regexZip.test(s);\n },\n requiredNumberOrStringNumberInRange: (s: string | number, from: number, to: number) => {\n const number = parseInt(s.toString(), 10);\n if (isNaN(number)) {\n return false;\n }\n\n return number >= from && number <= to;\n },\n requiredNumber: (s?: string | number | null) =>\n s !== null && s !== undefined && !Number.isNaN(+s),\n requiredNumberGreaterOrEqualThanZero: (s?: string | number | null) => {\n if (s === undefined || s === null) {\n return false;\n }\n const f = parseInt(s.toString(), 10);\n return !Number.isNaN(f) && f >= 0;\n },\n optionalNumberGreaterOrEqualThanZero: (s?: string | number | null) => {\n if (s === undefined || s === null || (typeof s === 'string' && !s)) {\n return true;\n }\n const f = parseInt(s.toString(), 10);\n return !Number.isNaN(f) && f >= 0;\n },\n optionalNumber: (s?: string | number | null) =>\n s === null || s === undefined || !Number.isNaN(+s),\n requiredRegistrationNumber: (s?: string, marketCode?: MarketCode) => {\n if (!s) {\n return false;\n }\n\n const trimmed = s.replace(' ', '');\n\n const hasCorrectLength = marketCode === 'SE' ? trimmed.length === 6 : trimmed.length === 7;\n const isRegexMatch =\n marketCode === 'SE'\n ? regexRegistrationNumberSweden.test(trimmed)\n : regexRegistrationNumberNorway.test(trimmed);\n\n return hasCorrectLength && isRegexMatch;\n },\n requiredMileage: (s?: string) => {\n return validationMethods.requiredNumberOrStringNumberInRange(s || '', 0, 80000);\n },\n optionalString: (s?: string) => {\n return !!s || !s;\n },\n requiredCondition: (s?: string) => {\n return ['VeryGood', 'Good', 'Ok'].includes(s || '');\n },\n requiredAssessmentMaritalStatus: (s?: string) => {\n return ['married', 'single', 'commonLaw'].includes(s || '');\n },\n requiredAssessmentEmplyment: (s?: string) => {\n return [\n 'other',\n 'retired',\n 'fullTimeEmployed',\n 'student',\n 'temporarilyEmployed',\n 'selfEmployed',\n ].includes(s || '');\n },\n requiredHousingType: (s?: string) => {\n return ['singleFamily', 'condominium', 'apartment'].includes(s || '');\n },\n requiredName: (s?: string) => {\n return !!s;\n },\n requiredCity: (s?: string) => {\n return !!s;\n },\n requiredStreet: (s?: string) => {\n return !!s;\n },\n requiredStreet2: (_s?: string) => {\n return true;\n },\n};\n", "import i18next from '@i18n';\nimport { Customer, PartialCustomer } from '../../../@types/Customer';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport { goTo, setContactAndPhone } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst EMAIL_NODE = 'contact-email-node';\nconst EMAIL_INPUT_ID = 'contact-email';\n\nconst PHONE_NODE = 'contact-phone-node';\nconst PHONE_INPUT_ID = 'contact-phone';\n\nconst PROCEED_NODE = 'contact-proceed-node';\nconst PROCEED = 'contact-proceed';\n\nconst validation = {\n email: validationMethods.requiredEmail,\n phone: validationMethods.requiredTelephone,\n};\n\nexport interface PartialCustomerValidation {\n email: boolean;\n phone: boolean;\n}\n\ninterface Part1EmailAndPhoneState {\n value: PartialCustomer;\n validation: PartialCustomerValidation;\n interact: PartialCustomerValidation;\n}\n\nconst initalState = (customer?: Customer): Part1EmailAndPhoneState => {\n const value = {\n email: customer?.email || '',\n phone: customer?.phone || '',\n };\n return {\n value,\n validation: {\n email: validation.email(value.email),\n phone: validation.phone(value.phone),\n },\n interact: { email: false, phone: false },\n };\n};\n\ninterface EmailAndPhoneProps {\n readonly store: WaykeStore;\n}\n\nclass EmailAndPhone extends HtmlNode {\n private readonly props: EmailAndPhoneProps;\n private state: Part1EmailAndPhoneState;\n private contexts: {\n email?: InputField;\n phone?: InputField;\n button?: ButtonArrowRight;\n } = {};\n\n constructor(element: HTMLDivElement, props: EmailAndPhoneProps) {\n super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n this.props = props;\n\n const state = this.props.store.getState();\n this.state = initalState(state.customer);\n\n this.render();\n }\n\n private onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof PartialCustomerValidation;\n\n const value = currentTarget.value;\n this.state.value[name] = value;\n this.state.validation[name] = validation[name](value);\n\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private onBlur(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof PartialCustomerValidation;\n\n this.state.interact[name] = true;\n this.state.validation[name] = validation[name](this.state.value[name]);\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private updateUiError(name: keyof PartialCustomer) {\n this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n }\n\n private updateProceedButton() {\n this.contexts.button?.disabled(!this.state.validation.email || !this.state.validation.phone);\n }\n\n private onProceed() {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CUSTOMER_EMAIL_AND_PHONE_SET,\n EcomStep.CUSTOMER_EMAIL_AND_PHONE\n );\n setContactAndPhone({\n email: this.state.value.email.trim(),\n phone: this.state.value.phone.trim(),\n })(this.props.store.dispatch);\n }\n\n private onChangeContacts() {\n ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_EDIT, EcomStep.CUSTOMER_EMAIL_AND_PHONE);\n goTo('main', 1)(this.props.store.dispatch);\n }\n\n render() {\n const subStage = this.props.store.getState().navigation.subStage;\n\n if (subStage > 1) {\n const keyValueItems: { key: string; value: string }[] = [\n { key: i18next.t('customer.email'), value: this.state.value.email },\n { key: i18next.t('customer.phone'), value: this.state.value.phone },\n ];\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <ul class=\"waykeecom-key-value-list\">\n ${keyValueItems.map((kv) => KeyValueListItem(kv)).join('')}\n </ul>\n </div>\n `;\n\n if (subStage <= 2) {\n this.node.innerHTML += `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-align waykeecom-align--end\">\n <button type=\"button\" title=\"${i18next.t('customer.changeContactsButton')}\" class=\"waykeecom-link\" id=\"change-contacts\">${i18next.t('customer.changeContactsButton')}</button>\n </div>\n </div>\n `;\n }\n } else {\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('customer.contactInfoTitle')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('customer.contactInfoDescription')}</p>\n </div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${EMAIL_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${PHONE_NODE}\"></div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>\n `;\n\n this.contexts.email = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${EMAIL_NODE}`),\n {\n title: i18next.t('customer.email'),\n value: this.state.value.email,\n id: EMAIL_INPUT_ID,\n error: this.state.interact.email && !this.state.validation.email,\n errorMessage: i18next.t('customer.emailErrorMessage'),\n name: 'email',\n autocomplete: 'email',\n placeholder: i18next.t('customer.emailPlaceholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.phone = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${PHONE_NODE}`),\n {\n title: i18next.t('customer.phone'),\n value: this.state.value.phone,\n id: PHONE_INPUT_ID,\n error: this.state.interact.phone && !this.state.validation.phone,\n errorMessage: i18next.t('customer.phoneErrorMessage'),\n name: 'phone',\n autocomplete: 'tel',\n placeholder: i18next.t('customer.phonePlaceholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.button = new ButtonArrowRight(\n this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n {\n title: i18next.t('customer.proceedButton'),\n id: PROCEED,\n disabled: !(this.state.validation.email && this.state.validation.phone),\n onClick: () => this.onProceed(),\n }\n );\n }\n\n this.node\n .querySelector('#change-contacts')\n ?.addEventListener('click', () => this.onChangeContacts());\n }\n}\n\nexport default EmailAndPhone;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface DisclaimerProps {\n readonly text: string;\n}\nclass DisclaimerPadlock extends HtmlNode {\n private readonly props: DisclaimerProps;\n\n constructor(element: HTMLElement | null, props: DisclaimerProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n this.node.innerHTML = `\n <div class=\"waykeecom-disclaimer\">\n <div class=\"waykeecom-disclaimer__icon\" aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Padlock\"\n >\n <path d=\"M13 6h-1V4c0-2.2-1.8-4-4-4S4 1.8 4 4v2H3c-1.1 0-2 .9-2 2v8h14V8c0-1.1-.9-2-2-2zM6 4c0-1.1.9-2 2-2s2 .9 2 2v2H6V4zm7 10H3V8h10v6z\" />\n </svg>\n </div>\n <span class=\"waykeecom-disclaimer__text\">${this.props.text}</span>\n </div>\n `;\n }\n}\n\nexport default DisclaimerPadlock;\n", "import { customers } from '@wayke-se/ecom';\n\nexport const getAddressBySsn = (ssn: string) => {\n const request = customers.newAddressLookupRequest().forCustomer(ssn).build();\n\n return customers.lookupAddress(request);\n};\n", "export const renderConditional = (condition: boolean, content: string) =>\n condition ? content : '';\n", "import i18next from '@i18n';\nimport { Customer, CustomerSocialId } from '../../../@types/Customer';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport DisclaimerPadlock from '../../../Components/Disclaimer/DisclaimerPadlock';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport { getAddressBySsn } from '../../../Data/getAddress';\nimport { setSocialIdAndAddress } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { regexNumber } from '../../../Utils/regex';\nimport { renderConditional } from '../../../Utils/render';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst SOCIAL_ID_NODE = 'contact-socialId-node';\nconst SOCIAL_ID_INPUT_ID = 'contact-socialId';\nconst SOCIAL_ID_INFO = 'contact-social-id-info';\n\nconst PROCEED = `${SOCIAL_ID_INPUT_ID}-proceed`;\nconst PROCEED_NODE = `${SOCIAL_ID_INPUT_ID}-proceed-node`;\nconst DISCLAIMER_NODE = `${SOCIAL_ID_INPUT_ID}-disclaimer-node`;\n\nconst validation = {\n socialId: validationMethods.requiredSsnOver18,\n};\n\nexport interface SocialIdValidation {\n socialId: boolean;\n}\n\ninterface Part2SocialIdState {\n value: CustomerSocialId;\n validation: SocialIdValidation;\n interact: SocialIdValidation;\n}\n\nconst initalState = (customer?: Customer): Part2SocialIdState => {\n const value = {\n socialId: customer?.socialId || '',\n };\n return {\n value,\n validation: {\n socialId: validation.socialId(value.socialId),\n },\n interact: { socialId: false },\n };\n};\n\ninterface FullAddressBySocialIdProps {\n readonly store: WaykeStore;\n readonly lastStage: boolean;\n}\n\nclass FullAddressBySocialId extends HtmlNode {\n private readonly props: FullAddressBySocialIdProps;\n private state: Part2SocialIdState;\n private requestError: boolean = false;\n private contexts: {\n socialId?: InputField;\n buttonFetch?: ButtonArrowRight;\n buttonLinkToggle?: ButtonAsLink;\n } = {};\n\n constructor(element: HTMLElement, props: FullAddressBySocialIdProps) {\n super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n this.props = props;\n\n const state = this.props.store.getState();\n this.state = initalState(state.customer);\n\n this.render();\n }\n\n private async onFetchAddress() {\n const { store, lastStage } = this.props;\n this.requestError = false;\n this.render();\n\n try {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CUSTOMER_ADDRESS_BY_SSN_REQUESTED,\n EcomStep.CUSTOMER_ADDRESS\n );\n this.contexts.buttonFetch?.loading(true);\n\n const response = await getAddressBySsn(this.state.value.socialId);\n\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CUSTOMER_ADDRESS_BY_SSN_SUCCEEDED,\n EcomStep.CUSTOMER_ADDRESS\n );\n const address = response.getAddress();\n setSocialIdAndAddress(\n this.state.value.socialId.replace(regexNumber, ''),\n address,\n lastStage\n )(store.dispatch);\n ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_ADDRESS_SET, EcomStep.CUSTOMER_ADDRESS);\n } catch (_e) {\n this.requestError = true;\n ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_ADDRESS_BY_SSN_FAILED, EcomStep.CUSTOMER_ADDRESS);\n } finally {\n this.contexts.buttonFetch?.loading(false);\n this.render();\n }\n }\n\n private onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof CustomerSocialId;\n const value = currentTarget.value;\n\n this.state.value[name] = value;\n this.state.validation[name] = validation[name](value);\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private onBlur(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof CustomerSocialId;\n\n this.state.interact[name] = true;\n this.state.validation[name] = validation[name](this.state.value[name]);\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private updateUiError(name: keyof SocialIdValidation) {\n this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n }\n\n private updateProceedButton() {\n this.contexts.buttonFetch?.disabled(!this.state.validation.socialId);\n }\n\n render() {\n const policy = 'https://www.wayke.se/trygghet-naer-det-kommer-till-dina-personuppgifter';\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <hr class=\"waykeecom-separator\" />\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('customer.personalInfoTitle')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('customer.personalInfoDescription')}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${SOCIAL_ID_NODE}\"></div>\n\n ${renderConditional(\n this.requestError,\n `\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${SOCIAL_ID_NODE}\">\n ${Alert({\n tone: 'error',\n children: i18next.t('customer.fetchErrorMessage'),\n })}\n </div>`\n )}\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${SOCIAL_ID_INFO}\">\n ${Alert({\n tone: 'info',\n children: `\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <p class=\"waykeecom-content__p\">${i18next.t('customer.fetchInfoMessage')}</p>\n <ul class=\"waykeecom-content__ul\">\n <li class=\"waykeecom-content__li\">${i18next.t('customer.name')}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('customer.registeredAddress')}</li>\n </ul>\n </div>\n `,\n })}\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${PROCEED_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DISCLAIMER_NODE}\"></div>\n </div>\n </div>\n `;\n\n this.contexts.socialId = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${SOCIAL_ID_NODE}`),\n {\n title: 'Personnummer',\n value: this.state.value.socialId,\n id: SOCIAL_ID_INPUT_ID,\n error: this.state.interact.socialId && !this.state.validation.socialId,\n errorMessage: i18next.t('customer.socialIdErrorMessage'),\n name: 'socialId',\n placeholder: i18next.t('customer.socialIdPlaceholder'),\n pattern: '[0-9]*',\n inputmode: 'numeric',\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n Object.keys(this.state.value).forEach((key) =>\n this.updateUiError(key as keyof CustomerSocialId)\n );\n\n this.contexts.buttonFetch = new ButtonArrowRight(\n this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n {\n title: i18next.t('customer.fetchButton'),\n id: PROCEED,\n disabled: !this.state.validation.socialId,\n onClick: () => this.onFetchAddress(),\n }\n );\n\n new DisclaimerPadlock(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_NODE}`), {\n text: i18next.t('customer.policyText', {\n policy,\n link: `<a href=\"${policy}\" title=\"${i18next.t('confirmation.privacyPolicy')}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('confirmation.privacyPolicy')}</a>`,\n interpolation: { escapeValue: false },\n }),\n });\n\n this.updateProceedButton();\n }\n}\n\nexport default FullAddressBySocialId;\n", "import i18next from '@i18n';\nimport { IAddress } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport { goTo, setAddress, setContactAndPhone } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst GIVENNAME_NODE = 'contact-givenname-node';\nconst GIVENNAME_INPUT_ID = 'contact-givenname';\nconst SURNAME_NODE = 'contact-surname-node';\nconst SURNAME_INPUT_ID = 'contact-surname';\nconst STREET_NODE = 'contact-street-node';\nconst STREET_INPUT_ID = 'contact-street';\nconst STREET2_NODE = 'contact-street2-node';\nconst STREET2_INPUT_ID = 'contact-street2';\nconst POSTALCODE_NODE = 'contact-postalcode-node';\nconst POSTALCODE_INPUT_ID = 'contact-postalcode';\nconst CITY_NODE = 'contact-city-node';\nconst CITY_INPUT_ID = 'contact-city';\n\nconst PROCEED_NODE = 'contact-proceed-node';\nconst PROCEED = 'contact-proceed';\n\nconst validation = {\n givenName: validationMethods.requiredName,\n surname: validationMethods.requiredName,\n street: validationMethods.requiredStreet,\n street2: validationMethods.requiredStreet2,\n postalCode: validationMethods.requiredZip,\n city: validationMethods.requiredCity,\n};\n\nexport interface PartialAddressValidation {\n givenName: boolean;\n surname: boolean;\n street: boolean;\n street2: boolean;\n postalCode: boolean;\n city: boolean;\n}\n\ninterface AddressState {\n value: IAddress;\n validation: PartialAddressValidation;\n interact: PartialAddressValidation;\n}\n\nconst initalState = (address?: IAddress): AddressState => {\n const value = {\n givenName: address?.givenName || '',\n surname: address?.surname || '',\n street: address?.street || '',\n street2: address?.street2 || '',\n postalCode: address?.postalCode || '',\n city: address?.city || '',\n };\n return {\n value,\n validation: {\n givenName: validation.givenName(value.givenName),\n surname: validation.surname(value.surname),\n street: validation.street(value.street),\n street2: validation.street2(value.street2),\n postalCode: validation.postalCode(value.postalCode),\n city: validation.city(value.city),\n },\n interact: {\n givenName: false,\n surname: false,\n street: false,\n street2: false,\n postalCode: false,\n city: false,\n },\n };\n};\n\ninterface FullAddressFormProps {\n readonly store: WaykeStore;\n readonly lastStage: boolean;\n}\n\nclass FullAddressForm extends HtmlNode {\n private readonly props: FullAddressFormProps;\n private state: AddressState;\n private contexts: {\n givenName?: InputField;\n surname?: InputField;\n street?: InputField;\n street2?: InputField;\n postalCode?: InputField;\n city?: InputField;\n button?: ButtonArrowRight;\n } = {};\n\n constructor(element: HTMLElement, props: FullAddressFormProps) {\n super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n this.props = props;\n\n const state = this.props.store.getState();\n this.state = initalState(state.address);\n\n this.render();\n }\n\n private onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof PartialAddressValidation;\n\n const value = currentTarget.value;\n this.state.value[name] = value;\n this.state.validation[name] = validation[name](value);\n\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private onBlur(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof PartialAddressValidation;\n\n this.state.interact[name] = true;\n this.state.validation[name] = validation[name](this.state.value[name]);\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private updateUiError(name: keyof Omit<IAddress, 'name' | 'distance'>) {\n this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n }\n\n private updateProceedButton() {\n this.contexts.button?.disabled(\n !this.state.validation.givenName ||\n !this.state.validation.surname ||\n !this.state.validation.street ||\n !this.state.validation.street2 ||\n !this.state.validation.postalCode ||\n !this.state.validation.city\n );\n }\n\n private onProceed() {\n ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_ADDRESS_SET, EcomStep.CUSTOMER_ADDRESS);\n\n setAddress(\n {\n givenName: this.state.value.givenName.trim(),\n surname: this.state.value.surname.trim(),\n name: `${this.state.value.givenName.trim()} ${this.state.value.surname.trim()}`,\n street: this.state.value.street.trim(),\n street2: this.state.value.street2.trim(),\n postalCode: this.state.value.postalCode.trim(),\n city: this.state.value.city.trim(),\n },\n this.props.lastStage\n )(this.props.store.dispatch);\n }\n\n private onChangeAddress() {\n ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_ADDRESS_EDIT, EcomStep.CUSTOMER_ADDRESS);\n goTo('main', 2)(this.props.store.dispatch);\n }\n\n render() {\n const subStage = this.props.store.getState().navigation.subStage;\n\n if (subStage > 2) {\n const keyValueItems: { key: string; value: string }[] = [\n { key: i18next.t('customer.givenName'), value: this.state.value.givenName },\n { key: i18next.t('customer.surname'), value: this.state.value.surname },\n { key: i18next.t('customer.street'), value: this.state.value.street },\n { key: i18next.t('customer.street2'), value: this.state.value.street2 },\n { key: i18next.t('customer.postalCode'), value: this.state.value.postalCode },\n { key: i18next.t('customer.city'), value: this.state.value.city },\n ];\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <ul class=\"waykeecom-key-value-list\">\n ${keyValueItems.map((kv) => KeyValueListItem(kv)).join('')}\n </ul>\n </div>\n `;\n\n if (subStage <= 2) {\n this.node.innerHTML += `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-align waykeecom-align--end\">\n <button type=\"button\" title=\"${i18next.t('customer.changeContactsButton')}\" class=\"waykeecom-link\" id=\"change-address\">${i18next.t('customer.changeContactsButton')}</button>\n </div>\n </div>\n `;\n }\n } else {\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('customer.contactInfoTitle')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('customer.contactInfoDescription')}</p>\n </div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${GIVENNAME_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${SURNAME_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${STREET_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${STREET2_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${POSTALCODE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CITY_NODE}\"></div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>\n `;\n\n this.contexts.givenName = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${GIVENNAME_NODE}`),\n {\n title: i18next.t('customer.givenName'),\n value: this.state.value.givenName,\n id: GIVENNAME_INPUT_ID,\n error: this.state.interact.givenName && !this.state.validation.givenName,\n errorMessage: i18next.t('customer.givenNameErrorMessage'),\n name: 'givenName',\n autocomplete: 'text',\n placeholder: i18next.t('customer.givenNamePlaceholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.surname = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${SURNAME_NODE}`),\n {\n title: i18next.t('customer.surname'),\n value: this.state.value.surname,\n id: SURNAME_INPUT_ID,\n error: this.state.interact.surname && !this.state.validation.surname,\n errorMessage: i18next.t('customer.surnameErrorMessage'),\n name: 'surname',\n autocomplete: 'text',\n placeholder: i18next.t('customer.surnamePlaceholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.street = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${STREET_NODE}`),\n {\n title: i18next.t('customer.street'),\n value: this.state.value.street,\n id: STREET_INPUT_ID,\n error: this.state.interact.street && !this.state.validation.street,\n errorMessage: i18next.t('customer.streetErrorMessage'),\n name: 'street',\n autocomplete: 'text',\n placeholder: i18next.t('customer.streetPlaceholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.street2 = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${STREET2_NODE}`),\n {\n title: i18next.t('customer.street2'),\n value: this.state.value.street2,\n id: STREET2_INPUT_ID,\n error: this.state.interact.street2 && !this.state.validation.street2,\n errorMessage: i18next.t('customer.street2ErrorMessage'),\n name: 'street2',\n autocomplete: 'text',\n placeholder: i18next.t('customer.street2Placeholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.postalCode = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${POSTALCODE_NODE}`),\n {\n title: i18next.t('customer.postalCode'),\n value: this.state.value.postalCode,\n id: POSTALCODE_INPUT_ID,\n error: this.state.interact.postalCode && !this.state.validation.postalCode,\n errorMessage: i18next.t('customer.postalCodeErrorMessage'),\n name: 'postalCode',\n autocomplete: 'text',\n placeholder: i18next.t('customer.postalCodePlaceholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.city = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${CITY_NODE}`),\n {\n title: i18next.t('customer.city'),\n value: this.state.value.city,\n id: CITY_INPUT_ID,\n error: this.state.interact.city && !this.state.validation.city,\n errorMessage: i18next.t('customer.cityErrorMessage'),\n name: 'city',\n autocomplete: 'text',\n placeholder: i18next.t('customer.cityPlaceholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.button = new ButtonArrowRight(\n this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n {\n title: i18next.t('customer.proceedButton'),\n id: PROCEED,\n disabled: !(\n this.state.validation.givenName &&\n this.state.validation.surname &&\n this.state.validation.street &&\n this.state.validation.street2 &&\n this.state.validation.postalCode &&\n this.state.validation.city\n ),\n onClick: () => this.onProceed(),\n }\n );\n }\n\n this.node\n .querySelector('#change-address')\n ?.addEventListener('click', () => this.onChangeAddress());\n }\n}\n\nexport default FullAddressForm;\n", "import i18next from '@i18n';\nimport { Customer } from '../../../@types/Customer';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport KeyValueListItem, { KeyValueListItemProps } from '../../../Templates/KeyValueListItem';\nimport FullAddressBySocialId from './FullAddressBySocialId';\nimport FullAddressForm from './FullAddressForm';\n\ninterface FullAddressProps {\n readonly store: WaykeStore;\n readonly lastStage: boolean;\n readonly marketCode: MarketCode;\n}\nclass FullAddress extends HtmlNode {\n private readonly props: FullAddressProps;\n private state: Customer;\n\n constructor(element: HTMLDivElement, props: FullAddressProps) {\n super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n this.props = props;\n\n const state = this.props.store.getState();\n this.state = state.customer;\n\n this.render();\n }\n\n render() {\n const { store, lastStage } = this.props;\n const subStage = store.getState().navigation.subStage;\n if (subStage > 2) {\n const keyValueItems: KeyValueListItemProps[] = [\n { key: i18next.t('customer.socialId'), value: this.state.socialId },\n ];\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <ul class=\"waykeecom-key-value-list\">\n ${keyValueItems.map((kv) => KeyValueListItem(kv)).join('')}\n </ul>\n </div>\n `;\n } else if (this.props.marketCode === 'SE') {\n this.node.innerHTML = '';\n new FullAddressBySocialId(this.node, {\n store,\n lastStage,\n });\n } else {\n this.node.innerHTML = '';\n new FullAddressForm(this.node, {\n store,\n lastStage,\n });\n }\n }\n}\n\nexport default FullAddress;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { goTo } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ListItem from '../../../Templates/ListItem';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { maskSSn, maskText } from '../../../Utils/mask';\nimport EmailAndPhone from './EmailAndPhone';\nimport FullAddress from './FullAddress';\n\ninterface CustomerProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n readonly marketCode: MarketCode;\n}\n\nclass Customer extends HtmlNode {\n private readonly props: CustomerProps;\n\n constructor(element: HTMLElement, props: CustomerProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'navigation', () => {\n this.render();\n });\n\n this.render();\n }\n\n private onChange() {\n ecomEvent(EcomView.MAIN, EcomEvent.CUSTOMER_EDIT, EcomStep.CUSTOMER_EMAIL_AND_PHONE);\n goTo('main', this.props.index)(this.props.store.dispatch);\n }\n\n render() {\n const { store, index, lastStage } = this.props;\n const state = this.props.store.getState();\n\n const completed = state.topNavigation.stage > index;\n\n const active = state.navigation.stage === index && !state.createdOrderId;\n if (active) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CUSTOMER_ACTIVE,\n state.navigation.subStage === 1\n ? EcomStep.CUSTOMER_EMAIL_AND_PHONE\n : EcomStep.CUSTOMER_ADDRESS\n );\n }\n const content = ListItem(this.node, {\n completed,\n title: i18next.t('customer.title'),\n active,\n id: 'customer',\n index: index,\n });\n content.innerHTML = '';\n\n const part1 = document.createElement('div');\n part1.className = 'waykeecom-stack waykeecom-stack--2';\n const part2 = document.createElement('div');\n part2.className = 'waykeecom-stack waykeecom-stack--2';\n\n if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n const keyValueList: { key: string; value: string }[] = [\n { key: i18next.t('customer.email'), value: state.customer.email },\n { key: i18next.t('customer.phone'), value: state.customer.phone },\n ...(this.props.marketCode === 'SE'\n ? [{ key: i18next.t('customer.socialId'), value: maskSSn(state.customer.socialId) }]\n : []),\n ...(state.address\n ? [\n {\n key: i18next.t('customer.name'),\n value:\n this.props.marketCode === 'SE'\n ? `${maskText(state.address.givenName)} ${maskText(state.address.surname)}`\n : `${state.address.givenName} ${state.address.surname}`,\n },\n { key: i18next.t('customer.address'), value: state.address.street },\n { key: i18next.t('customer.postalCode'), value: state.address.postalCode },\n { key: i18next.t('customer.city'), value: state.address.city },\n ]\n : []),\n ];\n new StageCompleted(content, {\n keyValueList,\n changeButtonTitle: i18next.t('customer.changeButtonTitle'),\n onEdit: !state.createdOrderId ? () => this.onChange() : undefined,\n });\n } else if (state.navigation.stage === index) {\n new EmailAndPhone(content, { store });\n if (state.navigation.subStage > 1) {\n new FullAddress(content, { store, lastStage, marketCode: this.props.marketCode });\n }\n }\n if (state.navigation.stage === index) {\n content.parentElement?.scrollIntoView();\n }\n }\n}\n\nexport default Customer;\n", "import i18next from '@i18n';\nimport { DeliveryType } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputRadioField from '../../../Components/Input/InputRadioField';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { goTo, setHomeDelivery } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport Alert from '../../../Templates/Alert';\nimport ListItem from '../../../Templates/ListItem';\nimport { getTotalDeliveryCost } from '../../../Utils/delivery';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\n\nconst RADIO_HOME_TRUE = 'radio-home-delivery-true';\nconst RADIO_HOME_TRUE_NODE = `${RADIO_HOME_TRUE}-node`;\n\nconst RADIO_HOME_FALSE = 'radio-home-delivery-false';\nconst RADIO_HOME_FALSE_NODE = `${RADIO_HOME_FALSE}-node`;\n\nconst PROCEED = 'button-home-delivery-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\ninterface DeliveryProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n}\n\nclass Delivery extends HtmlNode {\n private readonly props: DeliveryProps;\n private homeDelivery: boolean;\n\n constructor(element: HTMLElement, props: DeliveryProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'navigation', () => {\n this.render();\n });\n\n const state = this.props.store.getState();\n this.homeDelivery = state.homeDelivery;\n this.render();\n }\n\n private onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const value = currentTarget.value === 'true';\n this.homeDelivery = value;\n ecomEvent(\n EcomView.MAIN,\n this.homeDelivery ? EcomEvent.DELIVERY_HOME_SELECTED : EcomEvent.DELIVERY_DEALER_SELECTED,\n EcomStep.DELIVERY\n );\n }\n\n private onProceed() {\n setHomeDelivery(this.homeDelivery, this.props.lastStage)(this.props.store.dispatch);\n ecomEvent(\n EcomView.MAIN,\n this.homeDelivery ? EcomEvent.DELIVERY_HOME_SET : EcomEvent.DELIVERY_DEALER_SET,\n EcomStep.DELIVERY\n );\n }\n\n private onEdit() {\n ecomEvent(EcomView.MAIN, EcomEvent.DELIVERY_EDIT, EcomStep.DELIVERY);\n goTo('main', this.props.index)(this.props.store.dispatch);\n }\n\n render() {\n const { store, index } = this.props;\n const state = store.getState();\n if (!state.order) throw 'Missing order...';\n\n const contactInformation = state.order.contactInformation;\n if (!contactInformation) throw 'Missing dealer contact information';\n\n const completed = state.topNavigation.stage > index;\n const active = state.navigation.stage === index;\n if (active) {\n ecomEvent(EcomView.MAIN, EcomEvent.DELIVERY_ACTIVE, EcomStep.DELIVERY);\n }\n const content = ListItem(this.node, {\n completed,\n title: i18next.t('delivery.title'),\n active,\n id: 'delivery',\n index: index,\n });\n\n if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n new StageCompleted(content, {\n keyValueList: [\n {\n key: i18next.t('delivery.deliveryMethod'),\n value: state.homeDelivery\n ? i18next.t('delivery.homeDelivery')\n : i18next.t('delivery.pickup'),\n },\n ],\n changeButtonTitle: i18next.t('delivery.changeDeliveryMethod'),\n onEdit: !state.createdOrderId ? () => this.onEdit() : undefined,\n });\n } else if (state.navigation.stage === index) {\n const part = document.createElement('div');\n part.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('delivery.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('delivery.description', { name: contactInformation.name })}</p>\n </div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <fieldset class=\"waykeecom-input-group\" role=\"radiogroup\" aria-required=\"true\" aria-label=\"${i18next.t('delivery.deliveryMethod')}\">\n <div class=\"waykeecom-input-group__item\" id=\"${RADIO_HOME_FALSE_NODE}\"></div>\n <div class=\"waykeecom-input-group__item\" id=\"${RADIO_HOME_TRUE_NODE}\"></div>\n </fieldset>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>\n `;\n\n const deliveryOptions = state.order.deliveryOptions;\n deliveryOptions.forEach((deliveryOption) => {\n const addressDistance = state.address?.distance;\n const totalDeliveryCost = getTotalDeliveryCost(addressDistance, deliveryOption) || 0;\n\n switch (deliveryOption.type) {\n case DeliveryType.Pickup:\n new InputRadioField(part.querySelector<HTMLInputElement>(`#${RADIO_HOME_FALSE_NODE}`), {\n id: RADIO_HOME_TRUE,\n name: 'homeDelivery',\n title: i18next.t('delivery.pickup'),\n value: 'false',\n description: `\n <div class=\"waykeecom-box\">\n <div class=\"waykeecom-icon-content\">\n <div class=\"waykeecom-icon-content__icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Location pin\"\n >\n <path d=\"M12.2 2C11.1.9 9.6.3 8 .3S4.9.9 3.8 2C2.6 3.2 2 4.7 2 6.3 2 9 5.3 12.9 7.3 15l.7.7.7-.7c2-2.1 5.3-6 5.3-8.7 0-1.6-.6-3.1-1.8-4.3zM8 12.8C5.5 10 4 7.6 4 6.3c0-1.1.4-2.1 1.2-2.9.7-.7 1.7-1.1 2.8-1.1 1.1 0 2.1.4 2.8 1.2.8.7 1.2 1.7 1.2 2.8 0 1.3-1.5 3.7-4 6.5zm2-6.5c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2z\" />\n </svg>\n </div>\n <div class=\"waykeecom-icon-content__content\">\n <div class=\"waykeecom-icon-content__label\">${contactInformation.name}</div>\n <div class=\"waykeecom-icon-content__meta\">\n ${contactInformation.address}, ${contactInformation.city}\n </div>\n </div>\n </div>\n </div>\n `,\n meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${\n totalDeliveryCost === 0\n ? i18next.t('delivery.free')\n : prettyNumber(totalDeliveryCost, {\n postfix: 'kr',\n })\n }</div>`,\n checked: !this.homeDelivery,\n onClick: (e) => this.onChange(e),\n });\n break;\n case DeliveryType.Delivery:\n const distance = state.address?.distance?.value || 0;\n const maxDistance = deliveryOption.unitPrice || 0;\n\n const tooFarAway = distance > maxDistance;\n\n new InputRadioField(part.querySelector<HTMLInputElement>(`#${RADIO_HOME_TRUE_NODE}`), {\n id: RADIO_HOME_FALSE,\n name: 'homeDelivery',\n title: i18next.t('delivery.homeDelivery'),\n value: 'true',\n disabled: tooFarAway,\n description: `<div class=\"waykeecom-box\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">${i18next.t('delivery.toYourAddress')}</div>\n ${\n tooFarAway\n ? `<div class=\"waykeecom-stack waykeecom-stack--2\">${Alert({\n tone: 'info',\n children: i18next.t('delivery.tooFarAway'),\n })}</div>`\n : ''\n }</div>`,\n meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${\n tooFarAway\n ? '-'\n : prettyNumber(totalDeliveryCost, {\n postfix: 'kr',\n })\n }</div>`,\n checked: this.homeDelivery,\n onClick: (e) => this.onChange(e),\n });\n break;\n default:\n break;\n }\n });\n\n new ButtonArrowRight(part.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`), {\n title: i18next.t('delivery.proceedButton'),\n id: PROCEED,\n onClick: () => this.onProceed(),\n });\n\n content.appendChild(part);\n if (state.navigation.stage === index) {\n content.parentElement?.scrollIntoView();\n }\n }\n }\n}\n\nexport default Delivery;\n", "import { IDeliveryOption, IDistance } from '@wayke-se/ecom';\n\nexport const getDeliveryDistance = (\n distance: IDistance | null | undefined,\n deliveryOption: IDeliveryOption\n) => {\n if (!distance) return undefined;\n\n if (distance.unit === 'm' && deliveryOption.unit === 'km')\n return Math.round(distance.value / 1000);\n\n if (distance.unit === 'km' && deliveryOption.unit === 'm') return distance.value * 1000;\n\n return distance.value;\n};\n\nexport const getTotalDeliveryCost = (\n distance: IDistance | null | undefined,\n deliveryOption: IDeliveryOption\n) => {\n const deliveryDistance = getDeliveryDistance(distance, deliveryOption);\n if (!deliveryDistance) return undefined;\n\n if (!deliveryOption.unitPrice) return undefined;\n\n return deliveryOption.startupCost + deliveryOption.unitPrice * deliveryDistance;\n};\n", "import i18next from '@i18n';\nimport { PaymentType } from '@wayke-se/ecom';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputRadioGroup, { RadioItem } from '../../../Components/Input/InputRadioGroup';\nimport { goTo, resetPaymentLookupResponse, setFinancial } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ListItem from '../../../Templates/ListItem';\nimport { Image } from '../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { formatShortDescription, prettyNumber } from '../../../Utils/format';\nimport { DISCLAIMER_WRAPPER_NODE } from './CreditAssessment';\nimport Loan from './Loan';\nimport StageCompletedFinancial from './StageCompletedFinancial';\nimport { extractLoanIndex, extractPaymentType } from './utils';\n\nconst PROCEED = 'button-financial-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst FINANCIAL_OPTION_ID = 'financial-option';\nconst FINANCIAL_OPTION_NODE = `${FINANCIAL_OPTION_ID}-node`;\n\nconst FINANCIAL_OPTION_SECOND_ID = 'financial-option-second';\nconst FINANCIAL_OPTION_SECOND_NODE = `${FINANCIAL_OPTION_SECOND_ID}-node`;\n\nconst RADIO_FINANCIAL_CASH = 'radio-financial-cash';\nconst RADIO_FINANCIAL_LOAN = 'radio-financial-loan';\nconst RADIO_FINANCIAL_LEASE = 'radio-financial-lease';\n\nconst PAYMENT_NODE = 'payment-node';\nconst PAYMENT_NODE_DISCLAIMER = DISCLAIMER_WRAPPER_NODE;\n\ninterface FinancialProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n readonly marketCode: MarketCode;\n}\n\nclass Financial extends HtmlNode {\n private readonly props: FinancialProps;\n private paymentType?: PaymentType;\n\n constructor(element: HTMLElement, props: FinancialProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'navigation', () => {\n const state = this.props.store.getState();\n this.paymentType = state.paymentType;\n this.render();\n });\n\n const state = this.props.store.getState();\n const { paymentType } = state;\n\n this.paymentType = paymentType;\n this.render();\n }\n\n private onChange(e: Event) {\n resetPaymentLookupResponse()(this.props.store.dispatch);\n const currentTarget = e.currentTarget as HTMLInputElement;\n const value = currentTarget.value as PaymentType;\n this.paymentType = value;\n\n this.render(true);\n const _paymentType = extractPaymentType(this.paymentType);\n\n switch (_paymentType) {\n case PaymentType.Cash:\n ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_CASH_SELECTED, EcomStep.FINANCIAL);\n break;\n case PaymentType.Lease:\n ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_LEASE_SELECTED, EcomStep.FINANCIAL);\n break;\n case PaymentType.Loan:\n ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_LOAN_SELECTED, EcomStep.FINANCIAL);\n default:\n break;\n }\n }\n\n private onProceed() {\n const _paymentType = extractPaymentType(this.paymentType);\n if (this.paymentType && _paymentType) {\n switch (_paymentType) {\n case PaymentType.Cash:\n ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_CASH_SET, EcomStep.FINANCIAL);\n break;\n case PaymentType.Lease:\n ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_LEASE_SET, EcomStep.FINANCIAL);\n break;\n case PaymentType.Loan:\n ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_LOAN_SET, EcomStep.FINANCIAL);\n default:\n break;\n }\n setFinancial(this.paymentType, this.props.lastStage)(this.props.store.dispatch);\n }\n }\n\n private onEdit() {\n ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_EDIT, EcomStep.FINANCIAL);\n goTo('main', this.props.index)(this.props.store.dispatch);\n }\n\n render(preventScrollIntoView?: boolean) {\n const state = this.props.store.getState();\n const { id, order, paymentLookupResponse } = state;\n if (!order) throw 'No order available';\n\n const paymentOptions = order.paymentOptions;\n\n const completed = state.topNavigation.stage > this.props.index;\n const content = ListItem(this.node, {\n completed,\n title: i18next.t('financial.heading'),\n active: state.navigation.stage === this.props.index,\n id: 'financial',\n index: this.props.index,\n });\n\n const part = document.createElement('div');\n\n const _paymentType = extractPaymentType(this.paymentType);\n if (\n (state.navigation.stage > this.props.index ||\n (completed && state.navigation.stage !== this.props.index)) &&\n _paymentType\n ) {\n const loan = paymentOptions.find((x) => x.type === PaymentType.Loan);\n new StageCompletedFinancial(content, {\n store: this.props.store,\n loan,\n paymentType: _paymentType,\n paymentLookupResponse: paymentLookupResponse || loan?.loanDetails,\n onEdit: !state.createdOrderId ? () => this.onEdit() : undefined,\n });\n } else if (state.navigation.stage === this.props.index) {\n const vehicle = state.order?.orderVehicle;\n const cash = paymentOptions.find((x) => x.type === PaymentType.Cash);\n const loans = paymentOptions.filter((x) => {\n switch (this.props.marketCode) {\n case 'NO':\n return x.type === PaymentType.Loan && !x.loanDetails?.shouldUseCreditScoring;\n default:\n return x.type === PaymentType.Loan;\n }\n });\n const lease = paymentOptions.find((x) => x.type === PaymentType.Lease);\n\n part.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('financial.howToFinance', { vehicleTitle: vehicle?.title, vehicleDescription: formatShortDescription(vehicle) })}</h4>\n </div>\n\n ${\n cash || !!loans.length\n ? `<div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${FINANCIAL_OPTION_NODE}\"></div>`\n : ''\n }\n ${\n lease\n ? `<div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${FINANCIAL_OPTION_SECOND_NODE}\"></div>`\n : ''\n }\n\n <div class=\"waykeecom-stack waykeecom-stack--3\" role=\"form\" id=\"${PAYMENT_NODE}\" aria-describedby=\"${PAYMENT_NODE_DISCLAIMER}\"></div>\n ${\n _paymentType !== PaymentType.Loan\n ? `<div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>`\n : ''\n }\n \n `;\n\n content.appendChild(part);\n\n const contactInformation = order.contactInformation;\n\n const firstGroupOptions: RadioItem[] = [];\n if (cash) {\n firstGroupOptions.push({\n id: RADIO_FINANCIAL_CASH,\n value: PaymentType.Cash,\n title: i18next.t('financial.cash'),\n description: `\n <div class=\"waykeecom-box\">\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <ul class=\"waykeecom-content__ul\">\n <li class=\"waykeecom-content__li\">${i18next.t('financial.cashDescription', { contactName: contactInformation?.name })}</li>\n </ul>\n </div>\n </div>`,\n meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(cash.price, {\n postfix: cash.unit,\n })}</div>`,\n });\n }\n\n loans.forEach((loan, index) => {\n const loanPrice = loan.price;\n const duration = loan.loanDetails?.durationSpec.default;\n const interest = loan.loanDetails?.interests.interest || NaN;\n const getCreditAmount = loan.loanDetails?.creditAmount || NaN;\n const shouldUseCreditScoring = loan.loanDetails?.shouldUseCreditScoring;\n\n firstGroupOptions.push({\n id: `${RADIO_FINANCIAL_LOAN}-${index}`,\n value: `${PaymentType.Loan}-${index}`,\n title: loan.name,\n description: `\n <div class=\"waykeecom-box\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <ul class=\"waykeecom-content__ul\">\n ${\n shouldUseCreditScoring\n ? `\n <li class=\"waykeecom-content__li\">\n <div>\n <span class=\"waykeecom-text waykeecom-text--valign-middle\">${i18next.t('financial.loanApplicationOnline')} </span>\n <img src=\"${Image.bankid}\" alt=\"BankID logotyp\" class=\"waykeecom-image waykeecom-image--inline\" aria-hidden=\"true\" />\n <span class=\"waykeecom-text waykeecom-text--valign-middle\">${i18next.t('financial.loanApplicationResponse')}</span>\n </div>\n </li>\n `\n : ''\n }\n <li class=\"waykeecom-content__li\">${i18next.t('financial.paymentAtContract', { contactName: contactInformation?.name })}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('financial.calculatedOn', { creditAmount: prettyNumber(getCreditAmount, { postfix: 'kr' }), duration, interest: prettyNumber(interest * 100, { decimals: 2 }) })}</li>\n </ul>\n </div>\n </div>\n ${\n loan.logo\n ? `<div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-align waykeecom-align--center\">\n <img src=\"${loan.logo}\" alt=\"${loan.name} logotyp\" class=\"waykeecom-image waykeecom-image--loan-logo\" />\n </div>\n </div>`\n : ''\n }\n </div>\n `,\n meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(loanPrice, {\n postfix: loan.unit,\n })}</div>`,\n });\n });\n\n if (cash || !!loans.length) {\n new InputRadioGroup(part.querySelector<HTMLDivElement>(`#${FINANCIAL_OPTION_NODE}`), {\n title: i18next.t('financial.buyCar'),\n checked: this.paymentType as string,\n name: 'paymentType',\n information: `\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <p class=\"waykeecom-content__p\">${i18next.t('financial.buyCarDescription')}</p>\n </div>\n `,\n footer:\n this.props.marketCode === 'SE'\n ? `\n <div class=\"waykeecom-box\" role=\"status\" aria-live=\"polite\">\n <div class=\"waykeecom-creditor-disclaimer\">\n <div class=\"waykeecom-creditor-disclaimer__icon\" aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"59\"\n height=\"53\"\n viewBox=\"0 0 59 53\"\n fill=\"none\"\n >\n <title>Varning</title>\n <path\n d=\"M29.5255 20.3569V30.5712M29.5255 40.7855H29.551M54.3173 43.3391L33.9335 7.58906C33.4891 6.80308 32.8445 6.14932 32.0657 5.69448C31.2868 5.23964 30.4015 5 29.5001 5C28.5986 5 27.7133 5.23964 26.9344 5.69448C26.1556 6.14932 25.5111 6.80308 25.0666 7.58906L4.68285 43.3391C4.23359 44.1188 3.99802 45.0038 4.00001 45.9042C4.002 46.8046 4.24148 47.6884 4.69417 48.4662C5.14687 49.244 5.79668 49.8879 6.57776 50.3329C7.35883 50.7778 8.2434 51.0079 9.14179 50.9998H49.9093C50.8034 50.9989 51.6815 50.7622 52.4554 50.3136C53.2294 49.865 53.8719 49.2202 54.3186 48.444C54.7652 47.6677 55.0002 46.7874 55 45.8913C54.9998 44.9953 54.7643 44.1151 54.3173 43.3391Z\"\n stroke=\"#A43333\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <div class=\"waykeecom-creditor-disclaimer__body\">\n <div class=\"waykeecom-creditor-disclaimer__heading\">Att l\u00E5na kostar pengar!</div>\n <p>\n Om du inte kan betala tillbaka skulden i tid riskerar du en betalningsanm\u00E4rkning. Det kan\n leda till sv\u00E5righeter att f\u00E5 hyra bostad, teckna abonnemang och f\u00E5 nya l\u00E5n. F\u00F6r st\u00F6d, v\u00E4nd\n dig till budget- och skuldr\u00E5dgivningen i din kommun. Kontaktuppgifter finns p\u00E5 \n <a\n href=\"https://www.konsumentverket.se/\"\n title=\"Konsumentverket\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n class=\"waykeecom-link waykeecom-link--no-external-icon\"\n >\n konsumentverket.se\n </a>.\n </p>\n </div>\n </div>\n </div>\n `\n : '',\n options: firstGroupOptions,\n onClick: (e) => this.onChange(e),\n onClickInformation: () => {\n ecomEvent(EcomView.MAIN, EcomEvent.FINANCIAL_INFORMATION_TOGGLE, EcomStep.FINANCIAL);\n },\n });\n }\n\n const secondGroupOptions: RadioItem[] = [];\n if (lease) {\n secondGroupOptions.push({\n id: RADIO_FINANCIAL_LEASE,\n title: i18next.t('financial.privateLeasing'),\n value: PaymentType.Lease,\n meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${i18next.t('financial.from')} ${prettyNumber(\n lease?.price,\n {\n postfix: lease.unit,\n }\n )}</div>`,\n });\n new InputRadioGroup(\n part.querySelector<HTMLDivElement>(`#${FINANCIAL_OPTION_SECOND_NODE}`),\n {\n title: i18next.t('financial.leaseCar'),\n checked: this.paymentType as string,\n name: 'paymentType',\n information: `\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <p class=\"waykeecom-content__p\">${i18next.t('financial.leaseCarDescription')}</p>\n </div>\n `,\n options: secondGroupOptions,\n onClick: (e) => this.onChange(e),\n }\n );\n }\n\n const paymentNode = part.querySelector<HTMLDivElement>(`#${PAYMENT_NODE}`);\n if (paymentNode) {\n const _paymentType = extractPaymentType(this.paymentType);\n const loanIndex = extractLoanIndex(this.paymentType);\n\n if (loans.length && _paymentType === PaymentType.Loan && loanIndex !== undefined) {\n new Loan(paymentNode, {\n store: this.props.store,\n loan: JSON.parse(JSON.stringify(loans[loanIndex])),\n vehicleId: id,\n paymentLookupResponse,\n onProceed: () => this.onProceed(),\n });\n } else {\n new ButtonArrowRight(part.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`), {\n title: i18next.t('financial.proceed'),\n id: PROCEED,\n disabled: !this.paymentType,\n onClick: () => this.onProceed(),\n });\n }\n }\n }\n\n if (!preventScrollIntoView && state.navigation.stage === this.props.index) {\n content.parentElement?.scrollIntoView();\n }\n }\n}\n\nexport default Financial;\n", "import { DrivingDistance } from '@wayke-se/ecom';\nimport { VehicleCondition } from '../@types/TradeIn';\n\nexport const Image = {\n bankid: 'https://cdn.wayke.se/public-assets/bankid-logo.svg',\n illustrations: {\n payment: 'https://cdn.wayke.se/public-assets/payment.svg',\n },\n};\n\nexport const translateTradeInCondition = {\n [VehicleCondition.VeryGood]: 'Mycket bra',\n [VehicleCondition.Good]: 'Bra',\n [VehicleCondition.Ok]: 'Ok',\n};\n\nexport const translateDrivingDistance = {\n [DrivingDistance.Between0And1000]: '0\u20131000 mil',\n [DrivingDistance.Between1000And1500]: '1000\u20131500 mil',\n [DrivingDistance.Between1500And2000]: '1500\u20132000 mil',\n [DrivingDistance.Between2000And2500]: '2000\u20132500 mil',\n [DrivingDistance.Over2500]: '2500+ mil',\n};\n", "import i18next from '@i18n';\nimport {\n AuthMethod,\n Employment,\n HousingType,\n ICreditAssessmentHouseholdEconomy,\n ICreditAssessmentInquiry,\n MaritalStatus,\n PaymentType,\n} from '@wayke-se/ecom';\nimport { ICreditAssessmentStatus } from '../../../@types/CreditAssessmentStatus';\nimport { PaymentOption } from '../../../@types/OrderOptions';\nimport { PaymentLookup } from '../../../@types/PaymentLookup';\nimport Accordion from '../../../Components/Accordion';\nimport BankIdSign from '../../../Components/BankId/BankIdSign';\nimport ButtonBankId from '../../../Components/Button/ButtonBankId';\nimport Disclaimer from '../../../Components/Disclaimer/Disclaimer';\nimport DisclaimerPadlock from '../../../Components/Disclaimer/DisclaimerPadlock';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport InputRadioGroup from '../../../Components/Input/InputRadioGroup';\nimport InputSelect from '../../../Components/Input/InputSelect';\nimport { creditAssessmentCancelSigning } from '../../../Data/creditAssessmentCancelSigning';\nimport { creditAssessmentDecline } from '../../../Data/creditAssessmentDecline';\nimport { creditAssessmentGetStatus } from '../../../Data/creditAssessmentGetStatus';\nimport { creditAssessmentNewCase } from '../../../Data/creditAssessmentNewCase';\nimport { creditAssessmentSignCase } from '../../../Data/creditAssessmentSignCase';\nimport { setCreditAssessmentResponse } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\nimport { convertCreditAssessmentStatusResponse } from '../../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport { registerInterval } from '../../../Utils/intervals';\nimport { isMobile } from '../../../Utils/isMobile';\nimport { createPortal, destroyPortal } from '../../../Utils/portal';\nimport { scrollTop } from '../../../Utils/scroll';\nimport { validationMethods } from '../../../Utils/validationMethods';\nimport CreditAssessmentResult from './CreditAssessmentResult';\nimport createTerm from './utils';\n\nconst MARITAL_STATUS = `credit-assessment-martial-status`;\nconst MARITAL_STATUS_NODE = `${MARITAL_STATUS}-node`;\n\nconst INCOME = `credit-assessment-income`;\nconst INCOME_NODE = `${INCOME}-node`;\n\nconst EMPLOYMENT = `credit-assessment-employment`;\nconst EMPLOYMENT_NODE = `${EMPLOYMENT}-node`;\n\nconst HOUSEHOLD_CHILDREN = `credit-assessment-household-children`;\nconst HOUSEHOLD_CHILDREN_NODE = `${HOUSEHOLD_CHILDREN}-node`;\n\nconst HOUSING_COST = `credit-assessment-housing-cost`;\nconst HOUSING_COST_NODE = `${HOUSING_COST}-node`;\n\nconst DEBT_SPECIFICATION_CARD_CREDIT = `credit-assessment-debt-specification-card-credit`;\nconst DEBT_SPECIFICATION_CARD_CREDIT_NODE = `${DEBT_SPECIFICATION_CARD_CREDIT}-node`;\n\nconst DEBT_SPECIFICATION_CAR_LOAN = `credit-assessment-debt-specification-car-loan`;\nconst DEBT_SPECIFICATION_CAR_LOAN_NODE = `${DEBT_SPECIFICATION_CAR_LOAN}-node`;\n\nconst DEBT_SPECIFICATION_COLLATERAL = `credit-assessment-debt-specification-collateral`;\nconst DEBT_SPECIFICATION_COLLATERAL_NODE = `${DEBT_SPECIFICATION_COLLATERAL}-node`;\n\nconst DEBT_SPECIFICATION_LEASING_FEES = `credit-assessment-debt-specification-leasing-fees`;\nconst DEBT_SPECIFICATION_LEASING_FEES_NODE = `${DEBT_SPECIFICATION_LEASING_FEES}-node`;\n\nconst DEBT_SPECIFICATION_PRIVATE_LOAN = `credit-assessment-debt-specification-private-loan`;\nconst DEBT_SPECIFICATION_PRIVATE_LOAN_NODE = `${DEBT_SPECIFICATION_PRIVATE_LOAN}-node`;\n\nconst HOUSING_TYPE = `credit-assessment-housing-type`;\nconst HOUSING_TYPE_NODE = `${HOUSING_TYPE}-node`;\n\nconst PERFORM_APPLICATION = `credit-assessment-perform-application`;\nconst PERFORM_APPLICATION_NODE = `${PERFORM_APPLICATION}-node`;\n\nexport const DISCLAIMER_WRAPPER_NODE = `credit-assessment-disclaimer`;\nconst DISCLAIMER_NODE = `disclaimer-node`;\nconst DISCLAIMER_SAFE_NODE = `disclaimer-safe-node`;\n\nconst WHY_DESCRIPTION = `why-description-node`;\n\nexport interface CreditAssessmentHouseholdEconomyValidation {\n maritalStatus: boolean;\n income: boolean;\n employment: boolean;\n householdChildren: boolean;\n housingCost: boolean;\n 'debtSpecification.cardCredits': boolean;\n 'debtSpecification.vehicleLoan': boolean;\n 'debtSpecification.collateral': boolean;\n 'debtSpecification.leasingFees': boolean;\n 'debtSpecification.privateLoan': boolean;\n housingType: boolean;\n}\n\ninterface CreditAssessmentHouseholdEconomy {\n maritalStatus: string;\n income: string;\n employment: string;\n householdChildren: string;\n housingCost: string;\n 'debtSpecification.cardCredits': string;\n 'debtSpecification.vehicleLoan': string;\n 'debtSpecification.collateral': string;\n 'debtSpecification.leasingFees': string;\n 'debtSpecification.privateLoan': string;\n housingType: string;\n}\n\ninterface CreditAssessmentHouseholdEconomyState {\n value: CreditAssessmentHouseholdEconomy;\n validation: CreditAssessmentHouseholdEconomyValidation;\n interact: CreditAssessmentHouseholdEconomyValidation;\n}\n\nconst validation = {\n maritalStatus: validationMethods.requiredAssessmentMaritalStatus,\n income: validationMethods.requiredNumberGreaterOrEqualThanZero,\n employment: validationMethods.requiredAssessmentEmplyment,\n householdChildren: validationMethods.requiredNumberGreaterOrEqualThanZero,\n housingCost: validationMethods.requiredNumberGreaterOrEqualThanZero,\n 'debtSpecification.cardCredits': validationMethods.optionalNumberGreaterOrEqualThanZero,\n 'debtSpecification.vehicleLoan': validationMethods.optionalNumberGreaterOrEqualThanZero,\n 'debtSpecification.collateral': validationMethods.optionalNumberGreaterOrEqualThanZero,\n 'debtSpecification.leasingFees': validationMethods.optionalNumberGreaterOrEqualThanZero,\n 'debtSpecification.privateLoan': validationMethods.optionalNumberGreaterOrEqualThanZero,\n housingType: validationMethods.requiredHousingType,\n};\n\nconst mock: ICreditAssessmentHouseholdEconomy = {\n maritalStatus: MaritalStatus.Married,\n income: 50000,\n employment: Employment.FullTimeEmployed,\n householdChildren: -1,\n housingCost: 2000,\n debtSpecification: {\n cardCredits: 0,\n vehicleLoan: 0,\n collateral: 0,\n leasingFees: 0,\n privateLoan: 0,\n },\n housingType: HousingType.Apartment,\n};\n\nconst getMock = (): ICreditAssessmentHouseholdEconomy | undefined => {\n return location.hostname === 'localhost' ? { ...mock } : undefined;\n};\n\nconst initalState = (\n creditAssessmentHouseholdEconomy?: ICreditAssessmentHouseholdEconomy\n): CreditAssessmentHouseholdEconomyState => {\n const value: CreditAssessmentHouseholdEconomy = {\n maritalStatus: creditAssessmentHouseholdEconomy?.maritalStatus || '',\n income: creditAssessmentHouseholdEconomy?.income.toString() || '',\n employment: creditAssessmentHouseholdEconomy?.employment.toString() || '',\n householdChildren: creditAssessmentHouseholdEconomy?.householdChildren.toString() || '-1',\n housingCost: creditAssessmentHouseholdEconomy?.housingCost.toString() || '',\n 'debtSpecification.cardCredits':\n creditAssessmentHouseholdEconomy?.debtSpecification.cardCredits.toString() || '',\n 'debtSpecification.vehicleLoan':\n creditAssessmentHouseholdEconomy?.debtSpecification.vehicleLoan.toString() || '',\n 'debtSpecification.collateral':\n creditAssessmentHouseholdEconomy?.debtSpecification.collateral.toString() || '',\n 'debtSpecification.leasingFees':\n creditAssessmentHouseholdEconomy?.debtSpecification.leasingFees.toString() || '',\n 'debtSpecification.privateLoan':\n creditAssessmentHouseholdEconomy?.debtSpecification.privateLoan.toString() || '',\n housingType: creditAssessmentHouseholdEconomy?.housingType.toString() || '',\n };\n return {\n value,\n validation: {\n maritalStatus: validation.maritalStatus(value.maritalStatus),\n income: validation.income(value.income),\n employment: validation.employment(value.employment),\n householdChildren: validation.householdChildren(value.householdChildren),\n housingCost: validation.housingCost(value.housingCost),\n 'debtSpecification.cardCredits': validation['debtSpecification.cardCredits'](\n value['debtSpecification.cardCredits']\n ),\n 'debtSpecification.vehicleLoan': validation['debtSpecification.vehicleLoan'](\n value['debtSpecification.vehicleLoan']\n ),\n 'debtSpecification.collateral': validation['debtSpecification.collateral'](\n value['debtSpecification.collateral']\n ),\n 'debtSpecification.leasingFees': validation['debtSpecification.leasingFees'](\n value['debtSpecification.leasingFees']\n ),\n 'debtSpecification.privateLoan': validation['debtSpecification.privateLoan'](\n value['debtSpecification.privateLoan']\n ),\n housingType: validation.housingType(value.housingType),\n },\n interact: {\n maritalStatus: false,\n income: false,\n employment: false,\n householdChildren: false,\n housingCost: false,\n 'debtSpecification.cardCredits': false,\n 'debtSpecification.vehicleLoan': false,\n 'debtSpecification.collateral': false,\n 'debtSpecification.leasingFees': false,\n 'debtSpecification.privateLoan': false,\n housingType: false,\n },\n };\n};\n\ninterface CreditAssessmentProps {\n readonly store: WaykeStore;\n readonly loan: PaymentOption;\n readonly paymentLookupResponse: PaymentLookup;\n readonly onProceed: () => void;\n}\n\nclass CreditAssessment extends HtmlNode {\n private readonly props: CreditAssessmentProps;\n private state: CreditAssessmentHouseholdEconomyState;\n private bankidStatusInterval?: NodeJS.Timeout;\n private view: number = 1;\n private contexts: {\n maritalStatus?: InputRadioGroup;\n income?: InputField;\n employment?: InputRadioGroup;\n householdChildren?: InputSelect;\n householdIncome?: InputField;\n housingCost?: InputField;\n 'debtSpecification.cardCredits'?: InputField;\n 'debtSpecification.vehicleLoan'?: InputField;\n 'debtSpecification.collateral'?: InputField;\n 'debtSpecification.leasingFees'?: InputField;\n 'debtSpecification.privateLoan'?: InputField;\n housingType?: InputRadioGroup;\n performApplicationButton?: ButtonBankId;\n bankId?: BankIdSign;\n } = {};\n private caseError?: string;\n private bankidError = false;\n private signed = false;\n private creditAssessmentResponse?: ICreditAssessmentStatus;\n\n constructor(element: HTMLDivElement | undefined | null, props: CreditAssessmentProps) {\n super(element);\n this.props = props;\n this.state = initalState(getMock());\n\n this.render();\n }\n\n private onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof CreditAssessmentHouseholdEconomyValidation;\n\n const value = currentTarget.value;\n this.state.value[name] = value;\n this.state.validation[name] = validation[name](value);\n\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private onBlur(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof CreditAssessmentHouseholdEconomyValidation;\n\n this.state.interact[name] = true;\n this.state.validation[name] = validation[name](this.state.value[name]);\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private onChangeSelect(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as 'householdChildren';\n\n const value = currentTarget.value;\n this.state.value[name] = value;\n this.state.validation[name] = validation[name](value);\n\n this.updateProceedButton();\n }\n\n private onChangeRadio(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as keyof Omit<\n CreditAssessmentHouseholdEconomyValidation,\n | 'income'\n | 'householdIncome'\n | 'housingCost'\n | 'householdChildren'\n | 'debtSpecification.cardCredits'\n | 'debtSpecification.vehicleLoan'\n | 'debtSpecification.collateral'\n | 'debtSpecification.leasingFees'\n | 'debtSpecification.privateLoan'\n >;\n\n const value = currentTarget.value;\n this.state.value[name] = value;\n this.state.validation[name] = validation[name](value);\n\n if (name === 'housingType') {\n if ((currentTarget.value as HousingType) === HousingType.SingleFamily) {\n this.state.value.housingCost = '0';\n this.state.validation.housingCost = validation.housingCost(this.state.value.housingCost);\n } else {\n this.state.value.housingCost = '';\n this.state.validation.housingCost = validation.housingCost(this.state.value.housingCost);\n }\n this.render();\n }\n\n this.updateProceedButton();\n }\n\n private updateUiError(name: keyof CreditAssessmentHouseholdEconomyValidation) {\n this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n }\n\n private updateProceedButton() {\n this.contexts.performApplicationButton?.disabled(\n !this.state.validation.maritalStatus ||\n !this.state.validation.income ||\n !this.state.validation.employment ||\n !this.state.validation.householdChildren ||\n !this.state.validation.housingCost ||\n !this.state.validation['debtSpecification.cardCredits'] ||\n !this.state.validation['debtSpecification.vehicleLoan'] ||\n !this.state.validation['debtSpecification.collateral'] ||\n !this.state.validation['debtSpecification.leasingFees'] ||\n !this.state.validation['debtSpecification.privateLoan'] ||\n !this.state.validation.housingType\n );\n }\n\n private async onAbort() {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_ABORTED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n const { store } = this.props;\n this.view = 1;\n if (this.bankidStatusInterval) {\n clearInterval(this.bankidStatusInterval);\n }\n\n const caseId = store.getState().caseId;\n if (caseId) {\n await creditAssessmentCancelSigning(caseId);\n await creditAssessmentDecline(caseId);\n setCreditAssessmentResponse()(store.dispatch);\n }\n destroyPortal();\n this.creditAssessmentResponse = undefined;\n this.render(true);\n }\n\n private bankIdStatus(caseId: string, method: AuthMethod, supressTracking = false) {\n if (!supressTracking) {\n ecomEvent(\n EcomView.MAIN,\n method === AuthMethod.SameDevice\n ? EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_REQUESTED\n : EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_REQUESTED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n }\n const loan = this.props.store\n .getState()\n .order?.paymentOptions.find((x) => x.type === PaymentType.Loan);\n this.bankidStatusInterval = setInterval(async () => {\n try {\n const response = await creditAssessmentGetStatus(caseId);\n const status = response.getStatus();\n if (!this.signed && status === 'signed') {\n ecomEvent(\n EcomView.MAIN,\n method === AuthMethod.SameDevice\n ? EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_STATUS_SAME_DEVICE_SUCCEEDED\n : EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_STATUS_QR_SUCCEEDED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n\n this.signed = true;\n this.contexts.bankId?.setTitle(\n i18next.t('creditAssessment.waitingFor', { name: loan?.name })\n );\n this.contexts.bankId?.setDescription(\n i18next.t('creditAssessment.fetchingInfo', { name: loan?.name })\n );\n this.contexts.bankId?.setFinalizing(true);\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_SIGNING_SIGNED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n }\n\n if (status === 'signingFailed') {\n clearInterval(this.bankidStatusInterval as NodeJS.Timeout);\n this.contexts.bankId?.setFinalizing(false);\n this.contexts.bankId?.setErrorMessage(i18next.t('creditAssessment.errorOccurred'));\n return;\n }\n\n if (response.isScored()) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_SIGNING_SCORED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n if (this.bankidStatusInterval) {\n clearInterval(this.bankidStatusInterval);\n }\n this.view = 3;\n this.creditAssessmentResponse = convertCreditAssessmentStatusResponse(response);\n setCreditAssessmentResponse(\n caseId,\n this.creditAssessmentResponse\n )(this.props.store.dispatch);\n destroyPortal();\n this.render();\n } else if (response.hasScoringError()) {\n clearInterval(this.bankidStatusInterval as NodeJS.Timeout);\n this.contexts.bankId?.setFinalizing(false);\n this.contexts.bankId?.setErrorMessage(i18next.t('creditAssessment.errorOccurred'));\n }\n if (!this.signed && method === AuthMethod.QrCode) {\n const qrCode = response.getQrCode() as string;\n this.contexts.bankId?.update(method, qrCode);\n }\n } catch (_e) {\n clearInterval(this.bankidStatusInterval as NodeJS.Timeout);\n this.contexts.bankId?.setFinalizing(false);\n this.contexts.bankId?.setErrorMessage(i18next.t('creditAssessment.bankIdStatusError'));\n }\n }, 1000);\n registerInterval('bankidStatusInterval-credit', this.bankidStatusInterval as unknown as number);\n }\n\n private async onStartBankIdAuth(method: AuthMethod, supressTracking = false) {\n const caseId = this.props.store.getState().caseId;\n if (!caseId) throw 'Missing caseID';\n if (this.bankidStatusInterval) {\n clearInterval(this.bankidStatusInterval);\n }\n\n try {\n if (!supressTracking) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_INIT_REQUESTED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n }\n this.contexts.bankId?.update(method);\n const response = await creditAssessmentSignCase({ caseId, method });\n if (!supressTracking) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_INIT_SUCCEEDED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n }\n this.bankIdStatus(caseId, method, supressTracking);\n\n if (method === AuthMethod.SameDevice) {\n const autoLaunchUrl = response.getAutoLaunchUrl() as string;\n this.contexts.bankId?.update(method, autoLaunchUrl);\n } else {\n const qrCode = response.getQrCode() as string;\n this.contexts.bankId?.update(method, qrCode);\n }\n } catch (_e) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_BANKID_INIT_FAILED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n if (this.bankidStatusInterval) {\n clearInterval(this.bankidStatusInterval);\n }\n this.bankidError = true;\n this.view = 1;\n destroyPortal();\n this.render(true);\n }\n }\n\n private async startBankId(method: AuthMethod) {\n const { store } = this.props;\n this.caseError = undefined;\n this.bankidError = false;\n this.signed = false;\n const currentCaseId = store.getState().caseId;\n if (this.bankidStatusInterval) {\n clearInterval(this.bankidStatusInterval);\n if (currentCaseId) {\n await creditAssessmentCancelSigning(currentCaseId);\n await creditAssessmentDecline(currentCaseId);\n setCreditAssessmentResponse()(store.dispatch);\n }\n }\n\n if (currentCaseId) {\n const caseId = await this.newCreditAssessmentCase();\n setCreditAssessmentResponse(caseId)(store.dispatch);\n this.onStartBankIdAuth(method);\n } else {\n try {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_CREATE_CASE_REQUESTED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n const caseId = await this.newCreditAssessmentCase();\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_CREATE_CASE_SUCCEEDED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n if (caseId) {\n setCreditAssessmentResponse(caseId)(store.dispatch);\n this.onStartBankIdAuth(method);\n }\n } catch (_e) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_CREDIT_SCORING_CREATE_CASE_FAILED,\n EcomStep.FINANCIAL_CREDIT_SCORING\n );\n }\n }\n }\n\n private async newCreditAssessmentCase() {\n try {\n const { store, loan, paymentLookupResponse: initialPaymentLookupResponse } = this.props;\n\n this.contexts.performApplicationButton?.disabled(true);\n const { customer, paymentLookupResponse: updatePaymentLookupResponse } = store.getState();\n\n const paymentLookupResponse = updatePaymentLookupResponse || initialPaymentLookupResponse;\n\n const { monthlyCost } = paymentLookupResponse.costs;\n const { interest } = paymentLookupResponse.interests;\n\n const downPayment = paymentLookupResponse.downPaymentSpec.current;\n const duration = paymentLookupResponse.durationSpec.current;\n const creditAmount = paymentLookupResponse.creditAmount;\n const price = paymentLookupResponse.price;\n const financialProductId = paymentLookupResponse.financialProductCode as string;\n\n const householdEconomy: ICreditAssessmentHouseholdEconomy = {\n employment: this.state.value.employment as Employment,\n householdChildren: parseInt(this.state.value.householdChildren, 10),\n housingCost: parseInt(this.state.value.housingCost || '0', 10),\n housingType: this.state.value.housingType as HousingType,\n income: parseInt(this.state.value.income || '0', 10),\n maritalStatus: this.state.value.maritalStatus as MaritalStatus,\n debtSpecification: {\n cardCredits: parseInt(this.state.value['debtSpecification.cardCredits'] || '0', 10),\n vehicleLoan: parseInt(this.state.value['debtSpecification.vehicleLoan'] || '0', 10),\n collateral: parseInt(this.state.value['debtSpecification.collateral'] || '0', 10),\n leasingFees: parseInt(this.state.value['debtSpecification.leasingFees'] || '0', 10),\n privateLoan: parseInt(this.state.value['debtSpecification.privateLoan'] || '0', 10),\n },\n };\n\n const assessmentCase: ICreditAssessmentInquiry = {\n customer: {\n ...customer,\n },\n householdEconomy,\n externalId: loan.externalId as string,\n loan: {\n downPayment,\n interestRate: interest,\n credit: creditAmount,\n financialProductId,\n monthlyCost,\n price,\n term: createTerm(duration),\n },\n };\n\n const response = await creditAssessmentNewCase(assessmentCase);\n return response.caseId;\n } catch (e) {\n if (this.bankidStatusInterval) {\n clearInterval(this.bankidStatusInterval);\n }\n this.caseError = (e as { message?: string })?.message || '';\n this.view = 1;\n this.render(true);\n return;\n } finally {\n this.contexts.performApplicationButton?.disabled(false);\n }\n }\n\n private render(scrollIntoView?: boolean) {\n const { store, paymentLookupResponse: initialPaymentLookupResponse, onProceed } = this.props;\n\n const mobile = isMobile();\n const { order, paymentLookupResponse: updatePaymentLookupResponse } = store.getState();\n const paymentLookupResponse = updatePaymentLookupResponse || initialPaymentLookupResponse;\n\n const loan = order?.paymentOptions.find((x) => x.type === PaymentType.Loan);\n const creditAmount = paymentLookupResponse.creditAmount;\n const branchName = order?.contactInformation?.name;\n if (this.view === 3 && this.creditAssessmentResponse) {\n new CreditAssessmentResult(createPortal(), {\n store,\n creditAssessmentResponse: this.creditAssessmentResponse,\n onProceed: () => {\n destroyPortal();\n onProceed();\n },\n onGoBack: () => this.onAbort(),\n });\n } else if (this.view === 2) {\n this.contexts.bankId = new BankIdSign(createPortal(), {\n method: mobile ? AuthMethod.SameDevice : AuthMethod.QrCode,\n descriptionQrCode: i18next.t('creditAssessment.descriptionQrCode'),\n descriptionSameDevice: i18next.t('creditAssessment.descriptionSameDevice'),\n onAbort: () => this.onAbort(),\n onStart: (method: AuthMethod) => this.startBankId(method),\n });\n scrollTop();\n } else {\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('creditAssessment.loanApplication')}</h5>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('creditAssessment.loanApplicationDescription', { name: loan?.name })}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-balloon waykeecom-balloon--info\" id=\"${WHY_DESCRIPTION}\"></div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.maritalStatus')}</h5>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${MARITAL_STATUS_NODE}\"></div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.employment')}</h5>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${EMPLOYMENT_NODE}\"></div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.children')}</h5>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${HOUSEHOLD_CHILDREN_NODE}\"></div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.income')}</h5>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${INCOME_NODE}\"></div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.housingType')}</h5>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('creditAssessment.housingTypeDescription')}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${HOUSING_TYPE_NODE}\"></div>\n </div>\n\n ${\n this.state.value.housingType !== HousingType.SingleFamily\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.housingCost')}</h5>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${HOUSING_COST_NODE}\"></div>\n </div>\n `\n : ''\n }\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('creditAssessment.debtsAndLiabilities')}</h5>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('creditAssessment.debtsAndLiabilitiesDescription')}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_PRIVATE_LOAN_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_CAR_LOAN_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_LEASING_FEES_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_CARD_CREDIT_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DEBT_SPECIFICATION_COLLATERAL_NODE}\"></div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <hr class=\"waykeecom-separator\" />\n </div>\n\n <dl class=\"waykeecom-stack waykeecom-stack--3 waykeecom-text waykeecom-text--align-center\">\n <dt class=\"waykeecom-stack waykeecom-stack--1 waykeecom-text waykeecom-text--tone-alt waykeecom-text--size-small\">${i18next.t('creditAssessment.totalLoanAmount')}</dt>\n <dd class=\"waykeecom-stack waykeecom-stack--1 waykeecom-heading waykeecom-heading--2 waykeecom-no-margin\">${prettyNumber(creditAmount, { postfix: 'kr' })}</dd>\n </dl>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n ${Alert({\n tone: 'info',\n polite: true,\n children: i18next.t('creditAssessment.noPaymentInfo', { name: branchName }),\n })}\n </div>\n\n ${\n this.caseError\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n ${Alert({\n tone: 'error',\n children: i18next.t('creditAssessment.caseError', { caseError: this.caseError }),\n })}\n </div>\n `\n : ''\n }\n\n ${\n this.bankidError\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n ${Alert({\n tone: 'error',\n children: i18next.t('creditAssessment.bankIdError'),\n })}\n </div>\n `\n : ''\n }\n \n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${PERFORM_APPLICATION_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DISCLAIMER_WRAPPER_NODE}\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${DISCLAIMER_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${DISCLAIMER_SAFE_NODE}\"></div>\n </div>\n </div>\n `;\n\n this.contexts.maritalStatus = new InputRadioGroup(\n this.node.querySelector<HTMLDivElement>(`#${MARITAL_STATUS_NODE}`),\n {\n checked: this.state.value.maritalStatus as string,\n name: 'maritalStatus',\n options: [\n {\n id: `maritalStatus-${1}`,\n value: MaritalStatus.Married,\n title: i18next.t('creditAssessment.married'),\n },\n {\n id: `maritalStatus-${2}`,\n value: MaritalStatus.CommonLaw,\n title: i18next.t('creditAssessment.commonLaw'),\n },\n {\n id: `maritalStatus-${3}`,\n value: MaritalStatus.Single,\n title: i18next.t('creditAssessment.single'),\n },\n ],\n onClick: (e) => this.onChangeRadio(e),\n }\n );\n\n this.contexts.income = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${INCOME_NODE}`),\n {\n title: i18next.t('creditAssessment.incomePerMonth'),\n value: this.state.value.income,\n id: INCOME,\n error: this.state.interact.income && !this.state.validation.income,\n errorMessage: i18next.t('creditAssessment.incomeError'),\n name: 'income',\n autocomplete: 'off',\n unit: 'kr',\n placeholder: '',\n type: 'number',\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.employment = new InputRadioGroup(\n this.node.querySelector<HTMLDivElement>(`#${EMPLOYMENT_NODE}`),\n {\n checked: this.state.value.employment as string,\n name: 'employment',\n options: [\n {\n id: `employment-${1}`,\n value: Employment.FullTimeEmployed,\n title: i18next.t('creditAssessment.fullTimeEmployed'),\n },\n {\n id: `employment-${2}`,\n value: Employment.TemporarilyEmployed,\n title: i18next.t('creditAssessment.temporarilyEmployed'),\n },\n {\n id: `employment-${3}`,\n value: Employment.SelfEmployed,\n title: i18next.t('creditAssessment.selfEmployed'),\n },\n {\n id: `employment-${4}`,\n value: Employment.Retired,\n title: i18next.t('creditAssessment.retired'),\n },\n {\n id: `employment-${5}`,\n value: Employment.Student,\n title: i18next.t('creditAssessment.student'),\n },\n {\n id: `employment-${6}`,\n value: Employment.Other,\n title: i18next.t('creditAssessment.other'),\n },\n ],\n onClick: (e) => this.onChangeRadio(e),\n }\n );\n\n this.contexts.housingType = new InputRadioGroup(\n this.node.querySelector<HTMLDivElement>(`#${HOUSING_TYPE_NODE}`),\n {\n title: i18next.t('creditAssessment.housingType'),\n checked: this.state.value.housingType as string,\n name: 'housingType',\n options: [\n {\n id: `housingType-${1}`,\n value: HousingType.SingleFamily,\n title: i18next.t('creditAssessment.singleFamily'),\n },\n {\n id: `housingType-${2}`,\n value: HousingType.Condominium,\n title: i18next.t('creditAssessment.condominium'),\n },\n {\n id: `housingType-${3}`,\n value: HousingType.Apartment,\n title: i18next.t('creditAssessment.apartment'),\n },\n ],\n onClick: (e) => this.onChangeRadio(e),\n }\n );\n\n this.contexts.income = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${INCOME_NODE}`),\n {\n title: i18next.t('creditAssessment.incomePerMonth'),\n value: this.state.value.income,\n id: INCOME,\n error: this.state.interact.income && !this.state.validation.income,\n errorMessage: i18next.t('creditAssessment.incomeError'),\n name: 'income',\n autocomplete: 'off',\n placeholder: '',\n unit: 'kr',\n type: 'number',\n help: i18next.t('creditAssessment.incomeDescription'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.householdChildren = new InputSelect(\n this.node.querySelector<HTMLDivElement>(`#${HOUSEHOLD_CHILDREN_NODE}`),\n {\n title: i18next.t('creditAssessment.childrenUnder18'),\n value: this.state.value.householdChildren,\n name: 'householdChildren',\n error: this.state.interact.householdChildren && !this.state.validation.householdChildren,\n errorMessage: i18next.t('creditAssessment.childrenError'),\n options: [\n {\n value: '-1',\n title: i18next.t('creditAssessment.selectChildren'),\n disabled: true,\n },\n {\n value: '0',\n },\n {\n value: '1',\n },\n {\n value: '2',\n },\n {\n value: '3',\n },\n {\n value: '4',\n },\n {\n value: '5',\n },\n {\n value: '6',\n },\n {\n value: '7',\n },\n {\n value: '8',\n },\n {\n value: '9',\n },\n {\n value: '10',\n title: i18next.t('creditAssessment.tenOrMore'),\n },\n ],\n onChange: (e) => this.onChangeSelect(e),\n }\n );\n\n const housingCostNode = this.node.querySelector<HTMLDivElement>(`#${HOUSING_COST_NODE}`);\n if (housingCostNode) {\n this.contexts.housingCost = new InputField(housingCostNode, {\n title:\n this.state.value.housingType === HousingType.Condominium\n ? i18next.t('creditAssessment.myPartOfMonthlyFee')\n : this.state.value.housingType === HousingType.Apartment\n ? i18next.t('creditAssessment.myPartOfMonthlyRent')\n : i18next.t('creditAssessment.housingCost'),\n value: this.state.value.housingCost,\n id: HOUSING_COST,\n error: this.state.interact.housingCost && !this.state.validation.housingCost,\n errorMessage: i18next.t('creditAssessment.housingCostError'),\n name: 'housingCost',\n autocomplete: 'off',\n placeholder: '',\n unit: 'kr',\n type: 'number',\n min: 0,\n help: i18next.t('creditAssessment.excludingInterest'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n onClickInformation: () => {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_LOAN_HOUSEHOLD_DEBT_INFORMATION_TOGGLE,\n EcomStep.FINANCIAL\n );\n },\n });\n }\n\n this.contexts['debtSpecification.cardCredits'] = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_CARD_CREDIT_NODE}`),\n {\n title: i18next.t('creditAssessment.cardCredits'),\n value: this.state.value['debtSpecification.cardCredits'],\n id: DEBT_SPECIFICATION_CARD_CREDIT,\n error:\n this.state.interact['debtSpecification.cardCredits'] &&\n !this.state.validation['debtSpecification.cardCredits'],\n errorMessage: i18next.t('creditAssessment.cardCreditsError'),\n name: 'debtSpecification.cardCredits',\n autocomplete: 'off',\n placeholder: '',\n unit: 'kr',\n type: 'number',\n min: 0,\n help: i18next.t('creditAssessment.totalDebt'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n onClickInformation: () => {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_CARD_CREDIT_INFORMATION_TOGGLE,\n EcomStep.FINANCIAL\n );\n },\n }\n );\n\n this.contexts['debtSpecification.vehicleLoan'] = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_CAR_LOAN_NODE}`),\n {\n title: i18next.t('creditAssessment.vehicleLoan'),\n value: this.state.value['debtSpecification.vehicleLoan'],\n id: DEBT_SPECIFICATION_CAR_LOAN,\n error:\n this.state.interact['debtSpecification.vehicleLoan'] &&\n !this.state.validation['debtSpecification.vehicleLoan'],\n errorMessage: i18next.t('creditAssessment.vehicleLoanError'),\n name: 'debtSpecification.vehicleLoan',\n autocomplete: 'off',\n placeholder: '',\n unit: 'kr',\n type: 'number',\n min: 0,\n help: i18next.t('creditAssessment.totalDebt'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n onClickInformation: () => {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_CAR_LOAN_INFORMATION_TOGGLE,\n EcomStep.FINANCIAL\n );\n },\n }\n );\n\n this.contexts['debtSpecification.collateral'] = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_COLLATERAL_NODE}`),\n {\n title: i18next.t('creditAssessment.collateral'),\n value: this.state.value['debtSpecification.collateral'],\n id: DEBT_SPECIFICATION_COLLATERAL,\n error:\n this.state.interact['debtSpecification.collateral'] &&\n !this.state.validation['debtSpecification.collateral'],\n errorMessage: i18next.t('creditAssessment.collateralError'),\n name: 'debtSpecification.collateral',\n autocomplete: 'off',\n placeholder: '',\n unit: 'kr',\n type: 'number',\n min: 0,\n help: i18next.t('creditAssessment.totalAmount'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n onClickInformation: () => {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_COLLATERAL_INFORMATION_TOGGLE,\n EcomStep.FINANCIAL\n );\n },\n }\n );\n\n this.contexts['debtSpecification.leasingFees'] = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_LEASING_FEES_NODE}`),\n {\n title: i18next.t('creditAssessment.leasingFees'),\n value: this.state.value['debtSpecification.leasingFees'],\n id: DEBT_SPECIFICATION_LEASING_FEES,\n error:\n this.state.interact['debtSpecification.leasingFees'] &&\n !this.state.validation['debtSpecification.leasingFees'],\n errorMessage: i18next.t('creditAssessment.leasingFeesError'),\n name: 'debtSpecification.leasingFees',\n autocomplete: 'off',\n placeholder: '',\n unit: 'kr',\n type: 'number',\n min: 0,\n help: i18next.t('creditAssessment.totalAmount'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n onClickInformation: () => {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_LEASING_FEES_INFORMATION_TOGGLE,\n EcomStep.FINANCIAL\n );\n },\n }\n );\n\n this.contexts['debtSpecification.privateLoan'] = new InputField(\n this.node.querySelector<HTMLDivElement>(`#${DEBT_SPECIFICATION_PRIVATE_LOAN_NODE}`),\n {\n title: i18next.t('creditAssessment.privateLoan'),\n value: this.state.value['debtSpecification.privateLoan'],\n id: DEBT_SPECIFICATION_PRIVATE_LOAN,\n error:\n this.state.interact['debtSpecification.privateLoan'] &&\n !this.state.validation['debtSpecification.privateLoan'],\n errorMessage: i18next.t('creditAssessment.privateLoanError'),\n name: 'debtSpecification.privateLoan',\n autocomplete: 'off',\n placeholder: '',\n unit: 'kr',\n type: 'number',\n min: 0,\n help: i18next.t('creditAssessment.totalDebt'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n onClickInformation: () => {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_LOAN_DEBT_SPECIFICATION_PRIVATE_LOAN_INFORMATION_TOGGLE,\n EcomStep.FINANCIAL\n );\n },\n }\n );\n\n this.contexts.performApplicationButton = new ButtonBankId(\n this.node.querySelector<HTMLDivElement>(`#${PERFORM_APPLICATION_NODE}`),\n {\n title: i18next.t('creditAssessment.performLoanApplication'),\n id: PERFORM_APPLICATION,\n disabled: !(\n this.state.validation.maritalStatus &&\n this.state.validation.income &&\n this.state.validation.employment &&\n this.state.validation.householdChildren &&\n this.state.validation.housingCost\n ),\n onClick: () => {\n this.view = 2;\n this.render();\n },\n }\n );\n\n new Disclaimer(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_NODE}`), {\n text: i18next.t('creditAssessment.disclaimer', {\n name: loan?.name,\n privacyPolicyUrl: loan?.loanDetails?.privacyPolicyUrl,\n link: `<a href=\"${loan?.loanDetails?.privacyPolicyUrl}\" title=\"\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('creditAssessment.dataProtectionPolicy')}</a>`,\n interpolation: { escapeValue: false },\n }),\n });\n\n new DisclaimerPadlock(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_SAFE_NODE}`), {\n text: i18next.t('creditAssessment.disclaimerSafe'),\n });\n\n new Accordion(this.node.querySelector<HTMLDivElement>(`#${WHY_DESCRIPTION}`), {\n id: 'accordion-why-description',\n title: `\n <div class=\"waykeecom-hstack waykeecom-hstack--align-center waykeecom-hstack--spacing-1\">\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\" aria-hidden=\"true\">\n <div class=\"waykeecom-icon-backdrop waykeecom-icon-backdrop--info-alt\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Info\"\n >\n <path d=\"M7 6h2v8H7V6zm0-4v2h2V2H7z\" />\n </svg>\n </div>\n </div>\n <div class=\"waykeecom-hstack__item\">${i18next.t('creditAssessment.whyAnswer')}</div>\n </div>`,\n description: `<div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('creditAssessment.whyAnswerDescription', { name: loan?.name, link: `<a href=\"${loan?.loanDetails?.moneyLaunderingInformationURL}\" title=\"\" target=\"_blank\" rel=\"noopener norefferer\" class=\"waykeecom-link\">${i18next.t('creditAssessment.readMore')}</a>` })}</p>\n </div>`,\n onClick: () => {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_LOAN_KYC_INFORMATION_TOGGLE,\n EcomStep.FINANCIAL\n );\n },\n });\n\n if (scrollIntoView || this.caseError || this.bankidError) {\n this.node.querySelector(`#${PERFORM_APPLICATION_NODE}`)?.scrollIntoView();\n }\n }\n }\n}\n\nexport default CreditAssessment;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface AccordionProps {\n readonly id: string;\n readonly title: string;\n readonly description: string;\n readonly append?: boolean;\n readonly onClick?: () => void;\n}\n\nclass Accordion extends HtmlNode {\n private readonly props: AccordionProps;\n\n constructor(element: HTMLElement | null, props: AccordionProps) {\n super(element, props.append ? { htmlTag: 'div', className: 'waykeecom-accordion' } : undefined);\n this.props = props;\n\n this.render();\n }\n\n render() {\n const { title, description, onClick } = this.props;\n\n const content = `\n <input\n type=\"checkbox\"\n id=\"${this.props.id}\"\n class=\"waykeecom-accordion__checkbox\"\n />\n <label class=\"waykeecom-accordion__header\" for=\"${this.props.id}\">\n <div class=\"waykeecom-accordion__header-title\">${title}</div>\n <div class=\"waykeecom-accordion__header-icon\" aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Chevron down\"\n >\n <path d=\"M6.7 11.4 0 4.6l1.3-1.4L8 10.1l6.7-6.9L16 4.6l-6.7 6.9L8 12.8l-1.3-1.4z\" />\n </svg>\n </div>\n </label>\n <div class=\"waykeecom-accordion__body\">${description}</div>\n `;\n\n if (this.props.append) {\n this.node.innerHTML = content;\n }\n\n this.node.innerHTML = `\n ${content}\n `;\n\n if (onClick) {\n this.node.querySelector('input')?.addEventListener('click', () => onClick());\n }\n }\n}\n\nexport default Accordion;\n", "import { AuthMethod } from '@wayke-se/ecom';\nimport Loader from '../../Templates/Loader';\nimport { isMobile } from '../../Utils/isMobile';\nimport { scrollTop } from '../../Utils/scroll';\nimport ButtonAsLink from '../Button/ButtonAsLink';\nimport HtmlNode from '../Extension/HtmlNode';\nimport BankIdSignQrCode from './BankIdSignQrCode';\nimport BankIdSignSameDevice from './BankIdSignSameDevice';\n\nconst BANKID_START_NODE = `bankid-start-node`;\nconst BANKID_START = `bankid-start`;\n\nconst ABORT = 'bankid-abort';\nconst ABORT_NODE = `${ABORT}-node`;\n\nconst AUTH_METHOD_NODE = 'bankid-auth-method-node';\n\ninterface BankIdSignProps {\n qrCode?: string;\n autoLaunchUrl?: string;\n method: AuthMethod;\n errorMessage?: string;\n descriptionQrCode: string;\n descriptionSameDevice: string;\n info?: string;\n title?: string;\n description?: string;\n finalizing?: boolean;\n readonly onStart: (method: AuthMethod) => void;\n readonly onAbort: () => void;\n readonly onSameDeviceClick?: () => void;\n}\n\nclass BankIdSign extends HtmlNode {\n private readonly props: BankIdSignProps;\n\n constructor(element: HTMLElement, props: BankIdSignProps) {\n super(element);\n this.props = props;\n\n /**\n * setTimeout allows the instance to be created so that if onStart method fails,\n * it can access the instance method of setErrorMessage\n */\n setTimeout(() => {\n const mobile = isMobile();\n if (mobile) {\n this.props.onStart(AuthMethod.SameDevice);\n } else {\n this.props.onStart(AuthMethod.QrCode);\n }\n }, 1);\n\n this.render();\n scrollTop();\n }\n\n update(method: AuthMethod, value?: string) {\n this.props.errorMessage = undefined;\n this.props.method = method;\n switch (method) {\n case AuthMethod.QrCode:\n this.props.autoLaunchUrl = undefined;\n this.props.qrCode = value || this.props.qrCode;\n break;\n case AuthMethod.SameDevice:\n this.props.qrCode = undefined;\n this.props.autoLaunchUrl = value || this.props.autoLaunchUrl;\n break;\n default:\n break;\n }\n this.render();\n }\n\n setErrorMessage(errorMessage?: string) {\n this.props.errorMessage = errorMessage;\n this.render();\n }\n\n setInfo(info?: string) {\n if (info !== this.props.info) {\n this.props.info = info;\n this.render();\n }\n }\n\n setTitle(title?: string) {\n if (title !== this.props.title) {\n this.props.title = title;\n this.render();\n }\n }\n\n setDescription(description?: string) {\n if (description !== this.props.description) {\n this.props.description = description;\n this.render();\n }\n }\n\n setFinalizing(finalizing?: boolean) {\n if (finalizing !== this.props.finalizing) {\n this.props.finalizing = finalizing;\n this.render();\n }\n }\n\n render() {\n const {\n qrCode,\n autoLaunchUrl,\n method,\n errorMessage,\n descriptionQrCode,\n descriptionSameDevice,\n info,\n title,\n description,\n finalizing,\n onStart,\n onAbort,\n } = this.props;\n\n const methodTitle = title\n ? title\n : method === AuthMethod.QrCode\n ? '\u00D6ppna BankID och scanna QR-koden'\n : 'Skriv in din s\u00E4kerhetskod i BankID-appen';\n\n const methodDescription = description\n ? description\n : method === AuthMethod.QrCode\n ? descriptionQrCode\n : descriptionSameDevice;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-text waykeecom-text--align-center\">\n <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${methodTitle}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${methodDescription}</p>\n </div>\n </div>\n ${info ? ` <div class=\"waykeecom-stack waykeecom-stack--4\">${info}</div>` : ''}\n\n ${\n !finalizing\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${AUTH_METHOD_NODE}\"></div>\n `\n : `<div class=\"waykeecom-stack waykeecom-stack--4\">${Loader()}</div>`\n }\n <div class=\"waykeecom-stack waykeecom-stack--4\">\n ${\n !finalizing\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${BANKID_START_NODE}\"></div>\n `\n : ''\n }\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${ABORT_NODE}\"></div>\n </div>\n </div>\n `;\n\n if (!finalizing) {\n if (method === AuthMethod.SameDevice) {\n new BankIdSignSameDevice(this.node.querySelector<HTMLDivElement>(`#${AUTH_METHOD_NODE}`), {\n autoLaunchUrl,\n errorMessage,\n onClick: () => this.props?.onSameDeviceClick?.(),\n });\n } else if (method === AuthMethod.QrCode) {\n new BankIdSignQrCode(this.node.querySelector<HTMLDivElement>(`#${AUTH_METHOD_NODE}`), {\n qrCode,\n errorMessage,\n });\n }\n const toggleMethodTitle =\n method === AuthMethod.SameDevice\n ? 'Mitt BankID \u00E4r p\u00E5 en annan enhet'\n : '\u00D6ppna BankID p\u00E5 den h\u00E4r enheten';\n new ButtonAsLink(this.node.querySelector<HTMLDivElement>(`#${BANKID_START_NODE}`), {\n title: toggleMethodTitle,\n id: BANKID_START,\n onClick: () =>\n onStart(method === AuthMethod.SameDevice ? AuthMethod.QrCode : AuthMethod.SameDevice),\n });\n }\n\n new ButtonAsLink(this.node.querySelector<HTMLDivElement>(`#${ABORT_NODE}`), {\n title: 'Avbryt',\n id: ABORT,\n onClick: () => onAbort(),\n });\n }\n}\n\nexport default BankIdSign;\n", "export const isMobile = () =>\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n", "import Alert from '../../Templates/Alert';\nimport Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface BankIdSignQrCodeProps {\n readonly qrCode?: string;\n readonly errorMessage?: string;\n}\n\nclass BankIdSignQrCode extends HtmlNode {\n private readonly props: BankIdSignQrCodeProps;\n\n constructor(element: HTMLElement | null, props: BankIdSignQrCodeProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { qrCode, errorMessage } = this.props;\n if (errorMessage) {\n this.node.innerHTML = Alert({\n tone: 'error',\n children: errorMessage,\n });\n return;\n }\n\n this.node.innerHTML = `\n ${\n qrCode\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--4\">\n <div class=\"waykeecom-align waykeecom-align--center\">\n <img src=\"data:image/png;base64, ${qrCode}\" alt=\"BankID QR\" class=\"waykeecom-qr\" />\n </div>\n </div>`\n : ''\n }\n <div class=\"waykeecom-stack waykeecom-stack--4\">${Loader()}</div>`;\n }\n}\n\nexport default BankIdSignQrCode;\n", "// import Attach from '../Extension/Attach';\nimport Loader from '../../Templates/Loader';\nimport HtmlNode, { HtmlNodeSettings } from '../Extension/HtmlNode';\n\ninterface ButtonBankIdProps {\n readonly title: string;\n readonly id?: string;\n disabled?: boolean;\n loading?: boolean;\n readonly htmlNodesettings?: HtmlNodeSettings;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonBankId extends HtmlNode {\n private readonly props: ButtonBankIdProps;\n\n constructor(element: HTMLElement | null, props: ButtonBankIdProps) {\n super(element, props.htmlNodesettings);\n this.props = props;\n this.render();\n }\n\n disabled(disabled: boolean) {\n if (this.props.disabled !== disabled) {\n this.props.disabled = disabled;\n this.render();\n }\n }\n\n loading(loading: boolean) {\n if (this.props.loading !== loading) {\n this.props.loading = loading;\n this.props.disabled = loading;\n this.render();\n }\n }\n\n render() {\n const { title, id, disabled, loading, onClick } = this.props;\n this.node.innerHTML = `\n <button\n type=\"button\"\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n ${disabled && `disabled=\"\"`}\n class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--action\"\n >\n <span class=\"waykeecom-button__content\">\n ${\n loading\n ? Loader({ type: 'inline' })\n : `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"BankID\"\n >\n <path d=\"M4.6 11.3h-4c.1-.5 1.1-6.8 1.1-7.2h.7c.5 0 .9-.2 1.1-.6.2-.3.1-.7-.2-.9 0-.1-.1-.2-.1-.3 0-.2.4-.5.9-.5.3 0 .5.1.7.2.1 0 .1.1.1.2s-.2.3-.3.4c-.6.4-.5.8-.5 1 .1.3.6.5.9.5h.7L5 8.3c-.2 1.6-.4 2.8-.4 3zm-2.3 2.8c.4.1.5.4.5.7-.1.5-.5.8-1 .8H0l.4-2.8H2c.7 0 .9.4.8.7 0 .2-.2.4-.5.6zm-.4.6c0-.2-.1-.4-.4-.4h-.3l-.2.9h.3c.4 0 .5-.2.6-.5zm.1-1.1c0-.2-.1-.4-.4-.4h-.3l-.1.7h.3c.3 0 .5-.1.5-.3zm9.2 2h1l.4-2.8h-1l-.4 2.8zm-1.1-2.2-.8.7.2-1.4h-.8l-.4 2.8h.8l.2-1 .6 1H11l-.8-1.2 1-.9h-1.1zM5.3 15l-.2.6c-.4 0-.6 0-.7-.2-.2.1-.5.2-.7.2-.5 0-.6-.2-.6-.5 0-.1.1-.3.2-.4.3-.2.9-.3 1.2-.4 0-.2-.1-.3-.3-.3-.3 0-.5.1-.9.4l.1-.6c.3-.2.7-.4 1.1-.4.5 0 .9.2.8.7l-.1.6c-.1.3-.1.3.1.3zm-1-.4c-.2.1-.6.1-.7.4 0 .1.1.2.2.2s.3-.1.4-.1v-.2l.1-.3zm11.4-.4c-.1.6-.6 1.3-1.5 1.3h-1.6l.4-2.8h1.4c1.1.1 1.4.9 1.3 1.5zm-1.5-.7h-.3l-.2 1.5h.3c.5 0 .7-.2.8-.7 0-.5-.1-.8-.6-.8zm-6.8-.1c-.3 0-.5.1-.7.3v-.3h-.8l-.3 2.1h.8l.2-1.3c.1-.2.2-.2.4-.2s.2.1.2.3L7 15.5h.8l.2-1.3c.1-.5-.1-.8-.6-.8zm2.9-13h-4l-.5 3.4h.7c.4 0 .7-.2.9-.4.1-.1.1-.2.1-.2 0-.1-.1-.2-.2-.3-.3-.2-.4-.5-.4-.6v-.1c.1-.3.6-.7 1.2-.7.4 0 .7.1.9.3.2.1.2.4.2.6-.1.2-.4.4-.5.5-.4.3-.4.5-.3.6 0 .2.3.3.6.3h1c1.4 0 2.2.7 1.9 2.2-.2 1.4-1.3 2-2.6 2l-.5 3.3h.8c3.2 0 5.8-2.1 6.3-5.3.6-4-1.9-5.6-5.6-5.6z\"/>\n </svg>`\n }\n </span>\n <span class=\"waykeecom-button__content\">${title}</span>\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonBankId;\n", "import Alert from '../../Templates/Alert';\nimport Loader from '../../Templates/Loader';\nimport { Image } from '../../Utils/constants';\nimport ButtonBankId from '../Button/ButtonBankId';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface BankIdSignSameDeviceProps {\n readonly autoLaunchUrl?: string;\n readonly errorMessage?: string;\n onClick?: () => void;\n}\n\nclass BankIdSignSameDevice extends HtmlNode {\n private readonly props: BankIdSignSameDeviceProps;\n\n constructor(element: HTMLElement | null, props: BankIdSignSameDeviceProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { autoLaunchUrl, errorMessage } = this.props;\n if (errorMessage) {\n this.node.innerHTML = Alert({\n tone: 'error',\n children: errorMessage,\n });\n return;\n }\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--4\">\n <div class=\"waykeecom-align waykeecom-align--center\">\n <img src=\"${Image.bankid}\" alt=\"BankID logotyp\" class=\"waykeecom-image\" style=\"width: 130px\" />\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--4\">${Loader()}</div>\n `;\n\n new ButtonBankId(this.node, {\n title: '\u00D6ppna BankID',\n disabled: !autoLaunchUrl,\n onClick: () => {\n window.open(autoLaunchUrl, '_blank');\n if (this.props.onClick) {\n this.props.onClick();\n }\n },\n htmlNodesettings: {\n htmlTag: 'div',\n className: 'waykeecom-stack waykeecom-stack--4',\n },\n });\n }\n}\n\nexport default BankIdSignSameDevice;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface DisclaimerProps {\n readonly text: string;\n}\nclass Disclaimer extends HtmlNode {\n private readonly props: DisclaimerProps;\n\n constructor(element: HTMLElement | null, props: DisclaimerProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n this.node.innerHTML = `\n <div class=\"waykeecom-disclaimer\">\n <div class=\"waykeecom-disclaimer__text\">\n ${this.props.text}\n </div>\n </div>\n `;\n }\n}\n\nexport default Disclaimer;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputError from './InputError';\n\nexport interface SelectItem {\n value: string;\n title?: string;\n disabled?: boolean;\n}\n\ninterface InputSelectProps {\n readonly title: string;\n readonly name: string;\n readonly id?: string;\n error?: boolean;\n errorMessage?: string;\n readonly value?: string;\n readonly options: SelectItem[];\n readonly onChange: (e: Event) => void;\n}\n\nclass InputSelect extends HtmlNode {\n private readonly props: InputSelectProps;\n private contexts: {\n error?: InputError;\n } = {};\n\n constructor(element: HTMLElement | null, props: InputSelectProps) {\n super(element);\n\n this.props = props;\n this.render();\n }\n\n private updateBorder() {\n const border = this.node.querySelector('.waykeecom-input-text');\n if (border) {\n if (this.props.error) {\n border?.classList.add('waykeecom-input-text--has-error');\n } else {\n border?.classList.remove('waykeecom-input-text--has-error');\n }\n }\n }\n\n setError(error: boolean, errorMessage?: string) {\n this.props.error = error;\n if (errorMessage) {\n this.props.errorMessage = errorMessage;\n }\n this.updateBorder();\n this.contexts.error?.setError(error);\n }\n\n private render() {\n const { id, options, value, name, title, error, errorMessage, onChange } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-input-label\">\n <label for=\"wayke-estimated-mileage\" class=\"waykeecom-input-label__label\">${title}</label>\n </div>\n <select\n class=\"waykeecom-select\"\n id=\"wayke-estimated-mileage\"\n ${name ? `name=\"${name}\"` : ''}\n ${id ? `id=\"${id}\"` : ''}\n >\n ${options\n .map(\n (option) =>\n `<option\n value=\"${option.value}\"\n ${option.disabled ? `disabled` : ''}\n ${option.value === value ? `selected=\"selected\"` : ''}\n >${option.title || option.value}</option>`\n )\n .join('')}\n </select>\n `;\n\n this.updateBorder();\n if (errorMessage) {\n this.contexts.error = new InputError(this.node, {\n error,\n errorMessage,\n });\n }\n\n this.node.querySelector('select')?.addEventListener('change', (e) => onChange(e));\n }\n}\n\nexport default InputSelect;\n", "import { creditAssessment } from '@wayke-se/ecom';\n\nexport const creditAssessmentDecline = (caseId: string) => {\n const request = creditAssessment.decline(caseId);\n return request;\n};\n", "import { creditAssessment } from '@wayke-se/ecom';\n\nexport const creditAssessmentGetStatus = (caseId: string) => {\n const request = creditAssessment.getStatus(caseId);\n return request;\n};\n", "import { creditAssessment, ICreditAssessmentInquiry } from '@wayke-se/ecom';\n\nexport const creditAssessmentNewCase = (inquiry: ICreditAssessmentInquiry) => {\n const request = creditAssessment.newCase(inquiry);\n return request;\n};\n", "import { creditAssessment, ICreditAssessmentSignRequest } from '@wayke-se/ecom';\n\nexport const creditAssessmentSignCase = (creditAssessmentCase: ICreditAssessmentSignRequest) => {\n const request = creditAssessment.signCase(creditAssessmentCase);\n return request;\n};\n", "import { CreditAssessmentRecommendation } from '@wayke-se/ecom';\nimport { ICreditAssessmentStatus } from '../../../@types/CreditAssessmentStatus';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport CreditAssessmentApproved from './CreditAssessmentApproved';\nimport CreditAssessmentAssessManually from './CreditAssessmentAssessManually';\nimport CreditAssessmentRejected from './CreditAssessmentRejected';\n\ninterface CreditAssessmentResultProps {\n readonly store: WaykeStore;\n readonly creditAssessmentResponse: ICreditAssessmentStatus;\n readonly onProceed: () => void;\n readonly onGoBack: () => void;\n}\n\nclass CreditAssessmentResult extends HtmlNode {\n private readonly props: CreditAssessmentResultProps;\n constructor(element: HTMLElement, props: CreditAssessmentResultProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store, creditAssessmentResponse, onProceed, onGoBack } = this.props;\n const decision = creditAssessmentResponse.recommendation;\n\n if (decision === CreditAssessmentRecommendation.Approve) {\n new CreditAssessmentApproved(this.node, {\n store,\n onProceed: () => onProceed(),\n onGoBack: () => onGoBack(),\n });\n } else if (decision === CreditAssessmentRecommendation.AssessManually) {\n new CreditAssessmentAssessManually(this.node, {\n store,\n onProceed: () => onProceed(),\n onGoBack: () => onGoBack(),\n });\n } else {\n new CreditAssessmentRejected(this.node, {\n store,\n onGoBack: () => onGoBack(),\n });\n }\n }\n}\n\nexport default CreditAssessmentResult;\n", "import i18next from '@i18n';\nimport { CreditAssessmentRecommendation } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport StageCompletedFinancialCreditAssessment from './StageCompletedFinancialCreditAssessment';\n\nconst RESULT = 'assessment-approved-result';\nconst RESULT_NODE = `${RESULT}-node`;\n\nconst PROCEED = 'assessment-approved-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst ABORT = 'assessment-approved-abort';\nconst ABORT_NODE = `${ABORT}-node`;\n\ninterface CreditAssessmentApprovedProps {\n readonly store: WaykeStore;\n readonly onProceed: () => void;\n readonly onGoBack: () => void;\n}\n\nclass CreditAssessmentApproved extends HtmlNode {\n private readonly props: CreditAssessmentApprovedProps;\n constructor(element: HTMLElement, props: CreditAssessmentApprovedProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store, onProceed, onGoBack } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${RESULT_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--4\">\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${PROCEED_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${ABORT_NODE}\"></div>\n </div>\n `;\n\n new StageCompletedFinancialCreditAssessment(this.node.querySelector(`#${RESULT_NODE}`), {\n store,\n decision: CreditAssessmentRecommendation.Approve,\n });\n\n new ButtonArrowRight(this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`), {\n title: i18next.t('creditAssessment.proceedButton'),\n id: PROCEED,\n onClick: () => onProceed(),\n });\n\n new ButtonAsLink(this.node.querySelector(`#${ABORT_NODE}`), {\n title: i18next.t('creditAssessment.abortButton'),\n id: ABORT,\n onClick: () => onGoBack(),\n });\n }\n}\n\nexport default CreditAssessmentApproved;\n", "import i18next from '@i18n';\nimport { CreditAssessmentRecommendation, PaymentType } from '@wayke-se/ecom';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\n\ninterface StageCompletedFinancialCreditAssessmentProps {\n readonly store: WaykeStore;\n readonly decision: CreditAssessmentRecommendation;\n}\n\nclass StageCompletedFinancialCreditAssessment extends HtmlNode {\n private readonly props: StageCompletedFinancialCreditAssessmentProps;\n\n constructor(element: HTMLElement | null, props: StageCompletedFinancialCreditAssessmentProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store, decision } = this.props;\n const state = store.getState();\n const { order } = state;\n const loan = order?.paymentOptions.find((x) => x.type === PaymentType.Loan);\n const contactInformation = order?.contactInformation;\n\n if (decision === CreditAssessmentRecommendation.Approve) {\n this.node.innerHTML = `\n ${Alert({\n tone: 'success',\n children: `\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <p class=\"waykeecom-content__p\"><strong>${i18next.t('stageCompletedFinancialCreditAssessment.approved', { loanName: loan?.name })}</strong></p>\n <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.approvedDescription', { contactName: contactInformation?.name, contactPhone: contactInformation?.phone })}</p>\n </div>\n `,\n })}\n `;\n } else if (decision === CreditAssessmentRecommendation.AssessManually) {\n this.node.innerHTML = `\n ${Alert({\n tone: 'warning',\n children: `\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <p class=\"waykeecom-content__p\"><span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('stageCompletedFinancialCreditAssessment.assessManually')}</span></p>\n <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.assessManuallyDescription', { contactName: contactInformation?.name, contactPhone: contactInformation?.phone })}</p>\n </div>\n `,\n })}\n `;\n } else {\n this.node.innerHTML = `\n ${Alert({\n tone: 'error',\n children: `\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <p class=\"waykeecom-content__p\"><span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('stageCompletedFinancialCreditAssessment.declined')}</span></p>\n <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.declinedDescription')}</p>\n <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.declinedNextSteps')}</p>\n <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancialCreditAssessment.contactInfo', { contactName: contactInformation?.name, contactPhone: contactInformation?.phone })}</p>\n </div>\n `,\n })}\n `;\n }\n }\n}\n\nexport default StageCompletedFinancialCreditAssessment;\n", "import i18next from '@i18n';\nimport { CreditAssessmentRecommendation } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonClear from '../../../Components/Button/ButtonClear';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport StageCompletedFinancialCreditAssessment from './StageCompletedFinancialCreditAssessment';\n\nconst RESULT = 'assessment-assess-manually-result';\nconst RESULT_NODE = `${RESULT}-node`;\n\nconst PROCEED = 'assessment-assess-manually-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst ABORT = 'assessment-assess-manually-abort';\nconst ABORT_NODE = `${ABORT}-node`;\n\ninterface CreditAssessmentAssessManuallyProps {\n readonly store: WaykeStore;\n readonly onProceed: () => void;\n readonly onGoBack: () => void;\n}\n\nclass CreditAssessmentAssessManually extends HtmlNode {\n private readonly props: CreditAssessmentAssessManuallyProps;\n constructor(element: HTMLElement, props: CreditAssessmentAssessManuallyProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store, onProceed, onGoBack } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${RESULT_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--4\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${ABORT_NODE}\"></div>\n </div>\n `;\n\n new StageCompletedFinancialCreditAssessment(this.node.querySelector(`#${RESULT_NODE}`), {\n store,\n decision: CreditAssessmentRecommendation.AssessManually,\n });\n\n new ButtonArrowRight(this.node.querySelector(`#${PROCEED_NODE}`), {\n title: i18next.t('creditAssessment.proceedButton'),\n id: PROCEED,\n onClick: () => onProceed(),\n });\n\n new ButtonClear(this.node.querySelector(`#${ABORT_NODE}`), {\n title: i18next.t('creditAssessment.abortButton'),\n id: ABORT,\n onClick: () => onGoBack(),\n });\n }\n}\n\nexport default CreditAssessmentAssessManually;\n", "import i18next from '@i18n';\nimport { CreditAssessmentRecommendation } from '@wayke-se/ecom';\nimport Button from '../../../Components/Button/Button';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport StageCompletedFinancialCreditAssessment from './StageCompletedFinancialCreditAssessment';\n\nconst RESULT = 'assessment-rejected-result';\nconst RESULT_NODE = `${RESULT}-node`;\n\nconst ABORT = 'assessment-rejected-abort';\nconst ABORT_NODE = `${ABORT}-node`;\n\ninterface CreditAssessmentRejectedProps {\n readonly store: WaykeStore;\n readonly onGoBack: () => void;\n}\n\nclass CreditAssessmentRejected extends HtmlNode {\n private props: CreditAssessmentRejectedProps;\n constructor(element: HTMLElement, props: CreditAssessmentRejectedProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store, onGoBack } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${RESULT_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--4\" id=\"${ABORT_NODE}\"></div>\n `;\n\n new StageCompletedFinancialCreditAssessment(this.node.querySelector(`#${RESULT_NODE}`), {\n store,\n decision: CreditAssessmentRecommendation.Reject,\n });\n\n new Button(this.node.querySelector(`#${ABORT_NODE}`), {\n title: i18next.t('creditAssessment.abortButton'),\n id: ABORT,\n onClick: () => onGoBack(),\n });\n }\n}\n\nexport default CreditAssessmentRejected;\n", "import { PaymentType } from '@wayke-se/ecom';\n\nconst createTerm = (months: number) => {\n const isPositive = months > 0;\n const factorOf12 = months % 12 === 0;\n\n const isInvalid = !isPositive || !factorOf12;\n if (isInvalid) {\n throw new TypeError('Invalid months for creating creidt assessment term');\n }\n\n return `${months}months`;\n};\n\nexport default createTerm;\n\nexport const extractPaymentType = (s?: string): PaymentType | undefined => {\n if (!s) return undefined;\n const index = s.indexOf('-');\n if (index === -1) return s as PaymentType;\n return s.slice(0, index) as PaymentType;\n};\n\nexport const extractLoanIndex = (s?: string): number | undefined => {\n if (!s) return undefined;\n const index = s.indexOf('-');\n return parseInt(s.slice(index + 1), 10);\n};\n", "import Alert from '../../Templates/Alert';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ErrorAlertProps {\n error?: string | Element;\n}\n\nclass ErrorAlert extends HtmlNode {\n private readonly props: ErrorAlertProps;\n private error?: string | Element;\n\n constructor(element: HTMLElement | null, props: ErrorAlertProps) {\n super(element);\n this.props = props;\n this.error = props.error;\n\n this.render();\n }\n\n update(error?: string | Element) {\n this.error = error;\n this.render();\n }\n\n render() {\n if (!this.error) {\n this.node.innerHTML = '';\n return;\n }\n\n this.node.innerHTML = Alert({\n tone: 'error',\n children: this.error,\n });\n }\n}\n\nexport default ErrorAlert;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputInformation from './InputInformation';\n\nconst respectStep = (value: number, step?: number) => {\n if (!step) return value;\n\n return Math.round(value / step) * step;\n};\n\ninterface InputRangeProps {\n title: string;\n value: number;\n min: number;\n max: number;\n step?: number;\n name: string;\n id: string;\n information?: string;\n unit?: string;\n disabled?: boolean;\n onChange?: (e: Event) => void;\n onBlur?: (e: Event) => void;\n onClickInformation?: (visible: boolean) => void;\n}\n\nclass InputRange extends HtmlNode {\n private readonly props: InputRangeProps;\n private value: number;\n private inputFieldValue: number;\n private min: number;\n private max: number;\n private rangeSpan: number;\n private isDisabled?: boolean;\n private currentValueInPercentage: number;\n private contexts: {\n rangeSlider?: HTMLInputElement;\n } = {};\n\n constructor(element: HTMLDivElement | null, props: InputRangeProps) {\n super(element);\n\n this.props = props;\n this.value = props.value;\n this.min = props.min;\n this.max = props.max;\n this.isDisabled = props.disabled;\n this.inputFieldValue = this.value;\n this.rangeSpan = this.max - this.min;\n this.currentValueInPercentage = parseInt(\n (100 * ((this.value - this.min) / this.rangeSpan)).toString(),\n 10\n );\n\n this.render();\n }\n\n update(value: number, min: number, max: number) {\n this.value = value;\n this.inputFieldValue = value;\n this.min = min;\n this.max = max;\n this.rangeSpan = max - min;\n this.isDisabled = !this.rangeSpan;\n const percentage = parseInt((100 * ((this.value - min) / this.rangeSpan)).toString(), 10);\n this.currentValueInPercentage = !isNaN(percentage) ? percentage : 0;\n this.render();\n }\n\n disabled(disabled: boolean) {\n if (this.isDisabled !== disabled) {\n this.isDisabled = disabled;\n this.render();\n }\n }\n\n onOpenInformation() {\n const foldout = this.node.querySelector<HTMLDivElement>('.input-label__foldout');\n if (foldout) {\n foldout.style.display = '';\n }\n }\n\n onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n this.inputFieldValue = currentTarget.valueAsNumber;\n }\n\n onBlur(e: Event) {\n const inputFieldValueAsNumber = this.inputFieldValue;\n if (\n !isNaN(inputFieldValueAsNumber) &&\n inputFieldValueAsNumber >= this.min &&\n inputFieldValueAsNumber <= this.max\n ) {\n const modifiedNumberInRespectWithSteps = respectStep(\n inputFieldValueAsNumber,\n this.props.step\n );\n this.value = modifiedNumberInRespectWithSteps;\n if (this.props.onChange && e.currentTarget) {\n (e.currentTarget as HTMLInputElement).value = modifiedNumberInRespectWithSteps.toString();\n this.props.onChange(e);\n }\n\n this.inputFieldValue = this.value;\n this.currentValueInPercentage = parseInt(\n (100 * ((this.value - this.min) / this.rangeSpan)).toString(),\n 10\n );\n\n this.render();\n } else {\n this.inputFieldValue = this.value;\n this.updateInputField();\n }\n }\n\n onFocus(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n currentTarget.value = this.value.toString();\n }\n\n onInput(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n this.value = parseInt(currentTarget.value, 10);\n this.inputFieldValue = this.value;\n\n this.currentValueInPercentage = parseInt(\n (100 * ((this.value - this.min) / this.rangeSpan)).toString(),\n 10\n );\n\n this.updateInputField();\n this.updateRangeSliderColor(currentTarget);\n }\n\n updateRangeSliderColor(element?: HTMLInputElement) {\n const elem = element || this.node.querySelector<HTMLInputElement>(`#${this.props.id}`);\n if (elem) {\n elem.style.setProperty('--percentage', `${this.currentValueInPercentage}%`);\n }\n }\n\n updateInputField() {\n const inputField = this.node.querySelector<HTMLInputElement>(`#${this.props.id}-input`);\n if (inputField) {\n inputField.value = this.inputFieldValue.toString();\n }\n }\n\n render() {\n const { title, step, name, id, information, unit, onChange, onClickInformation } = this.props;\n const allowSlider = this.min !== this.max;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-input-label\">\n <label for=\"${id}\" class=\"waykeecom-input-label__label\">${title}</label>\n </div>\n <div role=\"range\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-input-text\">\n <input\n type=\"number\"\n pattern=\"[0-9]*\"\n id=\"${id}-input\"\n value=\"${this.inputFieldValue}\"\n name=\"${name}\"\n autocomplete=\"off\"\n class=\"waykeecom-input-text__input\"\n ${(step === 0 || this.isDisabled || !allowSlider) && `disabled=\"\"`}\n min=\"${this.min}\"\n max=\"${this.max}\"\n ${step !== undefined && `step=\"${step}\"`}\n />\n ${unit ? `<div class=\"waykeecom-input-text__unit\">${unit}</div>` : ''}\n </div>\n </div>\n ${\n allowSlider\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-input-range\">\n <input\n type=\"range\"\n id=\"${id}\"\n min=\"${this.min}\"\n max=\"${this.max}\"\n ${step !== undefined && `step=\"${step}\"`}\n value=\"${this.value}\"\n name=\"${name}\"\n class=\"waykeecom-input-range__input\"\n ${this.isDisabled && `disabled=\"\"`}\n />\n </div>\n </div>\n `\n : ''\n }\n </div>\n `;\n\n if (information) {\n new InputInformation(this.node.querySelector<HTMLElement>('.waykeecom-input-label'), {\n information,\n onClickInformation,\n });\n }\n\n if (allowSlider) {\n this.contexts.rangeSlider = this.node.querySelector<HTMLInputElement>(`#${id}`) || undefined;\n if (this.contexts.rangeSlider) {\n if (onChange) {\n this.contexts.rangeSlider.addEventListener('change', onChange);\n }\n this.contexts.rangeSlider.addEventListener('input', (e) => this.onInput(e));\n this.updateRangeSliderColor(this.contexts.rangeSlider);\n }\n\n const inputField = this.node.querySelector(`#${id}-input`);\n if (inputField) {\n inputField.addEventListener('change', (e) => this.onChange(e));\n inputField.addEventListener('blur', (e) => this.onBlur(e));\n }\n }\n }\n}\n\nexport default InputRange;\n", "import { payments } from '@wayke-se/ecom';\n\ninterface PaymentRequest {\n vehicleId: string;\n downPayment: number;\n duration: number;\n residual?: number;\n dealerId?: string;\n financialOptionId?: string;\n}\n\nexport const getPayment = ({\n vehicleId,\n dealerId,\n downPayment,\n duration,\n residual,\n financialOptionId,\n}: PaymentRequest) => {\n const request = payments\n .newLookupRequest()\n .forVehicle(vehicleId)\n .withDownPayment(downPayment)\n .withDuration(duration);\n\n if (financialOptionId) {\n request.withFinancialOptionId(financialOptionId);\n }\n\n if (residual !== undefined) {\n request.withResidualValue(residual);\n }\n\n if (dealerId !== undefined) {\n request.forDealer(dealerId);\n }\n\n return payments.lookupPayment(request.build());\n};\n", "import { Image } from '../../Utils/constants';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface PieChartProps {\n percentage: number;\n}\n\nclass PieChart extends HtmlNode {\n private props: PieChartProps;\n\n constructor(element: HTMLElement | null | undefined, props: PieChartProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n update(props: PieChartProps) {\n this.props = props;\n this.node\n .querySelector(`.waykeecom-pie-chart__chart-data`)\n ?.setAttribute('stroke-dasharray', `calc(${this.props.percentage} * 31.4 / 100) 31.4`);\n }\n\n render() {\n const { percentage } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-pie-chart\">\n <svg height=\"20\" width=\"20\" viewBox=\"0 0 20 20\" class=\"waykeecom-pie-chart__chart\">\n <circle r=\"10\" cx=\"10\" cy=\"10\" class=\"waykeecom-pie-chart__chart-data-base\" />\n <circle r=\"5\" cx=\"10\" cy=\"10\" fill=\"transparent\"\n stroke-width=\"10\"\n stroke-dasharray=\"calc(${percentage} * 31.4 / 100) 31.4\"\n transform=\"rotate(-90) translate(-20)\"\n class=\"waykeecom-pie-chart__chart-data waykeecom-pie-chart__chart-data--1\"\n id=\"loan-details-circle\"\n />\n </svg>\n <div class=\"waykeecom-pie-chart__overlay\">\n <img src=\"${Image.illustrations.payment}\" alt=\"Illustration av betalning\" class=\"waykeecom-pie-chart__illustration\" />\n </div>\n </div>\n `;\n }\n}\n\nexport default PieChart;\n", "import HtmlNode from '../../../Components/Extension/HtmlNode';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../../Utils/format';\n\ninterface LoanDetailsBasicProps {\n downPayment: number;\n creditAmount: number;\n downPaymentPercentage: number;\n creditAmountPercentage: number;\n}\n\nclass LoanDetailsBasic extends HtmlNode {\n private props: LoanDetailsBasicProps;\n\n constructor(element: HTMLElement | null | undefined, props: LoanDetailsBasicProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n update(props: LoanDetailsBasicProps) {\n this.props = props;\n this.render();\n }\n\n render() {\n const { downPayment, creditAmount, downPaymentPercentage, creditAmountPercentage } = this.props;\n this.node.innerHTML = `\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: `\n <div class=\"waykeecom-hstack waykeecom-hstack--spacing-1 waykeecom-hstack--align-center\">\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\" aria-hidden=\"true\">\n <div class=\"waykeecom-chart-indicator waykeecom-chart-indicator--secondary\"></div>\n </div>\n <div class=\"waykeecom-hstack__item\">\n Kontantinsats (${downPaymentPercentage} %)\n </div>\n </div>\n `,\n value: prettyNumber(downPayment, { postfix: 'kr' }),\n })}\n ${KeyValueListItem({\n key: `\n <div class=\"waykeecom-hstack waykeecom-hstack--spacing-1 waykeecom-hstack--align-center\">\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\" aria-hidden=\"true\">\n <div class=\"waykeecom-chart-indicator waykeecom-chart-indicator--primary\"></div>\n </div>\n <div class=\"waykeecom-hstack__item\">\n L\u00E5n (${creditAmountPercentage} %)\n </div>\n </div>\n `,\n value: prettyNumber(creditAmount, { postfix: 'kr' }),\n })}\n </ul>\n `;\n }\n}\n\nexport default LoanDetailsBasic;\n", "import i18next from '@i18n';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../../Utils/format';\n\nlet persistedShowDetails = false;\n\ninterface LoanDetailsDetailedProps {\n duration: number;\n administrationFee?: number;\n setupFee?: number;\n totalCreditCost: number;\n interest: number;\n effectiveInterest: number;\n publicUrl?: string;\n loanOrgName?: string;\n}\n\nclass LoanDetailsDetailed extends HtmlNode {\n private props: LoanDetailsDetailedProps;\n private showDetails = persistedShowDetails;\n\n constructor(element: HTMLElement | null | undefined, props: LoanDetailsDetailedProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n private onDetails(e: Event) {\n const value = (e.currentTarget as HTMLInputElement).checked;\n persistedShowDetails = value;\n this.showDetails = value;\n }\n\n update(props: LoanDetailsDetailedProps) {\n this.props = props;\n this.render();\n }\n\n render() {\n const {\n duration,\n administrationFee,\n setupFee,\n totalCreditCost,\n interest,\n effectiveInterest,\n publicUrl,\n loanOrgName,\n } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-accordion\">\n <input\n type=\"checkbox\"\n id=\"finance-details-accordion\"\n class=\"waykeecom-accordion__checkbox\"\n ${this.showDetails ? `checked=\"true\"` : ''}\n />\n <label class=\"waykeecom-accordion__header\" for=\"finance-details-accordion\" tabindex=\"0\" aria-label=\"${i18next.t('loanDetails.showDetails')}\">\n <div class=\"waykeecom-accordion__header-title\">${i18next.t('loanDetails.details')}</div>\n <div class=\"waykeecom-accordion__header-icon\" aria-hidden=\"true\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n class=\"waykeecom-icon\"\n data-icon=\"Chevron down\"\n >\n <path d=\"M6.7 11.4 0 4.6l1.3-1.4L8 10.1l6.7-6.9L16 4.6l-6.7 6.9L8 12.8l-1.3-1.4z\" />\n </svg>\n </div>\n </label>\n <div class=\"waykeecom-accordion__body\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('loanDetails.repaymentPeriod'),\n value: `${duration} ${i18next.t('loanDetails.months')}`,\n })}\n\n ${KeyValueListItem({\n key: i18next.t('loanDetails.interest'),\n value: prettyNumber(interest * 100, { postfix: '%', decimals: 2 }),\n })}\n\n ${KeyValueListItem({\n key: i18next.t('loanDetails.effectiveInterest'),\n value: prettyNumber(effectiveInterest * 100, { postfix: '%', decimals: 2 }),\n })}\n\n ${\n setupFee !== undefined &&\n KeyValueListItem({\n key: i18next.t('loanDetails.setupFee'),\n value: prettyNumber(setupFee, { postfix: 'kr' }),\n })\n }\n\n ${\n administrationFee !== undefined &&\n KeyValueListItem({\n key: i18next.t('loanDetails.administrationFee'),\n value: prettyNumber(administrationFee, { postfix: 'kr' }),\n })\n }\n ${KeyValueListItem({\n key: i18next.t('loanDetails.totalCreditCost'),\n value: prettyNumber(totalCreditCost, { postfix: 'kr' }),\n })}\n </ul>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-disclaimer-text\">\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <p class=\"waykeecom-content__p\">${i18next.t('loanDetails.disclaimerText1')}</p>\n <p class=\"waykeecom-content__p\">${i18next.t('loanDetails.disclaimerText2')}</p>\n </div>\n </div>\n </div>\n ${\n publicUrl\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <a\n href=\"${publicUrl}\"\n title=\"${i18next.t('loanDetails.moreInfo', { loanOrgName })}\"\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n class=\"waykeecom-link\"\n >\n ${i18next.t('loanDetails.moreInfo', { loanOrgName })}\n </a>\n </div>\n `\n : ''\n }\n </div>\n </div>\n </div>\n `;\n\n this.node.querySelector(`input`)?.addEventListener('click', (e) => this.onDetails(e));\n }\n}\n\nexport default LoanDetailsDetailed;\n", "import i18next from '@i18n';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../../Utils/format';\n\ninterface LoanDetailsMonthlyCostProps {\n monthlyCost: number;\n}\n\nclass LoanDetailsMonthlyCost extends HtmlNode {\n private props: LoanDetailsMonthlyCostProps;\n\n constructor(element: HTMLElement | null | undefined, props: LoanDetailsMonthlyCostProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n update(props: LoanDetailsMonthlyCostProps) {\n this.props = props;\n this.render();\n }\n\n render() {\n const { monthlyCost } = this.props;\n this.node.innerHTML = `\n <ul class=\"waykeecom-key-value-list waykeecom-key-value-list--large-value\">\n ${KeyValueListItem({\n key: i18next.t('loanDetailsMonthlyCost.monthlyCost'),\n value: prettyNumber(monthlyCost, {\n postfix: i18next.t('loanDetailsMonthlyCost.perMonth'),\n }),\n })}\n </ul>\n `;\n }\n}\n\nexport default LoanDetailsMonthlyCost;\n", "import i18next from '@i18n';\nimport { PaymentOption } from '../../../@types/OrderOptions';\nimport { PaymentLookup } from '../../../@types/PaymentLookup';\nimport PieChart from '../../../Components/Chart/PieChart';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { prettyNumber } from '../../../Utils/format';\nimport LoanDetailsBasic from './LoanDetailsBasic';\nimport LoanDetailsDetailed from './LoanDetailsDetailed';\nimport LoanDetailsMonthlyCost from './LoanDetailsMonthlyCost';\n\nconst LOAN_DETAILS_MONTHLY_COST_NODE = 'finance-details-monthly-cost';\nconst LOAN_DETAILS_PIE_CHART_NODE = 'finance-details-pie-chart-node';\nconst LOAN_DETAILS_BASIC_NODE = 'finance-details-basic';\nconst LOAN_DETAILS_DETAILED_NODE = 'finance-details-detailed';\n\ninterface LoanDetailsProps {\n paymentLookupResponse: PaymentLookup;\n loan: PaymentOption;\n}\n\nclass LoanDetails extends HtmlNode {\n private props: LoanDetailsProps;\n private contexts: {\n loanDetailsMontlyCost?: LoanDetailsMonthlyCost;\n pieChart?: PieChart;\n loanDetailsBasic?: LoanDetailsBasic;\n loanDetailsDetailed?: LoanDetailsDetailed;\n } = {};\n\n constructor(element: HTMLElement | null | undefined, props: LoanDetailsProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n private extractProps() {\n const { loan, paymentLookupResponse } = this.props;\n const { monthlyCost, totalCreditCost } = paymentLookupResponse.costs;\n const { interest, effectiveInterest } = paymentLookupResponse.interests;\n\n const downPayment = paymentLookupResponse.downPaymentSpec.current;\n const duration = paymentLookupResponse.durationSpec.current;\n const { administrationFee, setupFee } = paymentLookupResponse.fees;\n const creditAmount = paymentLookupResponse.creditAmount;\n\n const publicUrl = paymentLookupResponse.publicURL;\n\n const total = downPayment + creditAmount;\n const downPaymentPercentage = Math.round((downPayment / total) * 100);\n const creditAmountPercentage = Math.round((creditAmount / total) * 100);\n\n return {\n duration,\n downPayment,\n administrationFee,\n setupFee,\n totalCreditCost,\n interest,\n effectiveInterest,\n creditAmount,\n total,\n publicUrl,\n monthlyCost,\n loanOrgName: loan.name,\n loanOrgLogo: loan.logo,\n downPaymentPercentage,\n creditAmountPercentage,\n };\n }\n\n update(props: LoanDetailsProps) {\n this.props = props;\n\n const {\n duration,\n downPayment,\n administrationFee,\n setupFee,\n monthlyCost,\n totalCreditCost,\n interest,\n effectiveInterest,\n creditAmount,\n publicUrl,\n loanOrgName,\n downPaymentPercentage,\n creditAmountPercentage,\n } = this.extractProps();\n\n this.contexts.loanDetailsMontlyCost?.update({ monthlyCost });\n this.contexts.pieChart?.update({ percentage: creditAmountPercentage });\n this.contexts.loanDetailsBasic?.update({\n downPayment,\n creditAmount,\n downPaymentPercentage,\n creditAmountPercentage,\n });\n this.contexts.loanDetailsDetailed?.update({\n duration,\n administrationFee,\n setupFee,\n totalCreditCost,\n interest,\n effectiveInterest,\n publicUrl,\n loanOrgName,\n });\n }\n\n render() {\n const {\n duration,\n downPayment,\n administrationFee,\n setupFee,\n totalCreditCost,\n interest,\n effectiveInterest,\n creditAmount,\n publicUrl,\n loanOrgName,\n loanOrgLogo,\n monthlyCost,\n downPaymentPercentage,\n creditAmountPercentage,\n } = this.extractProps();\n\n const disclaimerText = i18next.t('loanDetails.disclaimerText', {\n interest: prettyNumber(interest * 100, { decimals: 2 }),\n effectiveInterest: prettyNumber(effectiveInterest * 100, { decimals: 2 }),\n });\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stepper__break\">\n <div class=\"waykeecom-shadow-box\">\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <img src=\"${loanOrgLogo}\" alt=\"${loanOrgName} logotyp\" class=\"waykeecom-image waykeecom-image--loan-logo\" />\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${LOAN_DETAILS_MONTHLY_COST_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-disclaimer-text\">${disclaimerText}</div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${LOAN_DETAILS_PIE_CHART_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${LOAN_DETAILS_BASIC_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <hr class=\"waykeecom-separator\" />\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${LOAN_DETAILS_DETAILED_NODE}\"></div>\n </div>\n </div>\n </div>\n `;\n\n this.contexts.loanDetailsMontlyCost = new LoanDetailsMonthlyCost(\n this.node.querySelector<HTMLElement>(`#${LOAN_DETAILS_MONTHLY_COST_NODE}`),\n {\n monthlyCost,\n }\n );\n\n this.contexts.pieChart = new PieChart(\n this.node.querySelector<HTMLElement>(`#${LOAN_DETAILS_PIE_CHART_NODE}`),\n {\n percentage: creditAmountPercentage,\n }\n );\n\n this.contexts.loanDetailsBasic = new LoanDetailsBasic(\n this.node.querySelector<HTMLElement>(`#${LOAN_DETAILS_BASIC_NODE}`),\n {\n downPayment,\n creditAmount,\n downPaymentPercentage,\n creditAmountPercentage,\n }\n );\n\n this.contexts.loanDetailsDetailed = new LoanDetailsDetailed(\n this.node.querySelector<HTMLElement>(`#${LOAN_DETAILS_DETAILED_NODE}`),\n {\n duration,\n administrationFee,\n setupFee,\n totalCreditCost,\n interest,\n effectiveInterest,\n publicUrl,\n loanOrgName,\n }\n );\n }\n}\n\nexport default LoanDetails;\n", "import i18next from '@i18n';\nimport { IPaymentRangeSpec } from '@wayke-se/ecom';\nimport { PaymentOption } from '../../../@types/OrderOptions';\nimport { PaymentLookup } from '../../../@types/PaymentLookup';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ErrorAlert from '../../../Components/ErrorAlert';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputRange from '../../../Components/Input/InputRange';\nimport { getPayment } from '../../../Data/getPayment';\nimport { setPaymentLookupResponse } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport { convertPaymentLookupResponse } from '../../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport CreditAssessment, { DISCLAIMER_WRAPPER_NODE } from './CreditAssessment';\nimport LoanDetails from './LoanDetails';\n\nconst DOWNPAYMENT_RANGE_NODE = 'downpayment-range-node';\nconst DOWNPAYMENT_RANGE = 'downpayment-range';\n\nconst DURATION_RANGE_NODE = 'duration-range-node';\nconst DURATION_RANGE = 'duration-range';\n\nconst RESIDUAL_RANGE_NODE = 'residual-range-node';\nconst RESIDUAL_RANGE = 'residual-range';\n\nconst LOAN_DETAILS_id = 'loan-details';\nconst LOAN_DETAILS_NODE = `${LOAN_DETAILS_id}-node`;\n\nconst CREDIT_ASSESMENT_NODE = 'credit-assessment-node';\n\nconst PROCEED = 'credit-assessment-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\nconst ERROR_NODE = 'loan-error-node';\n\ninterface PaymentState {\n vehicleId: string;\n dealerId: string;\n downPayment: IPaymentRangeSpec;\n duration: IPaymentRangeSpec;\n residual: IPaymentRangeSpec;\n financialOptionId?: string;\n}\n\ninterface LoanProps {\n readonly store: WaykeStore;\n readonly loan: PaymentOption;\n readonly vehicleId: string;\n readonly paymentLookupResponse?: PaymentLookup;\n readonly onProceed: () => void;\n}\n\ntype LoanNames = 'downPayment' | 'duration' | 'residual';\n\nclass Loan extends HtmlNode {\n private readonly props: LoanProps;\n private paymentState: PaymentState;\n private previousState: PaymentState;\n private paymentLookupResponse: PaymentLookup;\n private contexts: {\n downPayment?: InputRange;\n duration?: InputRange;\n residual?: InputRange;\n loanDetails?: LoanDetails;\n proceedButton?: ButtonArrowRight;\n errorAlert?: ErrorAlert;\n } = {};\n\n constructor(element: HTMLDivElement, props: LoanProps) {\n super(element);\n this.props = props;\n const loanDetails = this.props.loan.loanDetails;\n if (!loanDetails) throw 'err';\n this.paymentLookupResponse = this.props.paymentLookupResponse || loanDetails;\n\n this.paymentState = {\n vehicleId: this.props.vehicleId,\n dealerId: '',\n downPayment: this.paymentLookupResponse.downPaymentSpec,\n duration: this.paymentLookupResponse.durationSpec,\n residual: this.paymentLookupResponse.residualValueSpec,\n financialOptionId: this.paymentLookupResponse.financialOptionId,\n };\n this.previousState = JSON.parse(JSON.stringify(this.paymentState));\n\n this.render();\n }\n\n private async payment() {\n this.contexts.downPayment?.disabled(true);\n this.contexts.duration?.disabled(true);\n this.contexts.residual?.disabled(true);\n this.contexts.proceedButton?.disabled(true);\n try {\n const response = await getPayment({\n vehicleId: this.paymentState.vehicleId,\n downPayment: this.paymentState.downPayment.current,\n duration: this.paymentState.duration.current,\n residual: this.paymentState.residual?.current,\n financialOptionId: this.paymentState.financialOptionId,\n });\n this.previousState = JSON.parse(JSON.stringify(this.paymentState));\n this.paymentLookupResponse = convertPaymentLookupResponse(response);\n this.paymentState = {\n ...this.paymentState,\n downPayment: this.paymentLookupResponse.downPaymentSpec,\n duration: this.paymentLookupResponse.durationSpec,\n residual: this.paymentLookupResponse.residualValueSpec,\n financialOptionId: this.paymentLookupResponse.financialOptionId,\n };\n\n setPaymentLookupResponse(response)(this.props.store.dispatch);\n this.update();\n\n this.contexts.errorAlert?.update(undefined);\n this.contexts.downPayment?.update(\n this.paymentState.downPayment.current,\n this.paymentState.downPayment.min,\n this.paymentState.downPayment.max\n );\n this.contexts.residual?.update(\n parseInt(`${this.paymentState.residual.current * 100}`, 10),\n parseInt(`${this.paymentState.residual.min * 100}`, 10),\n parseInt(`${this.paymentState.residual.max * 100}`, 10)\n );\n this.contexts.duration?.update(\n this.paymentState.duration.current,\n this.paymentState.duration.min,\n this.paymentState.duration.max\n );\n } catch (_e) {\n this.contexts.errorAlert?.update(i18next.t('loan.errorOccurred'));\n this.contexts.downPayment?.disabled(false);\n this.contexts.duration?.disabled(false);\n this.contexts.residual?.disabled(false);\n\n /*Roll back to previous state */\n this.contexts.downPayment?.update(\n this.previousState.downPayment.current,\n this.previousState.downPayment.min,\n this.previousState.downPayment.max\n );\n\n this.contexts.residual?.update(\n parseInt(`${this.previousState.residual.current * 100}`, 10),\n parseInt(`${this.previousState.residual.min * 100}`, 10),\n parseInt(`${this.previousState.residual.max * 100}`, 10)\n );\n this.contexts.duration?.update(\n this.previousState.duration.current,\n this.previousState.duration.min,\n this.previousState.duration.max\n );\n } finally {\n this.contexts.downPayment?.disabled(false);\n this.contexts.duration?.disabled(false);\n this.contexts.residual?.disabled(false);\n this.contexts.proceedButton?.disabled(false);\n }\n }\n\n private onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as LoanNames;\n const value = currentTarget.value;\n currentTarget.value = value;\n this.paymentState[name].current =\n name === 'residual' ? parseInt(value, 10) / 100 : parseInt(value, 10);\n this.payment();\n }\n\n private update() {\n this.contexts.loanDetails?.update({\n loan: this.props.loan,\n paymentLookupResponse: this.paymentLookupResponse,\n });\n }\n\n render() {\n const { store, loan, onProceed } = this.props;\n const { order } = store.getState();\n const name = order?.contactInformation?.name;\n const shouldUseCreditScoring = loan.loanDetails?.shouldUseCreditScoring;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <hr class=\"waykeecom-separator\" />\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h5 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('loan.title')}</h5>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('loan.description', { name: loan?.name })}${\n shouldUseCreditScoring ? ` ${i18next.t('loan.creditScoringInfo', { name })}` : ''\n }</p>\n <p class=\"waykeecom-content__p\">${i18next.t('loan.instruction')}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${DOWNPAYMENT_RANGE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${DURATION_RANGE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${RESIDUAL_RANGE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${ERROR_NODE}\"></div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${LOAN_DETAILS_NODE}\"></div>\n </div>\n ${\n shouldUseCreditScoring\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${CREDIT_ASSESMENT_NODE}\"></div>\n `\n : `<div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_NODE}\"></div>`\n }\n `;\n\n this.contexts.downPayment = new InputRange(\n this.node.querySelector<HTMLDivElement>(`#${DOWNPAYMENT_RANGE_NODE}`),\n {\n title: i18next.t('loan.downPaymentTitle'),\n value: this.paymentState.downPayment.current,\n id: DOWNPAYMENT_RANGE,\n name: 'downPayment',\n onChange: (e) => this.onChange(e),\n min: this.paymentState.downPayment.min,\n max: this.paymentState.downPayment.max,\n unit: 'kr',\n information: `\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <p class=\"waykeecom-content__p\"><span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('loan.downPaymentInfoTitle')}</span></p>\n <p class=\"waykeecom-content__p\">${i18next.t('loan.downPaymentInfoDescription', { name })}</p>\n </div>\n `,\n onClickInformation: () => {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.FINANCIAL_LOAN_DOWNPAYMENT_INFORMATION_TOGGLE,\n EcomStep.FINANCIAL\n );\n },\n }\n );\n\n this.contexts.duration = new InputRange(\n this.node.querySelector<HTMLDivElement>(`#${DURATION_RANGE_NODE}`),\n {\n title: i18next.t('loan.durationTitle'),\n value: this.paymentState.duration.current,\n id: DURATION_RANGE,\n name: 'duration',\n onChange: (e) => this.onChange(e),\n min: this.paymentState.duration.min,\n max: this.paymentState.duration.max,\n step: this.paymentState.duration.step,\n unit: 'm\u00E5n',\n }\n );\n\n if (this.paymentState.residual) {\n this.contexts.residual = new InputRange(\n this.node.querySelector<HTMLDivElement>(`#${RESIDUAL_RANGE_NODE}`),\n {\n title: i18next.t('loan.residualTitle'),\n value: parseInt(`${this.paymentState.residual.current * 100}`, 10),\n id: RESIDUAL_RANGE,\n name: 'residual',\n onChange: (e) => this.onChange(e),\n min: parseInt(`${this.paymentState.residual.min * 100}`, 10),\n max: parseInt(`${this.paymentState.residual.max * 100}`, 10),\n step: parseInt(`${this.paymentState.residual.step * 100}`, 10),\n unit: '%',\n }\n );\n }\n\n this.contexts.errorAlert = new ErrorAlert(\n this.node.querySelector<HTMLDivElement>(`#${ERROR_NODE}`),\n {}\n );\n\n this.contexts.loanDetails = new LoanDetails(\n this.node.querySelector<HTMLDivElement>(`#${LOAN_DETAILS_NODE}`),\n {\n loan,\n paymentLookupResponse: this.paymentLookupResponse,\n }\n );\n\n if (shouldUseCreditScoring) {\n new CreditAssessment(this.node.querySelector<HTMLDivElement>(`#${CREDIT_ASSESMENT_NODE}`), {\n store,\n loan,\n paymentLookupResponse: this.paymentLookupResponse,\n onProceed: () => onProceed(),\n });\n } else {\n this.contexts.proceedButton = new ButtonArrowRight(\n this.node.querySelector<HTMLDivElement>(`#${PROCEED_NODE}`),\n {\n title: i18next.t('loan.proceedButton'),\n id: PROCEED,\n onClick: () => onProceed(),\n }\n );\n }\n }\n}\n\nexport default Loan;\n", "import i18next from '@i18n';\nimport { PaymentType } from '@wayke-se/ecom';\nimport { PaymentOption } from '../../../@types/OrderOptions';\nimport { PaymentLookup } from '../../../@types/PaymentLookup';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport KeyValueListItem, { KeyValueListItemProps } from '../../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../../Utils/format';\nimport StageCompletedFinancialCreditAssessment from './StageCompletedFinancialCreditAssessment';\n\nconst CREDIT_ASSESSMENT_RESULT = 'credit-assessment-result';\nconst CREDIT_ASSESSMENT_RESULT_NODE = `${CREDIT_ASSESSMENT_RESULT}-node`;\n\ninterface StageCompletedFinancialProps {\n readonly store: WaykeStore;\n readonly loan?: PaymentOption;\n readonly paymentLookupResponse?: PaymentLookup;\n readonly paymentType: PaymentType;\n readonly onEdit?: () => void;\n}\n\nclass StageCompletedFinancial extends HtmlNode {\n private readonly props: StageCompletedFinancialProps;\n\n constructor(element: HTMLDivElement, props: StageCompletedFinancialProps) {\n super(element, { htmlTag: 'div' });\n this.props = props;\n this.render();\n }\n\n render() {\n const { store, paymentType, loan, paymentLookupResponse, onEdit } = this.props;\n const loanDetails = loan?.loanDetails;\n\n if (paymentType === PaymentType.Loan) {\n const state = this.props.store.getState();\n const currentPaymentLookupResponse = paymentLookupResponse || loanDetails;\n if (!loanDetails || !currentPaymentLookupResponse) throw 'Missing loan';\n\n const downPayment = currentPaymentLookupResponse.downPaymentSpec.current;\n const creditAmount = currentPaymentLookupResponse.creditAmount;\n const duration = currentPaymentLookupResponse.durationSpec.current;\n const { interest, effectiveInterest } = currentPaymentLookupResponse.interests;\n const { monthlyCost } = currentPaymentLookupResponse.costs;\n\n const keyValueList: KeyValueListItemProps[] = [\n {\n key: i18next.t('stageCompletedFinancial.downPayment'),\n value: prettyNumber(downPayment, {\n postfix: 'kr',\n }),\n },\n {\n key: i18next.t('stageCompletedFinancial.loanAmount'),\n value: prettyNumber(creditAmount, {\n postfix: 'kr',\n }),\n },\n {\n key: i18next.t('stageCompletedFinancial.repaymentPeriod'),\n value: `${duration} ${i18next.t('stageCompletedFinancial.months')}`,\n },\n {\n key: i18next.t('stageCompletedFinancial.monthlyCost'),\n value: prettyNumber(monthlyCost, { postfix: 'kr*' }),\n },\n ];\n\n const decision = state.creditAssessmentResponse?.recommendation;\n const disclaimerText = i18next.t('stageCompletedFinancial.disclaimerText', {\n interest: prettyNumber(interest * 100, { decimals: 2 }),\n effectiveInterest: prettyNumber(effectiveInterest * 100, { decimals: 2 }),\n });\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${loan.name}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('stageCompletedFinancial.orderAlmostReady')}</p>\n </div>\n </div>\n ${\n decision\n ? `<div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CREDIT_ASSESSMENT_RESULT_NODE}\"></div>`\n : ''\n }\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${keyValueList.map((kv) => KeyValueListItem(kv)).join('')}\n </ul>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-disclaimer-text\">${disclaimerText}</div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-align waykeecom-align--end\">\n <button type=\"button\" title=\"${i18next.t('stageCompletedFinancial.changeFinancing')}\" class=\"waykeecom-link\">${i18next.t('stageCompletedFinancial.changeFinancing')}</button>\n </div>\n </div>\n `;\n\n if (decision) {\n new StageCompletedFinancialCreditAssessment(\n this.node.querySelector(`#${CREDIT_ASSESSMENT_RESULT_NODE}`),\n {\n store,\n decision,\n }\n );\n }\n } else {\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('stageCompletedFinancial.financing'),\n value:\n paymentType === PaymentType.Cash\n ? i18next.t('stageCompletedFinancial.cash')\n : i18next.t('stageCompletedFinancial.lease'),\n })}\n </ul>\n </div>\n ${\n onEdit\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-align waykeecom-align--end\">\n <button type=\"button\" title=\"${i18next.t('stageCompletedFinancial.changeFinancing')}\" class=\"waykeecom-link\">${i18next.t('stageCompletedFinancial.changeFinancing')}</button>\n </div>\n </div>\n `\n : ''\n }\n `;\n }\n\n if (onEdit) {\n this.node.querySelector('button')?.addEventListener('click', () => onEdit());\n }\n }\n}\n\nexport default StageCompletedFinancial;\n", "import i18next from '@i18n';\nimport { IAvailableInsuranceOption } from '@wayke-se/ecom';\nimport ButtonAddRemove from '../../../../Components/Button/ButtonAddRemove';\nimport ButtonAsLinkArrowLeft from '../../../../Components/Button/ButtonAsLinkArrowLeft';\nimport ButtonClear from '../../../../Components/Button/ButtonClear';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport { asHtml } from '../../../../Utils/parser';\nimport { scrollTop } from '../../../../Utils/scroll';\n\nconst BUTTON_TOP_LEFT_NODE = 'insurance-button-top-left-node';\nconst BUTTON_BOTTOM_LEFT_NODE = 'insurance-button-bottom-left-node';\nconst BUTTON_INSURANCE_ADD_REMOVE_NODE = 'insurance-add-remove-node';\n\ninterface InsuranceItemInfoProps {\n readonly freeInsurance: IAvailableInsuranceOption;\n readonly selected: boolean;\n readonly onClick: () => void;\n readonly onClose: () => void;\n}\n\nclass InsuranceItemInfo extends HtmlNode {\n private readonly props: InsuranceItemInfoProps;\n\n constructor(element: HTMLElement, props: InsuranceItemInfoProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { freeInsurance, selected, onClose, onClick } = this.props;\n const { title, description, logo, longDescription } = freeInsurance;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-nav-banner\" id=\"${BUTTON_TOP_LEFT_NODE}\"></div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-hstack waykeecom-hstack--align-center waykeecom-hstack--spacing-3\">\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--grow\">\n <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${title}</h3>\n </div>\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\">\n <div class=\"waykeecom-logo\">\n <img src=\"${logo}\" alt=\"${i18next.t('insurance.logoAlt', { title })}\" class=\"waykeecom-logo__image waykeecom-logo__image--right\" />\n </div>\n </div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-content waykeecom-text waykeecom-text--font-medium\">\n <p class=\"waykeecom-content__p\">${description}</p>\n </div>\n </div>\n ${\n longDescription\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${asHtml(longDescription)}</p>\n </div>\n </div>\n `\n : ''\n }\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_INSURANCE_ADD_REMOVE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_BOTTOM_LEFT_NODE}\"></div>\n </div>\n `;\n\n new ButtonAsLinkArrowLeft(this.node.querySelector(`#${BUTTON_TOP_LEFT_NODE}`), {\n title: i18next.t('insurance.backButton'),\n onClick: () => onClose(),\n });\n\n new ButtonClear(this.node.querySelector(`#${BUTTON_BOTTOM_LEFT_NODE}`), {\n title: i18next.t('insurance.backButton'),\n onClick: () => onClose(),\n });\n\n new ButtonAddRemove(this.node.querySelector(`#${BUTTON_INSURANCE_ADD_REMOVE_NODE}`), {\n selected,\n fullSize: true,\n onClick: () => onClick(),\n });\n\n scrollTop();\n }\n}\n\nexport default InsuranceItemInfo;\n", "import i18next from '@i18n';\nimport { IAvailableInsuranceOption } from '@wayke-se/ecom';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport GridItem from '../../../../Components/OverflowGrid/OverflowGridItem';\nimport { addOrRemoveFreeInsurance } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport watch from '../../../../Redux/watch';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport { createPortal, destroyPortal } from '../../../../Utils/portal';\nimport InsuranceItemInfo from './InsuranceItemInfo';\n\ninterface InsuranceItemProps {\n readonly store: WaykeStore;\n readonly freeInsurance: IAvailableInsuranceOption;\n readonly key: string;\n}\n\nclass InsuranceItem extends HtmlNode {\n private readonly props: InsuranceItemProps;\n private displayInfo = false;\n\n constructor(element: HTMLElement, props: InsuranceItemProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'freeInsurance', () => {\n this.render();\n });\n\n this.render();\n }\n\n private onInfoOpen() {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_INFORMATION_TOGGLE, EcomStep.INSURANCE);\n this.displayInfo = true;\n this.render();\n }\n\n private onInfoClose() {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_INFORMATION_TOGGLE, EcomStep.INSURANCE);\n this.displayInfo = false;\n destroyPortal();\n this.render();\n this.node.parentElement?.scrollIntoView();\n }\n\n private onClick() {\n const { freeInsurance } = this.props.store.getState();\n if (freeInsurance && this.props.freeInsurance !== freeInsurance) {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SELECTED, EcomStep.INSURANCE);\n } else {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_UNSELECTED, EcomStep.INSURANCE);\n }\n\n addOrRemoveFreeInsurance(this.props.freeInsurance)(this.props.store.dispatch);\n }\n\n render() {\n const { store, freeInsurance, key } = this.props;\n const state = store.getState();\n const logo = state.order?.insuranceOption?.logo;\n\n const selected = state.freeInsurance\n ? JSON.stringify(state.freeInsurance).localeCompare(\n JSON.stringify(this.props.freeInsurance)\n ) === 0\n : false;\n\n if (this.displayInfo) {\n new InsuranceItemInfo(createPortal(), {\n freeInsurance,\n selected,\n onClick: () => {\n this.onInfoClose();\n this.onClick();\n },\n onClose: () => this.onInfoClose(),\n });\n }\n\n new GridItem(\n this.node,\n {\n logo,\n id: key,\n title: freeInsurance.title,\n description: freeInsurance.description,\n selected,\n onClick: () => this.onClick(),\n onInfo: () => this.onInfoOpen(),\n },\n key\n );\n }\n}\n\nexport default InsuranceItem;\n", "import { IAvailableInsuranceOption } from '@wayke-se/ecom';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport OverflowGridList from '../../../../Components/OverflowGrid/OverflowGridList';\nimport { WaykeStore } from '../../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceItem from './InsuranceItem';\n\ninterface InsuranceListProps {\n readonly store: WaykeStore;\n readonly insurances: IAvailableInsuranceOption[];\n}\n\nclass InsuranceList extends HtmlNode {\n private readonly props: InsuranceListProps;\n\n constructor(element: HTMLElement | null, props: InsuranceListProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n render() {\n const { store, insurances } = this.props;\n const listRef = new OverflowGridList(this.node, {\n id: 'insurance-list',\n onClick: () => ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ARROW, EcomStep.INSURANCE),\n });\n const { overflowElement } = listRef;\n if (overflowElement) {\n overflowElement.innerHTML = '';\n insurances.forEach(\n (freeInsurance, index) =>\n new InsuranceItem(overflowElement, {\n store,\n freeInsurance,\n key: `insurance-${index}`,\n })\n );\n }\n }\n}\n\nexport default InsuranceList;\n", "import i18next from '@i18n';\nimport { IAvailableInsuranceOption } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../../Components/Button/ButtonArrowRight';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport { completeStage } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceList from './InsuranceList';\n\nconst INSURANCE_GRID_LIST_NODE = 'insurance-grid-list-node';\n\nconst PROCEED_INSURANCE = 'button-insurances-proceed';\nconst PROCEED_INSURANCE_NODE = `${INSURANCE_GRID_LIST_NODE}-node`;\n\nconst SKIP_INSURANCES = 'button-insurances-skip';\nconst SKIP_INSURANCES_NODE = `${SKIP_INSURANCES}-node`;\n\ninterface DefaultInsuranceProps {\n readonly store: WaykeStore;\n readonly lastStage: boolean;\n readonly insurance: IAvailableInsuranceOption;\n}\n\nclass DefaultInsurance extends HtmlNode {\n private readonly props: DefaultInsuranceProps;\n\n constructor(element: HTMLElement, props: DefaultInsuranceProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n private onProceed() {\n const { freeInsurance } = this.props.store.getState();\n\n completeStage(this.props.lastStage)(this.props.store.dispatch);\n ecomEvent(\n EcomView.MAIN,\n !!freeInsurance ? EcomEvent.INSURANCE_SET : EcomEvent.INSURANCE_SKIPPED,\n EcomStep.INSURANCE\n );\n }\n\n render() {\n const { store, insurance } = this.props;\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('insurance.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('insurance.description')}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${INSURANCE_GRID_LIST_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_INSURANCE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SKIP_INSURANCES_NODE}\"></div>\n </div>\n `;\n\n new InsuranceList(this.node.querySelector<HTMLElement>(`#${INSURANCE_GRID_LIST_NODE}`), {\n store,\n insurances: [insurance],\n });\n\n new ButtonArrowRight(this.node.querySelector<HTMLElement>(`#${PROCEED_INSURANCE_NODE}`), {\n id: PROCEED_INSURANCE,\n title: i18next.t('insurance.proceedButton'),\n onClick: () => this.onProceed(),\n });\n }\n}\n\nexport default DefaultInsurance;\n", "import i18next from '@i18n';\nimport { DrivingDistance } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../../Components/Button/ButtonArrowRight';\nimport ButtonSkip from '../../../../Components/Button/ButtonSkip';\nimport Disclaimer from '../../../../Components/Disclaimer/Disclaimer';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport InputSelect from '../../../../Components/Input/InputSelect';\nimport { setDrivingDistance } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport Alert from '../../../../Templates/Alert';\nimport { translateDrivingDistance } from '../../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceView from './InsuranceView';\n\nconst DISTANCE = 'select-insurance-distance';\nconst DISTANCE_NODE = `${DISTANCE}-node`;\n\nconst INSURANCE_INFO_NODE = `insurance-info-node`;\n\nconst SHOW_INSURANCES = 'button-insurances-show';\nconst SHOW_INSURANCES_NODE = `${SHOW_INSURANCES}-node`;\nconst SHOW_INSURANCES_DISCLAIMER_NODE = `${SHOW_INSURANCES}-disclaimer-node`;\n\nconst SKIP_INSURANCES = 'button-insurances-skip';\nconst SKIP_INSURANCES_NODE = `${SKIP_INSURANCES}-node`;\n\ninterface IfInsuranceProps {\n readonly store: WaykeStore;\n readonly lastStage: boolean;\n readonly onSkip: () => void;\n}\n\nclass IfInsurance extends HtmlNode {\n private readonly props: IfInsuranceProps;\n private showInsurances = false;\n\n constructor(element: HTMLElement, props: IfInsuranceProps) {\n super(element);\n this.props = props;\n this.showInsurances = !!this.props.store.getState().insurance;\n this.render();\n }\n\n private onChangeDistance(e: Event) {\n this.showInsurances = false;\n const currentTarget = e.currentTarget as HTMLSelectElement;\n const distance = currentTarget.value as DrivingDistance;\n setDrivingDistance(distance)(this.props.store.dispatch);\n switch (distance) {\n case DrivingDistance.Between0And1000:\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.INSURANCE_MILEAGE_BETWEEN_0_AND_1000_SELECTED,\n EcomStep.INSURANCE_IF\n );\n break;\n case DrivingDistance.Between1000And1500:\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.INSURANCE_MILEAGE_BETWEEN_1000_AND_1500_SELECTED,\n EcomStep.INSURANCE_IF\n );\n break;\n case DrivingDistance.Between1500And2000:\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.INSURANCE_MILEAGE_BETWEEN_1500_AND_2000_SELECTED,\n EcomStep.INSURANCE_IF\n );\n break;\n case DrivingDistance.Between2000And2500:\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.INSURANCE_MILEAGE_BETWEEN_2000_AND_2500_SELECTED,\n EcomStep.INSURANCE_IF\n );\n break;\n case DrivingDistance.Over2500:\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.INSURANCE_MILEAGE_OVER_2500_SELECTED,\n EcomStep.INSURANCE_IF\n );\n break;\n default:\n break;\n }\n }\n\n private onShowInsurances() {\n this.showInsurances = true;\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SHOW, EcomStep.INSURANCE_IF);\n this.render();\n }\n\n private onEdit() {\n this.showInsurances = false;\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_EDIT_MILEAGE, EcomStep.INSURANCE_IF);\n this.render();\n }\n\n render() {\n const { store, lastStage, onSkip } = this.props;\n const state = store.getState();\n\n const insuranceDisclaimerTitle =\n state.order?.insuranceOption?.title || '[Ok\u00E4nt f\u00F6rs\u00E4kringsbolag]';\n\n if (this.showInsurances) {\n new InsuranceView(this.node, {\n store,\n lastStage,\n onEdit: () => this.onEdit(),\n });\n } else {\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('insurance.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('insurance.ifDescription')}</p>\n </div>\n </div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${INSURANCE_INFO_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${DISTANCE_NODE}\"></div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SHOW_INSURANCES_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SKIP_INSURANCES_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SHOW_INSURANCES_DISCLAIMER_NODE}\"></div>\n </div>\n `;\n new InputSelect(this.node.querySelector<HTMLDivElement>(`#${DISTANCE_NODE}`), {\n id: DISTANCE,\n title: i18next.t('insurance.showInsurances'),\n name: 'distance',\n value: state.drivingDistance,\n options: [\n {\n value: DrivingDistance.Between0And1000,\n title: translateDrivingDistance[DrivingDistance.Between0And1000],\n },\n {\n value: DrivingDistance.Between1000And1500,\n title: translateDrivingDistance[DrivingDistance.Between1000And1500],\n },\n {\n value: DrivingDistance.Between1500And2000,\n title: translateDrivingDistance[DrivingDistance.Between1500And2000],\n },\n {\n value: DrivingDistance.Between2000And2500,\n title: translateDrivingDistance[DrivingDistance.Between2000And2500],\n },\n {\n value: DrivingDistance.Over2500,\n title: translateDrivingDistance[DrivingDistance.Over2500],\n },\n ],\n onChange: (e) => this.onChangeDistance(e),\n });\n\n new ButtonArrowRight(this.node.querySelector<HTMLDivElement>(`#${SHOW_INSURANCES_NODE}`), {\n id: SHOW_INSURANCES,\n title: i18next.t('insurance.showInsurances'),\n onClick: () => this.onShowInsurances(),\n });\n\n const insuranceInfoNode = this.node.querySelector<HTMLDivElement>(`#${INSURANCE_INFO_NODE}`);\n if (insuranceInfoNode) {\n insuranceInfoNode.innerHTML = Alert({\n tone: 'info',\n polite: true,\n children: i18next.t('insurance.ifAlert', { insuranceDisclaimerTitle }),\n });\n }\n\n new Disclaimer(\n this.node.querySelector<HTMLDivElement>(`#${SHOW_INSURANCES_DISCLAIMER_NODE}`),\n {\n text: i18next.t('insurance.ifDisclaimer', { insuranceDisclaimerTitle }),\n }\n );\n\n new ButtonSkip(this.node.querySelector<HTMLDivElement>(`#${SKIP_INSURANCES_NODE}`), {\n id: SKIP_INSURANCES,\n title: i18next.t('insurance.skipButton'),\n onClick: () => onSkip(),\n });\n }\n }\n}\n\nexport default IfInsurance;\n", "import { DrivingDistance, insurances } from '@wayke-se/ecom';\nimport { WaykeStore } from '../Redux/store';\n\nexport const getInsurances = (store: WaykeStore, drivingDistance: DrivingDistance) => {\n const state = store.getState();\n if (!state.id) throw 'No id';\n\n const request = insurances\n .newInsuranceOptionsRequest()\n .forCustomer(state.customer.socialId)\n .forVehicle(state.id)\n .withDrivingDistance(drivingDistance);\n\n return insurances.getOptions(request.build());\n};\n", "import Loader from '../../Templates/Loader';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface ButtonSuccessProps {\n readonly title: string;\n readonly id?: string;\n disabled?: boolean;\n loading?: boolean;\n readonly onClick?: (e: Event) => void;\n}\n\nclass ButtonSuccess extends HtmlNode {\n private readonly props: ButtonSuccessProps;\n\n constructor(element: HTMLDivElement | null, props: ButtonSuccessProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n isDisabled() {\n return this.props.disabled;\n }\n\n disabled(disabled: boolean) {\n if (this.props.disabled !== disabled) {\n this.props.disabled = disabled;\n this.render();\n }\n }\n\n loading(loading: boolean) {\n if (this.props.loading !== loading) {\n this.props.loading = loading;\n this.props.disabled = loading;\n this.render();\n }\n }\n\n render() {\n const { title, id, disabled, loading, onClick } = this.props;\n this.node.innerHTML = `\n <button\n type=\"button\"\n ${id ? `id=\"${id}\"` : ''}\n title=\"${title}\"\n ${disabled && `disabled=\"\"`}\n class=\"waykeecom-button waykeecom-button--full-width waykeecom-button--success\"\n >\n <span class=\"waykeecom-button__content\">${title}</span>\n ${\n loading\n ? `\n <span class=\"waykeecom-button__content\">\n ${Loader({ type: 'inline' })}\n </span>`\n : ''\n }\n </button>\n `;\n if (onClick) {\n this.node.querySelector<HTMLButtonElement>('button')?.addEventListener('click', onClick);\n }\n }\n}\n\nexport default ButtonSuccess;\n", "import HtmlNode from '../Extension/HtmlNode';\n\ninterface InputCheckboxProps {\n readonly title: string;\n readonly value: string;\n readonly name: string;\n readonly description?: string;\n readonly meta?: string;\n readonly id: string;\n checked: boolean;\n readonly onClick?: (e: Event) => void;\n readonly append?: boolean;\n disabled?: boolean;\n}\n\nclass InputCheckbox extends HtmlNode {\n private readonly props: InputCheckboxProps;\n\n constructor(element: HTMLElement | null, props: InputCheckboxProps) {\n super(\n element,\n props.append\n ? {\n htmlTag: 'div',\n className: 'waykeecom-input-selection',\n attributes: [{ key: 'role', value: 'checkbox' }],\n }\n : undefined\n );\n this.props = props;\n this.render();\n }\n\n checked(checked: boolean) {\n if (this.props.checked !== checked) {\n this.props.checked = checked;\n this.render();\n }\n }\n\n disabled(disabled: boolean) {\n if (this.props.disabled !== disabled) {\n this.props.disabled = disabled;\n this.render();\n }\n }\n\n render() {\n const { id, title, value, name, checked, meta, description, append, disabled, onClick } =\n this.props;\n\n const content = `\n <input\n type=\"checkbox\"\n id=\"${id}\"\n value=\"${value}\"\n name=\"${name}\"\n ${disabled ? 'disabled=\"\"' : ''}\n ${checked ? 'checked=\"true\"' : ''}\n class=\"waykeecom-input-selection__input\"\n />\n <div class=\"waykeecom-input-selection__header\">\n <label for=\"${id}\" class=\"waykeecom-input-selection__label\">${title}</label>\n ${meta ? `<div class=\"waykeecom-input-selection__meta\">${meta}</div>` : ''}\n </div>\n ${\n description\n ? `\n <label for=\"${id}\" class=\"waykeecom-input-selection__description\">\n ${description}\n </label>\n `\n : ''\n }\n `;\n\n if (append) {\n this.node.innerHTML = content;\n }\n\n this.node.innerHTML = `\n <div class=\"waykeecom-input-selection\" role=\"checkbox\">\n ${content}\n </div>\n `;\n\n const input = this.node.querySelector(`#${id}`);\n if (input) {\n if (onClick) {\n input.addEventListener('click', onClick);\n }\n }\n }\n}\n\nexport default InputCheckbox;\n", "import HtmlNode from '../../../../Components/Extension/HtmlNode';\n\nclass InsuracenAddonBox extends HtmlNode {\n constructor(element: HTMLElement | null) {\n super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--1' });\n this.render();\n }\n\n render() {\n this.node.innerHTML = `<div class=\"waykeecom-box\"></div>`;\n\n return this.node.querySelector<HTMLElement>('.waykeecom-box') as HTMLElement;\n }\n}\n\nexport default InsuracenAddonBox;\n", "import i18next from '@i18n';\nimport { IInsuranceAddon, IInsuranceOption } from '@wayke-se/ecom';\nimport Accordion from '../../../../Components/Accordion';\nimport ButtonAddRemove from '../../../../Components/Button/ButtonAddRemove';\nimport ButtonAsLinkArrowLeft from '../../../../Components/Button/ButtonAsLinkArrowLeft';\nimport ButtonClear from '../../../../Components/Button/ButtonClear';\nimport ButtonSuccess from '../../../../Components/Button/ButtonSuccess';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport InputCheckbox from '../../../../Components/Input/InputCheckbox';\nimport { addOrRemoveInsuranceAddon } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../../Utils/format';\nimport { scrollTop } from '../../../../Utils/scroll';\nimport InsuracenAddonBox from './InsuranceAddonBox';\n\nconst BUTTON_TOP_LEFT_NODE = 'insurance-button-top-left-node';\nconst BUTTON_BOTTOM_LEFT_NODE = 'insurance-button-bottom-left-node';\nconst BUTTON_INSURANCE_ADD_REMOVE_NODE = 'insurance-add-remove-node';\n\nconst ADDONS_NODE = 'insurance-addons-node';\nconst ACCORDION_NODE = 'insurance-accordion-node';\n\nconst slugify = (text: string) => {\n return text\n .toString()\n .toLowerCase()\n .replace(/\\s+/g, '-') // Replace spaces with -\n .replace(/[^\\w\\-]+/g, '') // Remove all non-word characters\n .replace(/\\-\\-+/g, '-') // Replace multiple - with single -\n .replace(/^-+/, '') // Trim - from start of text\n .replace(/-+$/, ''); // Trim - from end of text\n};\n\ninterface InsuranceItemInfoProps {\n readonly store: WaykeStore;\n readonly insurance: IInsuranceOption;\n readonly selected: boolean;\n readonly onClose: () => void;\n}\n\nclass InsuranceItemInfo extends HtmlNode {\n private readonly props: InsuranceItemInfoProps;\n private initialAddons: IInsuranceAddon[] = [];\n private addons: IInsuranceAddon[] = [];\n private contexts: {\n updateButton?: ButtonSuccess | ButtonAddRemove;\n checkboxes: { [key: string]: InputCheckbox | undefined };\n } = { checkboxes: {} };\n\n constructor(element: HTMLElement, props: InsuranceItemInfoProps) {\n super(element);\n this.props = props;\n\n const { insuranceAddOns } = this.props.store.getState();\n if (!!insuranceAddOns?.insurance && insuranceAddOns.insurance === this.props.insurance.name) {\n this.addons = [...insuranceAddOns.addOns];\n }\n\n this.initialAddons = [...this.addons];\n\n this.render();\n }\n\n private static containChanges(_initialAddons: IInsuranceAddon[], _addons: IInsuranceAddon[]) {\n const initialAddons = [..._initialAddons].sort();\n const addons = [..._addons].sort();\n return initialAddons.join().localeCompare(addons.join()) !== 0;\n }\n\n onClick(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const { name, checked } = currentTarget;\n const selectedAddon = this.props.insurance.addOns.find((x) => x.name === name);\n\n if (selectedAddon) {\n Object.keys(this.contexts.checkboxes).forEach((key) => {\n this.contexts.checkboxes[key]?.disabled(false);\n });\n\n if (checked) {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ADDON_SELECTED, EcomStep.INSURANCE_IF);\n this.addons.push(selectedAddon);\n } else {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ADDON_UNSELECTED, EcomStep.INSURANCE_IF);\n const index = this.addons.findIndex((x) => x.name === selectedAddon.name);\n if (index > -1) {\n this.addons.splice(index, 1);\n }\n }\n\n this.contexts.checkboxes[name]?.checked(checked);\n\n [...new Set(this.addons.map((a) => a.exclude).flat())].forEach((exclude) =>\n this.contexts.checkboxes[exclude as string]?.disabled(true)\n );\n }\n\n const containChanges = InsuranceItemInfo.containChanges(this.initialAddons, this.addons);\n this.contexts.updateButton?.disabled(this.props.selected ? !containChanges : false);\n this.render();\n }\n\n onUpdate() {\n const { insurance } = this.props.store.getState();\n if (!insurance || (insurance && this.props.insurance.name !== insurance.name)) {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SELECTED, EcomStep.INSURANCE_IF);\n } else {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_UNSELECTED, EcomStep.INSURANCE_IF);\n }\n\n addOrRemoveInsuranceAddon(this.props.insurance, this.addons)(this.props.store.dispatch);\n this.props.onClose();\n }\n\n render() {\n const { insurance, selected, onClose } = this.props;\n const { name, description, legalDescription, legalUrl, insuranceItems } = insurance;\n const addons = insurance.addOns;\n\n const containChanges = InsuranceItemInfo.containChanges(this.initialAddons, this.addons);\n\n const price = this.addons.reduce((prev, curr) => {\n return prev + curr.monthlyPrice;\n }, insurance.price);\n\n this.node.innerHTML = `\n <div class=\"waykeecom-nav-banner\" id=\"${BUTTON_TOP_LEFT_NODE}\"></div>\n\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-hstack waykeecom-hstack--align-center waykeecom-hstack--spacing-3\">\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--grow\">\n <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${name}</h3>\n </div>\n ${\n false\n ? `\n <div class=\"waykeecom-hstack__item waykeecom-hstack__item--no-shrink\">\n <div class=\"waykeecom-logo\">\n <img src=\"${''}\" alt=\"${i18next.t('insurance.logoAlt', { title: name })}\" class=\"waykeecom-logo__image waykeecom-logo__image--right\" />\n </div>\n </div>\n `\n : ''\n }\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(price, {\n postfix: i18next.t('insurance.perMonth'),\n })}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-content waykeecom-text waykeecom-text--font-medium\">\n <p class=\"waykeecom-content__p\">${description}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <a \n href=\"${legalUrl}\"\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n class=\"waykeecom-link\"\n >${legalDescription}</a>\n </div>\n ${\n addons?.length\n ? `<div class=\"waykeecom-stack waykeecom-stack--3\">\n <fieldset class=\"waykeecom-input-group\">\n <legend class=\"waykeecom-input-label\"><div class=\"waykeecom-input-label__label\">${i18next.t('insurance.addons')}</div></legend>\n <div id=\"${ADDONS_NODE}\"></div>\n </fieldset>\n </div>`\n : ''\n }\n ${\n insuranceItems?.length\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('insurance.includes')}</h4>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${ACCORDION_NODE}\"></div>\n `\n : ''\n }\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_INSURANCE_ADD_REMOVE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${BUTTON_BOTTOM_LEFT_NODE}\"></div>\n </div>\n `;\n\n new ButtonAsLinkArrowLeft(this.node.querySelector(`#${BUTTON_TOP_LEFT_NODE}`), {\n title: i18next.t('insurance.backButton'),\n onClick: () => onClose(),\n });\n\n if (!!addons?.length) {\n const node = this.node.querySelector<HTMLElement>(`#${ADDONS_NODE}`);\n addons.forEach((addon) => {\n const subNode = new InsuracenAddonBox(node);\n this.contexts.checkboxes[addon.name] = new InputCheckbox(subNode.render(), {\n id: slugify(addon.name),\n name: addon.name,\n title: addon.title,\n meta: `<div class=\"waykeecom-text waykeecom-text--font-bold\">${prettyNumber(\n addon.monthlyPrice,\n { postfix: i18next.t('insurance.perMonth') }\n )}</div>`,\n description: `<div class=\"waykeecom-text waykeecom-text--tone-alt\">${addon.description}</div>`,\n append: true,\n value: addon.name,\n checked: this.addons.findIndex((x) => x.name === addon.name) > -1,\n onClick: (e) => this.onClick(e),\n });\n });\n }\n\n if (!!insuranceItems?.length) {\n const node = this.node.querySelector<HTMLElement>(`#${ACCORDION_NODE}`);\n insuranceItems.forEach(\n (ii) =>\n new Accordion(node, {\n id: ii.name,\n title: ii.name,\n description: ii.description,\n append: true,\n })\n );\n }\n\n new ButtonAsLinkArrowLeft(this.node.querySelector(`#${BUTTON_TOP_LEFT_NODE}`), {\n title: i18next.t('insurance.backButton'),\n onClick: () => onClose(),\n });\n\n new ButtonClear(this.node.querySelector(`#${BUTTON_BOTTOM_LEFT_NODE}`), {\n title: i18next.t('insurance.backButton'),\n onClick: () => onClose(),\n });\n\n if (selected) {\n this.contexts.updateButton = new ButtonSuccess(\n this.node.querySelector(`#${BUTTON_INSURANCE_ADD_REMOVE_NODE}`),\n {\n title: selected ? i18next.t('insurance.update') : i18next.t('insurance.select'),\n disabled: selected ? !containChanges : undefined,\n onClick: () => this.onUpdate(),\n }\n );\n } else {\n this.contexts.updateButton = new ButtonAddRemove(\n this.node.querySelector(`#${BUTTON_INSURANCE_ADD_REMOVE_NODE}`),\n {\n selected: false,\n fullSize: true,\n disabled: selected ? !containChanges : undefined,\n onClick: () => this.onUpdate(),\n }\n );\n }\n\n scrollTop();\n }\n}\n\nexport default InsuranceItemInfo;\n", "import i18next from '@i18n';\nimport { IInsuranceOption } from '@wayke-se/ecom';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport GridItem from '../../../../Components/OverflowGrid/OverflowGridItem';\nimport { addOrRemoveInsurance } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport watch from '../../../../Redux/watch';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../../Utils/format';\nimport { createPortal, destroyPortal } from '../../../../Utils/portal';\nimport InsuranceItemInfo from './InsuranceItemInfo';\n\ninterface InsuranceItemProps {\n readonly store: WaykeStore;\n readonly insurance: IInsuranceOption;\n readonly key: string;\n}\n\nclass InsuranceItem extends HtmlNode {\n private readonly props: InsuranceItemProps;\n private displayInfo = false;\n\n constructor(element: HTMLElement, props: InsuranceItemProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'insurance', () => {\n this.render();\n });\n\n this.render();\n }\n\n private onInfoOpen() {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_INFORMATION_TOGGLE, EcomStep.INSURANCE_IF);\n this.displayInfo = true;\n this.render();\n }\n\n private onInfoClose() {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_INFORMATION_TOGGLE, EcomStep.INSURANCE_IF);\n this.displayInfo = false;\n destroyPortal();\n this.render();\n this.node.parentElement?.scrollIntoView();\n }\n\n private onClick() {\n const { insurance } = this.props.store.getState();\n if (!insurance || (insurance && this.props.insurance.name !== insurance.name)) {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SELECTED, EcomStep.INSURANCE_IF);\n } else {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_UNSELECTED, EcomStep.INSURANCE_IF);\n }\n\n addOrRemoveInsurance(this.props.insurance)(this.props.store.dispatch);\n }\n\n render() {\n const { store, insurance, key } = this.props;\n const state = store.getState();\n const logo = state.order?.insuranceOption?.logo;\n const selectedAddons =\n state.insuranceAddOns?.insurance === insurance.name\n ? state.insuranceAddOns.addOns.map((k) => {\n return {\n key: k?.title,\n value: prettyNumber(k?.monthlyPrice, { postfix: i18next.t('insurance.perMonth') }),\n };\n })\n : undefined;\n const selected = state.insurance\n ? JSON.stringify(state.insurance).localeCompare(JSON.stringify(insurance)) === 0\n : false;\n if (this.displayInfo) {\n new InsuranceItemInfo(createPortal(), {\n store: this.props.store,\n insurance,\n selected,\n onClose: () => this.onInfoClose(),\n });\n }\n\n new GridItem(\n this.node,\n {\n logo,\n selected,\n id: key,\n title: insurance.name,\n description: insurance.description,\n price: prettyNumber(insurance.price, { postfix: i18next.t('insurance.perMonth') }),\n priceDetails: selectedAddons,\n onClick: () => this.onClick(),\n onInfo: () => this.onInfoOpen(),\n },\n key\n );\n }\n}\n\nexport default InsuranceItem;\n", "import { IInsuranceOption } from '@wayke-se/ecom';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport OverflowGridList from '../../../../Components/OverflowGrid/OverflowGridList';\nimport { WaykeStore } from '../../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceItem from './InsuranceItem';\n\ninterface InsuranceListProps {\n readonly store: WaykeStore;\n readonly insurances: IInsuranceOption[];\n}\nclass InsuranceList extends HtmlNode {\n private readonly props: InsuranceListProps;\n\n constructor(element: HTMLDivElement | null, props: InsuranceListProps) {\n super(element);\n this.props = props;\n\n this.render();\n }\n\n render() {\n const { store, insurances } = this.props;\n const listRef = new OverflowGridList(this.node, {\n id: 'insurance-list',\n onClick: () => ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ARROW, EcomStep.INSURANCE_IF),\n });\n const { overflowElement } = listRef;\n if (overflowElement) {\n overflowElement.innerHTML = '';\n insurances.forEach(\n (insurance, index) =>\n new InsuranceItem(overflowElement, {\n store,\n insurance,\n key: `insurance-${index}`,\n })\n );\n }\n }\n}\n\nexport default InsuranceList;\n", "import i18next from '@i18n';\nimport { IInsuranceOption } from '@wayke-se/ecom';\nimport ButtonArrowRight from '../../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../../Components/Button/ButtonAsLink';\nimport ButtonSkip from '../../../../Components/Button/ButtonSkip';\nimport HtmlNode from '../../../../Components/Extension/HtmlNode';\nimport { getInsurances } from '../../../../Data/getInsurances';\nimport { addOrRemoveInsurance, completeStage } from '../../../../Redux/action';\nimport { WaykeStore } from '../../../../Redux/store';\nimport watch from '../../../../Redux/watch';\nimport Alert from '../../../../Templates/Alert';\nimport KeyValueListItem from '../../../../Templates/KeyValueListItem';\nimport Loader from '../../../../Templates/Loader';\nimport { translateDrivingDistance } from '../../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../../Utils/ecomEvent';\nimport InsuranceList from './InsuranceList';\n\nconst INSURANCE_GRID_LIST_NODE = 'insurance-grid-list-node';\n\nconst PROCEED_INSURANCE = 'button-insurances-proceed';\nconst PROCEED_INSURANCE_NODE = `${INSURANCE_GRID_LIST_NODE}-node`;\n\nconst SKIP_INSURANCES = 'button-insurances-skip';\nconst SKIP_INSURANCES_NODE = `${SKIP_INSURANCES}-node`;\n\nconst EDIT_DRIVING_DISTANCE = 'button-insurance-edit-driving-distance';\nconst EDIT_DRIVING_DISTANCE_NODE = `${EDIT_DRIVING_DISTANCE}-node`;\n\nconst IF_INSURANCE_CACHE: { [key: string]: IInsuranceOption[] | undefined } = {};\n\ninterface InsuranceViewProps {\n readonly store: WaykeStore;\n readonly lastStage: boolean;\n readonly onEdit: () => void;\n}\n\nclass InsuranceView extends HtmlNode {\n private readonly props: InsuranceViewProps;\n private requestError: boolean = false;\n private insurances?: IInsuranceOption[];\n private contexts: {\n buttonProceed?: ButtonArrowRight;\n listners: ((() => void) | undefined)[];\n } = { listners: [] };\n\n constructor(element: HTMLElement, props: InsuranceViewProps) {\n super(element);\n this.props = props;\n\n const drivingDistanceListner = watch(this.props.store, 'drivingDistance', () => {\n this.fetchInsurance();\n });\n this.contexts.listners.push(drivingDistanceListner);\n\n const customerIdListner = watch(this.props.store, 'customer.socialId', () => {\n this.fetchInsurance();\n });\n\n this.contexts.listners.push(customerIdListner);\n\n const insuranceListner = watch(this.props.store, 'insurance', () => {\n this.contexts.buttonProceed?.disabled(!this.props.store.getState().insurance);\n });\n this.contexts.listners.push(insuranceListner);\n\n this.fetchInsurance();\n this.render();\n }\n\n private fetchInsurance() {\n const state = this.props.store.getState();\n if (state.customer.socialId) {\n this.getInsurances();\n }\n }\n\n private async getInsurances() {\n const state = this.props.store.getState();\n this.requestError = false;\n this.render();\n\n const cacheKey = `${state.customer.socialId}-${state.id}-${state.drivingDistance}`;\n const cache = IF_INSURANCE_CACHE[cacheKey];\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_GET_INSURANCES_REQUESTED, EcomStep.INSURANCE_IF);\n if (cache) {\n this.insurances = cache;\n\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_GET_INSURANCES_SUCCEEDED, EcomStep.INSURANCE_IF);\n this.render();\n return;\n }\n\n try {\n const response = await getInsurances(this.props.store, state.drivingDistance);\n\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_GET_INSURANCES_SUCCEEDED, EcomStep.INSURANCE_IF);\n this.insurances = response.getInsuranceOptions();\n IF_INSURANCE_CACHE[cacheKey] = this.insurances;\n } catch (_e) {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_GET_INSURANCES_FAILED, EcomStep.INSURANCE_IF);\n this.requestError = true;\n } finally {\n this.render();\n }\n }\n\n private onEditDrivingDistance() {\n this.contexts.listners.forEach((x) => x?.());\n this.props.onEdit();\n }\n\n private onProceed() {\n completeStage(this.props.lastStage)(this.props.store.dispatch);\n }\n\n private onSkipInsurances() {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SKIPPED, EcomStep.INSURANCE_IF);\n addOrRemoveInsurance()(this.props.store.dispatch);\n completeStage(this.props.lastStage)(this.props.store.dispatch);\n }\n\n render() {\n const { store } = this.props;\n const state = store.getState();\n const { insurance, drivingDistance } = state;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('insurance.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('insurance.ifDescription')}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('insurance.estimatedMileage'),\n value: translateDrivingDistance[drivingDistance],\n })}\n </ul>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-align waykeecom-align--end\" id=\"${EDIT_DRIVING_DISTANCE_NODE}\">\n <button type=\"button\" title=\"${i18next.t('insurance.edit')}\" class=\"waykeecom-link\" >${i18next.t('insurance.edit')}</button>\n </div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${INSURANCE_GRID_LIST_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_INSURANCE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${SKIP_INSURANCES_NODE}\"></div>\n </div>\n `;\n\n const insuranceListNode = this.node.querySelector<HTMLDivElement>(\n `#${INSURANCE_GRID_LIST_NODE}`\n );\n if (insuranceListNode) {\n if (this.requestError) {\n insuranceListNode.innerHTML = Alert({\n tone: 'error',\n children: `${i18next.t('insurance.fetchError')} <button type=\"button\" title=\"${i18next.t('insurance.retry')}\" class=\"waykeecom-link waykeecom-link--align-baseline waykeecom-link--current-color\">${i18next.t('insurance.retry')}</button>.`,\n });\n insuranceListNode\n .querySelector<HTMLButtonElement>('button')\n ?.addEventListener('click', () => this.getInsurances());\n } else {\n const insurances = this.insurances;\n if (insurances?.length) {\n new InsuranceList(insuranceListNode, { store, insurances });\n } else {\n insuranceListNode.innerHTML = Loader();\n }\n }\n }\n\n new ButtonAsLink(this.node.querySelector<HTMLDivElement>(`#${EDIT_DRIVING_DISTANCE_NODE}`), {\n id: EDIT_DRIVING_DISTANCE,\n title: i18next.t('insurance.edit'),\n onClick: () => this.onEditDrivingDistance(),\n });\n\n this.contexts.buttonProceed = new ButtonArrowRight(\n this.node.querySelector<HTMLDivElement>(`#${PROCEED_INSURANCE_NODE}`),\n {\n id: PROCEED_INSURANCE,\n disabled: !insurance,\n title: i18next.t('insurance.proceedButton'),\n onClick: () => this.onProceed(),\n }\n );\n\n new ButtonSkip(this.node.querySelector<HTMLDivElement>(`#${SKIP_INSURANCES_NODE}`), {\n id: SKIP_INSURANCES,\n title: i18next.t('insurance.skipButton'),\n onClick: () => this.onSkipInsurances(),\n });\n }\n}\n\nexport default InsuranceView;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport StageCompleted from '../../../Components/StageCompleted';\nimport { addOrRemoveInsurance, completeStage, goTo } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport { KeyValueListItemProps } from '../../../Templates/KeyValueListItem';\nimport ListItem from '../../../Templates/ListItem';\nimport { translateDrivingDistance } from '../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport DefaultInsurance from './DefaultInsurance';\nimport IfInsurance from './IfInsurance';\n\ninterface InsuranceProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n readonly marketCode: MarketCode;\n}\n\nclass Insurance extends HtmlNode {\n private readonly props: InsuranceProps;\n\n constructor(element: HTMLElement, props: InsuranceProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'navigation', () => {\n this.render();\n });\n\n this.render();\n }\n\n private getStep() {\n const { order } = this.props.store.getState();\n return order?.insuranceOption?.institute === 'IF' ? EcomStep.INSURANCE_IF : EcomStep.INSURANCE;\n }\n\n private onSkipInsurances() {\n addOrRemoveInsurance()(this.props.store.dispatch);\n completeStage(this.props.lastStage)(this.props.store.dispatch);\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_SKIPPED, this.getStep());\n }\n\n private onEdit() {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_EDIT, this.getStep());\n goTo('main', this.props.index)(this.props.store.dispatch);\n }\n\n render() {\n const { store, index, lastStage } = this.props;\n const state = store.getState();\n\n const completed = state.topNavigation.stage > index;\n const active = state.navigation.stage === index;\n if (active) {\n ecomEvent(EcomView.MAIN, EcomEvent.INSURANCE_ACTIVE, this.getStep());\n }\n const content = ListItem(this.node, {\n completed,\n title: i18next.t('insurance.title'),\n active,\n id: 'insurance',\n index: index,\n });\n\n if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n const keyValueOptions: KeyValueListItemProps[] = [];\n if (state.insurance) {\n keyValueOptions.push({\n key: i18next.t('insurance.estimatedMileage'),\n value: translateDrivingDistance[state.drivingDistance],\n });\n keyValueOptions.push({\n key: state.insurance.name,\n value: prettyNumber(state.insurance.price, { postfix: i18next.t('insurance.perMonth') }),\n });\n\n if (state.insuranceAddOns?.insurance === state.insurance.name) {\n state.insuranceAddOns.addOns.forEach((addon) =>\n keyValueOptions.push({\n key: addon.title,\n value: prettyNumber(addon.monthlyPrice, { postfix: i18next.t('insurance.perMonth') }),\n })\n );\n }\n } else if (state.freeInsurance) {\n keyValueOptions.push({\n key: i18next.t('insurance.title'),\n value: state.freeInsurance.title,\n });\n } else {\n keyValueOptions.push({\n key: i18next.t('insurance.title'),\n value: i18next.t('insurance.none'),\n });\n }\n\n new StageCompleted(content, {\n keyValueList: keyValueOptions,\n changeButtonTitle: i18next.t('insurance.changeButtonTitle'),\n onEdit: !state.createdOrderId ? () => this.onEdit() : undefined,\n });\n } else if (state.navigation.stage === index) {\n const insuranceOptions = state.order?.insuranceOption;\n if (!insuranceOptions) throw 'Missing insurance';\n\n switch (this.props.marketCode === 'SE' && insuranceOptions?.institute) {\n case 'IF':\n new IfInsurance(content, {\n store,\n lastStage,\n onSkip: () => this.onSkipInsurances(),\n });\n break;\n default:\n new DefaultInsurance(content, {\n store,\n lastStage,\n insurance: insuranceOptions,\n });\n break;\n }\n }\n if (state.navigation.stage === index) {\n content.parentElement?.scrollIntoView();\n }\n }\n}\n\nexport default Insurance;\n", "import HtmlNode from '../Extension/HtmlNode';\nimport InputError from './InputError';\nimport InputInformation from './InputInformation';\n\ninterface InputTextareaProps {\n readonly title: string;\n readonly value: string;\n readonly name: string;\n readonly id: string;\n readonly error?: boolean;\n readonly errorMessage?: string;\n readonly placeholder?: string;\n readonly information?: string;\n readonly autocomplete?: string;\n readonly onChange?: (e: Event) => void;\n readonly onBlur?: (e: Event) => void;\n}\n\nclass InputTextarea extends HtmlNode {\n private readonly props: InputTextareaProps;\n private contexts: {\n error?: InputError;\n } = {};\n\n constructor(element: HTMLElement | null, props: InputTextareaProps) {\n super(element);\n\n this.props = props;\n this.render();\n }\n\n setError(error: boolean) {\n this.contexts.error?.setError(error);\n }\n\n private render() {\n const {\n title,\n value,\n name,\n id,\n error,\n errorMessage,\n placeholder,\n information,\n autocomplete,\n onChange,\n onBlur,\n } = this.props;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-input-label\">\n <label for=\"${id}\" class=\"waykeecom-input-label__label\">${title}</label>\n </div>\n <textarea\n id=\"${id}\"\n name=\"${name}\"\n ${autocomplete ? `autocomplete=\"${autocomplete}\"` : ''}\n ${placeholder ? `placeholder=\"${placeholder}\"` : ''}\n class=\"waykeecom-textarea\"\n >${value}</textarea>\n `;\n\n if (errorMessage) {\n this.contexts.error = new InputError(this.node, {\n error,\n errorMessage,\n });\n }\n\n if (information) {\n new InputInformation(this.node.querySelector<HTMLElement>('.waykeecom-input-label'), {\n information,\n });\n }\n\n const input = this.node.querySelector('textarea');\n if (input) {\n if (onChange) {\n input.addEventListener('input', onChange);\n }\n if (onBlur) {\n input.addEventListener('blur', onBlur);\n }\n }\n }\n}\n\nexport default InputTextarea;\n", "import { vehicles } from '@wayke-se/ecom';\nimport { TradeInCarData } from '../@types/TradeIn';\n\nexport const getTradeInVehicle = (data: TradeInCarData) => {\n const request = vehicles\n .newLookupRequest()\n .withRegistrationNumber(data.registrationNumber)\n .withMileage(parseInt(data.mileage, 10))\n .withCondition(data.condition);\n\n return vehicles.lookupVehicle(request.build());\n};\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport { TradeInCarData, TradeInCarDataPartial, VehicleCondition } from '../../../@types/TradeIn';\nimport { VehicleLookup } from '../../../@types/VehicleLookup';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport ButtonSkip from '../../../Components/Button/ButtonSkip';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputField from '../../../Components/Input/InputField';\nimport InputRadioGroup, { RadioItem } from '../../../Components/Input/InputRadioGroup';\nimport InputTextarea from '../../../Components/Input/InputTextarea';\nimport { getTradeInVehicle } from '../../../Data/getTradeInVehicle';\nimport { setTradeIn } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport { translateTradeInCondition } from '../../../Utils/constants';\nimport { convertVehicleLookupResponse } from '../../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst REGISTRATION_NUMBER_ID = 'trade-in-registrationNumber';\nconst REGISTRATION_NUMBER_NODE = `${REGISTRATION_NUMBER_ID}-node`;\n\nconst MILEAGE_ID = 'trade-in-mileage';\nconst MILEAGE_NODE = `${MILEAGE_ID}-node`;\n\nconst DESCRIPTION_ID = 'trade-in-description';\nconst DESCRIPTION_NODE = `${DESCRIPTION_ID}-node`;\n\nconst CONDITION_ID = 'trade-in-condition';\nconst CONDITION_NODE = `${CONDITION_ID}-node`;\n\nconst FETCH = 'trade-in-fetch';\nconst FETCH_NODE = `${FETCH}-node`;\n\nconst PROCEED = 'trade-in-proceed';\nconst PROCEED_NODE = `${PROCEED}-node`;\n\nconst TRADE_IN_NO = 'button-trade-in-no';\nconst TRADE_IN_NO_NODE = `${TRADE_IN_NO}-node`;\n\nconst CHANGE_BUTTON = 'button-trade-in-change';\nconst CHANGE_BUTTON_NODE = `${CHANGE_BUTTON}-node`;\n\nconst validation = {\n registrationNumber: validationMethods.requiredRegistrationNumber,\n mileage: validationMethods.requiredMileage,\n description: validationMethods.optionalString,\n condition: validationMethods.requiredCondition,\n};\n\nexport interface TradeInValidation {\n registrationNumber: boolean;\n mileage: boolean;\n description: boolean;\n condition: boolean;\n}\n\ninterface PartTradeInState {\n value: TradeInCarDataPartial;\n validation: TradeInValidation;\n interact: TradeInValidation;\n}\n\ntype INPUT_STRING_KEYS = keyof Omit<TradeInValidation, 'condition'>;\ntype INPUT_RADIO_KEYS = keyof Omit<\n TradeInValidation,\n 'registrationNumber' | 'mileage' | 'description'\n>;\n\n// const TRADE_IN_CACHE: { [key: string]: IVehicle | undefined } = {};\n\nconst initalState = (\n tradeIn?: TradeInCarDataPartial,\n marketCode?: MarketCode\n): PartTradeInState => {\n const value = {\n registrationNumber: marketCode === 'SE' ? tradeIn?.registrationNumber || '' : '',\n mileage: tradeIn?.mileage || '',\n description: tradeIn?.description || '',\n condition: tradeIn?.condition,\n };\n return {\n value,\n validation: {\n registrationNumber: validation.registrationNumber(value.registrationNumber, marketCode),\n mileage: validation.mileage(value.mileage),\n description: validation.description(value.description),\n condition: validation.condition(value.condition),\n },\n interact: { registrationNumber: false, mileage: false, description: false, condition: false },\n };\n};\n\ninterface PartTradeInProps {\n readonly store: WaykeStore;\n readonly lastStage: boolean;\n readonly marketCode: MarketCode;\n}\n\nclass PartTradeIn extends HtmlNode {\n private readonly props: PartTradeInProps;\n private state: PartTradeInState;\n private response?: VehicleLookup;\n private contexts: {\n registrationNumber?: InputField;\n mileage?: InputField;\n description?: InputTextarea;\n buttonFetch?: ButtonArrowRight;\n } = {};\n private requestError = false;\n\n constructor(element: HTMLElement, props: PartTradeInProps) {\n super(element);\n this.props = props;\n\n const state = this.props.store.getState();\n this.state = initalState(state.tradeIn, props.marketCode);\n this.render();\n }\n\n private async onFetchVehicle() {\n this.requestError = false;\n this.render();\n\n try {\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_VALUATION_REQUESTED, EcomStep.TRADE_IN_DETAILS);\n\n this.contexts.buttonFetch?.loading(true);\n if (\n this.state.validation.registrationNumber &&\n this.state.validation.mileage &&\n this.state.validation.description &&\n this.state.validation.condition\n ) {\n const value = this.state.value as TradeInCarData;\n const scandinavianMileage =\n this.props.marketCode === 'SE' ? value.mileage : String(Number(value.mileage) / 10);\n const _response = await getTradeInVehicle({ ...value, mileage: scandinavianMileage });\n const response = convertVehicleLookupResponse(_response);\n this.response = response;\n this.render();\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_VALUATION_SUCCEEDED, EcomStep.TRADE_IN_DETAILS);\n }\n } catch (_e) {\n this.requestError = true;\n this.render();\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_VALUATION_FAILED, EcomStep.TRADE_IN_DETAILS);\n } finally {\n this.contexts.buttonFetch?.loading(false);\n }\n }\n\n private onEdit() {\n this.response = undefined;\n this.render();\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SKIPPED, EcomStep.TRADE_IN_DETAILS);\n }\n\n private onProceed() {\n if (this.response) {\n const vehicle = this.response.vehicle;\n const value = this.state.value as TradeInCarData;\n setTradeIn(this.props.lastStage, value, vehicle)(this.props.store.dispatch);\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SET, EcomStep.TRADE_IN_DETAILS);\n }\n }\n\n private onChangeRadio(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as INPUT_RADIO_KEYS;\n const value = currentTarget.value as VehicleCondition;\n\n this.state.value[name] = value;\n this.state.validation[name] = validation[name](value);\n this.updateProceedButton();\n\n switch (value) {\n case VehicleCondition.VeryGood:\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.TRADE_IN_CONDITION_VERY_GOOD_SELECTED,\n EcomStep.TRADE_IN_DETAILS\n );\n break;\n case VehicleCondition.Good:\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.TRADE_IN_CONDITION_GOOD_SELECTED,\n EcomStep.TRADE_IN_DETAILS\n );\n break;\n case VehicleCondition.Ok:\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.TRADE_IN_CONDITION_OK_SELECTED,\n EcomStep.TRADE_IN_DETAILS\n );\n break;\n default:\n break;\n }\n }\n\n private onChange(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as INPUT_STRING_KEYS;\n\n if (name === 'registrationNumber') {\n currentTarget.value = currentTarget.value.toUpperCase();\n }\n\n const value = currentTarget.value;\n\n this.state.value[name] = value;\n this.state.validation[name] =\n name === 'registrationNumber'\n ? validation[name](value, this.props.marketCode)\n : validation[name](value);\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private onBlur(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n const name = currentTarget.name as INPUT_STRING_KEYS;\n\n this.state.interact[name] = true;\n this.state.validation[name] =\n name === 'registrationNumber'\n ? validation[name](this.state.value[name], this.props.marketCode)\n : validation[name](this.state.value[name]);\n this.updateUiError(name);\n this.updateProceedButton();\n }\n\n private updateUiError(name: INPUT_STRING_KEYS) {\n this.contexts[name]?.setError(this.state.interact[name] && !this.state.validation[name]);\n }\n\n private updateProceedButton() {\n this.contexts.buttonFetch?.disabled(\n !(\n this.state.validation.registrationNumber &&\n this.state.validation.mileage &&\n this.state.validation.description &&\n this.state.validation.condition\n )\n );\n }\n\n private onNoTradeIn() {\n setTradeIn(this.props.lastStage)(this.props.store.dispatch);\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SELECTED, EcomStep.TRADE_IN_DETAILS);\n }\n\n render() {\n if (this.response) {\n const keyValueItemsUpper: { key: string; value: string }[] = [];\n\n const tradeInVehicle = this.response.vehicle;\n keyValueItemsUpper.push({\n key: i18next.t('tradeIn.mileage'),\n value: `${this.state.value.mileage} ${this.props.marketCode === 'SE' ? 'mil' : 'km'}`,\n });\n if (this.state.value.description) {\n keyValueItemsUpper.push({\n key: i18next.t('tradeIn.description'),\n value: `${this.state.value.description}`,\n });\n }\n\n if (this.state.value.condition) {\n keyValueItemsUpper.push({\n key: i18next.t('tradeIn.condition'),\n value: translateTradeInCondition[this.state.value.condition],\n });\n }\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-balloon\">\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${this.state.value.registrationNumber}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <span class=\"waykeecom-text waykeecom-text--font-medium\">${\n tradeInVehicle.manufacturer\n } ${tradeInVehicle.modelSeries}</span>\n ${tradeInVehicle.modelName}, ${tradeInVehicle.modelYear}\n </div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${keyValueItemsUpper.map((kv) => KeyValueListItem(kv)).join('')}\n </ul>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-align waykeecom-align--end\" id=\"${CHANGE_BUTTON_NODE}\"></div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3 waykeecom-text waykeecom-text--align-center\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-text waykeecom-text--tone-alt waykeecom-text--size-small\">${i18next.t('tradeIn.estimatedValue')}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-heading waykeecom-heading--2 waykeecom-no-margin\">\n ${prettyNumber(tradeInVehicle.valuation, { postfix: 'kr' })}\n </div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n ${Alert({\n tone: 'info',\n children: `<span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('tradeIn.infoText')}</span> ${i18next.t('tradeIn.infoDisclaimer')}`,\n })}\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${PROCEED_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${TRADE_IN_NO_NODE}\"></div>\n </div>\n `;\n\n new ButtonAsLink(this.node.querySelector(`#${CHANGE_BUTTON_NODE}`), {\n id: CHANGE_BUTTON,\n title: i18next.t('tradeIn.changeButtonTitle'),\n onClick: () => this.onEdit(),\n });\n\n new ButtonArrowRight(this.node.querySelector(`#${PROCEED_NODE}`), {\n title: i18next.t('tradeIn.proceedButton'),\n onClick: () => this.onProceed(),\n });\n\n new ButtonSkip(this.node.querySelector(`#${TRADE_IN_NO_NODE}`), {\n id: TRADE_IN_NO,\n title: i18next.t('tradeIn.skipButton'),\n onClick: () => this.onNoTradeIn(),\n });\n this.node.parentElement?.parentElement?.scrollIntoView();\n } else {\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('tradeIn.detailsHeading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('tradeIn.detailsDescription')}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${REGISTRATION_NUMBER_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${MILEAGE_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${DESCRIPTION_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CONDITION_NODE}\"></div>\n </div>\n ${\n this.requestError\n ? `<div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n tone: 'error',\n children: i18next.t('tradeIn.fetchError'),\n })}</div>`\n : ''\n }\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${FETCH_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${TRADE_IN_NO_NODE}\"></div>\n </div>\n `;\n\n this.contexts.registrationNumber = new InputField(\n this.node.querySelector(`#${REGISTRATION_NUMBER_NODE}`),\n {\n title: i18next.t('tradeIn.registrationNumber'),\n value: this.state.value.registrationNumber,\n id: REGISTRATION_NUMBER_ID,\n error:\n this.state.interact.registrationNumber && !this.state.validation.registrationNumber,\n errorMessage: i18next.t('tradeIn.registrationNumberError'),\n name: 'registrationNumber',\n autocomplete: 'off',\n placeholder: i18next.t('tradeIn.registrationNumberPlaceholder'),\n unit:\n this.props.marketCode === 'SE'\n ? `\n <svg fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22 34\" class=\"waykeecom-input-text__unit-regnr-icon\" aria-hidden=\"true\">\n <rect width=\"22\" height=\"34\" rx=\"1\" fill=\"#458BDD\"/>\n <circle cx=\"11\" cy=\"10\" r=\"5.5\" stroke=\"#FFF500\" stroke-linejoin=\"round\" stroke-dasharray=\"1 2\"/>\n <path d=\"M10.6707 21.692c1.392 0 2.04.564 2.28.996h1.644c-.264-1.08-1.248-2.364-3.924-2.364-2.028 0-3.408.912-3.408 2.436 0 1.536 1.2 2.34 2.904 2.508l1.512.156c.876.108 1.476.372 1.476 1.188 0 .684-.684 1.176-1.98 1.176-1.56 0-2.244-.72-2.472-1.26h-1.716c.336 1.224 1.404 2.628 4.188 2.628 2.412 0 3.624-1.116 3.624-2.652 0-1.8-1.308-2.448-3.012-2.616-.576-.06-.972-.108-1.5-.156-.888-.108-1.392-.444-1.392-1.02 0-.624.612-1.02 1.776-1.02Z\" fill=\"#fff\"/>\n </svg>\n `\n : `\n <svg fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22 34\" class=\"waykeecom-input-text__unit-regnr-icon\" aria-hidden=\"true\">\n <rect width=\"22\" height=\"34\" rx=\"1\" fill=\"#003399\"/>\n <rect x=\"4\" y=\"5\" width=\"14\" height=\"10\" fill=\"#ef2b2d\"/>\n <rect x=\"7.5\" y=\"5\" width=\"2.5\" height=\"10\" fill=\"#ffffff\"/>\n <rect x=\"4\" y=\"8.75\" width=\"14\" height=\"2.5\" fill=\"#ffffff\"/>\n <rect x=\"8.25\" y=\"5\" width=\"1\" height=\"10\" fill=\"#002868\"/>\n <rect x=\"4\" y=\"9.5\" width=\"14\" height=\"1\" fill=\"#002868\"/>\n <path d=\"M7.75 21.692v6h1.5v-4.5l3 4.5h1.5v-6h-1.5v4.5l-3-4.5h-1.5Z\" fill=\"#fff\"/>\n </svg>`,\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n this.contexts.mileage = new InputField(this.node.querySelector(`#${MILEAGE_NODE}`), {\n title: i18next.t('tradeIn.mileage'),\n value: this.state.value.mileage,\n id: MILEAGE_ID,\n error: this.state.interact.mileage && !this.state.validation.mileage,\n errorMessage: i18next.t('tradeIn.mileageError'),\n name: 'mileage',\n autocomplete: 'off',\n placeholder: i18next.t('tradeIn.mileagePlaceholder'),\n unit: this.props.marketCode === 'SE' ? 'mil' : 'km',\n pattern: '[0-9]*',\n inputmode: 'numeric',\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n });\n\n this.contexts.description = new InputTextarea(\n this.node.querySelector(`#${DESCRIPTION_NODE}`),\n {\n title: i18next.t('tradeIn.descriptionOptional'),\n value: this.state.value.description,\n id: DESCRIPTION_ID,\n error: this.state.interact.description && !this.state.validation.description,\n errorMessage: i18next.t('tradeIn.descriptionError'),\n name: 'description',\n autocomplete: 'off',\n placeholder: i18next.t('tradeIn.descriptionPlaceholder'),\n onChange: (e) => this.onChange(e),\n onBlur: (e) => this.onBlur(e),\n }\n );\n\n new InputRadioGroup(this.node.querySelector(`#${CONDITION_NODE}`), {\n title: i18next.t('tradeIn.condition'),\n checked: this.state.value.condition as string,\n name: 'condition',\n options: [\n {\n id: `radio-${VehicleCondition.VeryGood}`,\n value: VehicleCondition.VeryGood,\n title: i18next.t('tradeIn.veryGoodCondition'),\n description: `\n <div class=\"waykeecom-box\">\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <ul class=\"waykeecom-content__ul\">\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.noScratches')}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.serviced')}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.goodTires')}</li>\n </ul>\n </div>\n </div>`,\n },\n {\n id: `radio-${VehicleCondition.Good}`,\n value: VehicleCondition.Good,\n title: i18next.t('tradeIn.goodCondition'),\n description: `\n <div class=\"waykeecom-box\">\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <ul class=\"waykeecom-content__ul\">\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.someScratches')}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.serviced')}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.okTires')}</li>\n </ul>\n </div>\n </div>`,\n },\n {\n id: `radio-${VehicleCondition.Ok}`,\n value: VehicleCondition.Ok,\n title: i18next.t('tradeIn.okCondition'),\n description: `\n <div class=\"waykeecom-box\">\n <div class=\"waykeecom-content waykeecom-content--inherit-size\">\n <ul class=\"waykeecom-content__ul\">\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.manyScratches')}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.notServiced')}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('tradeIn.badTires')}</li>\n </ul>\n </div>\n </div>`,\n },\n ],\n onClick: (e) => this.onChangeRadio(e),\n });\n\n this.contexts.buttonFetch = new ButtonArrowRight(this.node.querySelector(`#${FETCH_NODE}`), {\n title: i18next.t('tradeIn.fetchValue'),\n id: FETCH,\n disabled: !(\n this.state.validation.registrationNumber &&\n this.state.validation.mileage &&\n this.state.validation.condition\n ),\n onClick: () => this.onFetchVehicle(),\n });\n\n new ButtonSkip(this.node.querySelector(`#${TRADE_IN_NO_NODE}`), {\n id: TRADE_IN_NO,\n title: i18next.t('tradeIn.skipButton'),\n onClick: () => this.onNoTradeIn(),\n });\n }\n }\n}\n\nexport default PartTradeIn;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../../@types/MarketCode';\nimport ButtonArrowRight from '../../../Components/Button/ButtonArrowRight';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport ButtonSkip from '../../../Components/Button/ButtonSkip';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { goTo, initTradeIn, setTradeIn } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport Alert from '../../../Templates/Alert';\nimport KeyValueListItem from '../../../Templates/KeyValueListItem';\nimport ListItem from '../../../Templates/ListItem';\nimport { translateTradeInCondition } from '../../../Utils/constants';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { prettyNumber } from '../../../Utils/format';\nimport PartTradeIn from './PartTradeIn';\n\nconst TRADE_IN_YES = 'button-trade-in-yes';\nconst TRADE_IN_YES_NODE = `${TRADE_IN_YES}-node`;\n\nconst TRADE_IN_NO = 'button-trade-in-no';\nconst TRADE_IN_NO_NODE = `${TRADE_IN_NO}-node`;\n\nconst CHANGE_BUTTON = 'button-trade-in-change';\nconst CHANGE_BUTTON_NODE = `${CHANGE_BUTTON}-node`;\n\ninterface TradeInProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n readonly marketCode: MarketCode;\n}\n\nclass TradeIn extends HtmlNode {\n private readonly props: TradeInProps;\n\n constructor(element: HTMLElement, props: TradeInProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'navigation', () => {\n this.render();\n });\n\n this.render();\n }\n\n private onEdit() {\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_EDIT, EcomStep.TRADE_IN);\n goTo('main', this.props.index)(this.props.store.dispatch);\n }\n\n private onYesTradeIn() {\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SELECTED, EcomStep.TRADE_IN);\n initTradeIn(this.props.lastStage)(this.props.store.dispatch);\n }\n\n private onNoTradeIn() {\n ecomEvent(EcomView.MAIN, EcomEvent.TRADE_IN_SKIPPED, EcomStep.TRADE_IN);\n setTradeIn(this.props.lastStage)(this.props.store.dispatch);\n }\n\n render() {\n const { store, index, lastStage } = this.props;\n const state = this.props.store.getState();\n if (!state.order?.allowsTradeIn) return;\n\n const completed = state.topNavigation.stage > index;\n const active = state.navigation.stage === index;\n if (active) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.TRADE_IN_ACTIVE,\n state.navigation.subStage === 1 ? EcomStep.TRADE_IN : EcomStep.TRADE_IN_DETAILS\n );\n }\n const content = ListItem(this.node, {\n title: i18next.t('tradeIn.title'),\n active,\n completed,\n id: 'trade-in',\n index: index,\n });\n content.innerHTML = '';\n\n const part = document.createElement('div');\n\n if (state.navigation.stage > index || (completed && state.navigation.stage !== index)) {\n const keyValueItemsUpper: { key: string; value: string }[] = [];\n\n if (state.tradeIn && state.tradeInVehicle) {\n keyValueItemsUpper.push({\n key: i18next.t('tradeIn.mileage'),\n value: `${state.tradeIn.mileage} ${this.props.marketCode === 'SE' ? 'mil' : 'km'}`,\n });\n if (state.tradeIn.description)\n keyValueItemsUpper.push({\n key: i18next.t('tradeIn.description'),\n value: `${state.tradeIn.description}`,\n });\n if (state.tradeIn.condition)\n keyValueItemsUpper.push({\n key: i18next.t('tradeIn.condition'),\n value: translateTradeInCondition[state.tradeIn.condition],\n });\n\n part.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-balloon\">\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${state.tradeIn.registrationNumber}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <span class=\"waykeecom-text waykeecom-text--font-medium\">${\n state.tradeInVehicle.manufacturer\n } ${state.tradeInVehicle.modelSeries}</span>\n ${state.tradeInVehicle.modelName}, ${state.tradeInVehicle.modelYear}\n </div>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${keyValueItemsUpper.map((kv) => KeyValueListItem(kv)).join('')}\n </ul>\n </div>\n ${\n !state.createdOrderId\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-align waykeecom-align--end\" id=\"${CHANGE_BUTTON_NODE}\"></div>\n </div>\n `\n : ''\n }\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-shadow-box\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <ul class=\"waykeecom-key-value-list waykeecom-key-value-list--large-value\">\n ${KeyValueListItem({\n key: i18next.t('tradeIn.estimatedValue'),\n value: `~ ${prettyNumber(state.tradeInVehicle.valuation, { postfix: 'kr' })}`,\n })}\n </ul>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n ${Alert({\n tone: 'info',\n children: `<span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('tradeIn.infoText')}</span> ${i18next.t('tradeIn.infoDisclaimer')}`,\n })}\n </div>\n </div>\n </div>\n `;\n part.querySelector(`#${CHANGE_BUTTON}`)?.addEventListener('click', () => this.onEdit());\n } else {\n keyValueItemsUpper.push({\n key: i18next.t('tradeIn.title'),\n value: i18next.t('tradeIn.no'),\n });\n part.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${keyValueItemsUpper.map((kv) => KeyValueListItem(kv)).join('')}\n </ul>\n </div>\n ${\n !state.createdOrderId\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <div class=\"waykeecom-align waykeecom-align--end\" id=\"${CHANGE_BUTTON_NODE}\"></div>\n </div>\n `\n : ''\n }\n `;\n }\n if (!state.createdOrderId) {\n new ButtonAsLink(part.querySelector(`#${CHANGE_BUTTON_NODE}`), {\n id: CHANGE_BUTTON,\n title: i18next.t('tradeIn.changeButtonTitle'),\n onClick: () => this.onEdit(),\n });\n }\n } else if (state.navigation.stage === index) {\n if (state.wantTradeIn && state.tradeIn) {\n new PartTradeIn(part, { store, lastStage, marketCode: this.props.marketCode });\n } else {\n part.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('tradeIn.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('tradeIn.tradeInDescription')}</p>\n </div>\n </div>\n \n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${TRADE_IN_YES_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${TRADE_IN_NO_NODE}\"></div>\n </div>\n `;\n\n new ButtonArrowRight(part.querySelector<HTMLDivElement>(`#${TRADE_IN_YES_NODE}`), {\n id: TRADE_IN_YES,\n title: i18next.t('tradeIn.yesButton'),\n onClick: () => this.onYesTradeIn(),\n });\n\n new ButtonSkip(part.querySelector<HTMLDivElement>(`#${TRADE_IN_NO_NODE}`), {\n id: TRADE_IN_NO,\n title: i18next.t('tradeIn.skipButton'),\n onClick: () => this.onNoTradeIn(),\n });\n }\n }\n\n content.appendChild(part);\n if (state.navigation.stage === index) {\n content.parentElement?.scrollIntoView();\n }\n }\n}\n\nexport default TradeIn;\n", "import { StageMapper } from '../@types/Stages';\nimport Accessories from '../Views/Main/Accessories';\nimport CentralStorage from '../Views/Main/CentralStorage';\nimport Customer from '../Views/Main/Customer';\nimport Delivery from '../Views/Main/Delivery';\nimport Financial from '../Views/Main/Financial';\nimport Insurance from '../Views/Main/Insurance';\nimport TradeIn from '../Views/Main/TradeIn';\n\nexport const stageMap: StageMapper = {\n customer: { component: Customer, name: 'customer' },\n centralStorage: { component: CentralStorage, name: 'centralStorage' },\n delivery: { component: Delivery, name: 'delivery' },\n tradeIn: { component: TradeIn, name: 'tradeIn' },\n financial: { component: Financial, name: 'financial' },\n insurance: { component: Insurance, name: 'insurance' },\n accessories: { component: Accessories, name: 'accessories' },\n};\n\nexport type StageMapKeys = keyof typeof stageMap;\n", "import { customers, DeliveryType, orders, PaymentType, vehicles } from '@wayke-se/ecom';\nimport { IOrderInsuranceRequest } from '@wayke-se/ecom/dist-types/orders/types';\nimport { WaykeStore } from '../Redux/store';\nimport { extractLoanIndex, extractPaymentType } from '../Views/Main/Financial/utils';\n\nexport const createOrder = (store: WaykeStore) => {\n const state = store.getState();\n if (!state.address) throw 'Missing address';\n if (!state.paymentType) throw 'Missing paymentType';\n if (!state.vehicle) throw 'Missing vehicle';\n\n const customer = customers\n .newCustomer()\n .withAddress(state.address)\n .withPersonalNumber(state.customer.socialId)\n .withEmail(state.customer.email)\n .withPhoneNumber(state.customer.phone)\n .build();\n\n const paymentType = extractPaymentType(state.paymentType)!;\n const paymentBuilder = orders.newPayment().withType(paymentType);\n if (paymentType === PaymentType.Loan) {\n const index = extractLoanIndex(state.paymentType)!;\n const loan = state.order?.paymentOptions.filter((x) => x.type === PaymentType.Loan)?.[index];\n\n const loanDetails = state.paymentLookupResponse || loan?.loanDetails;\n\n const duration = loanDetails?.durationSpec.current as number;\n const downPayment = loanDetails?.downPaymentSpec.current as number;\n const residual = loanDetails?.residualValueSpec?.current as number;\n const externalId = state.order?.paymentOptions.find(\n (x) => x.type === PaymentType.Loan\n )?.externalId;\n\n paymentBuilder\n .withDuration(duration) // months, only applicable when payment type === PaymentType.Loan\n .withDownPayment(Math.round(downPayment)); // only applicable when payment type === PaymentType.Loan\n if (residual) {\n paymentBuilder.withResidualValue(residual); // only applicable when payment type === PaymentType.Loan\n }\n\n if (externalId) {\n paymentBuilder.withExternalId(externalId); // only applicable when payment type === PaymentType.Loan\n }\n\n if (state.creditAssessmentResponse) {\n const scoreId = state.creditAssessmentResponse.scoringId;\n const recommendation = state.creditAssessmentResponse.recommendation;\n const decision = state.creditAssessmentResponse.decision;\n const financialProductCode = loanDetails?.financialProductCode;\n if (!scoreId || !recommendation || !decision || !financialProductCode)\n throw 'Missing credit assessment data';\n\n const creditAssessment = orders\n .newCreditAssessment() // Only required for orders using credit assessment\n .withScoreId(scoreId)\n .withFinancialProductCode(financialProductCode)\n .withRecommendation(recommendation)\n .withDecision(decision)\n .build();\n paymentBuilder.withCreditAssessment(creditAssessment);\n }\n }\n const payment = paymentBuilder.build();\n\n const params = new URLSearchParams(window.location.search);\n params.set('wayke-ecom-web-id', state.id);\n\n const callbackUrl = `${window.location.origin}${window.location.pathname}?${params.toString()}${\n window.location.hash\n }`;\n\n params.set('wayke-ecom-web-payment', 'true');\n const paymentUrl = `${window.location.origin}${window.location.pathname}?${params.toString()}${\n window.location.hash\n }`;\n\n const requestBuilder = orders\n .newCreateRequest()\n .forVehicle(state.id)\n .withCustomer(customer)\n .withPayment(payment)\n .withUrls(callbackUrl, paymentUrl)\n .withDeliveryType(state.homeDelivery ? DeliveryType.Delivery : DeliveryType.Pickup);\n\n if (state.insurance) {\n const insuranceBuilder = orders.newInsurance().withDrivingDistance(state.drivingDistance);\n if (\n state.insuranceAddOns?.addOns.length &&\n state.insuranceAddOns.insurance === state.insurance.name\n ) {\n insuranceBuilder.withAddOns(state.insuranceAddOns.addOns.map((x) => x.name));\n }\n\n const insurance = insuranceBuilder.build();\n\n requestBuilder.withInsurance(insurance);\n } else if (state.freeInsurance) {\n requestBuilder.withInsurance({} as IOrderInsuranceRequest);\n }\n\n if (state.accessories.length) {\n requestBuilder.withAccessories(state.accessories);\n }\n\n if (state.tradeIn && state.tradeInVehicle && state.tradeIn.condition) {\n const tradeIn = vehicles\n .newVehicleTrade()\n .forVehicle(state.tradeIn.registrationNumber)\n .withMileage(parseInt(state.tradeIn.mileage, 10))\n .withCondition(state.tradeIn.condition)\n .withComment(state.tradeIn.description)\n .build();\n\n requestBuilder.withTradeIn(tradeIn);\n }\n\n return orders.create(requestBuilder.build());\n};\n", "import i18next from '@i18n';\nimport { title } from 'process';\nimport Button from '../../../Components/Button/Button';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputCheckbox from '../../../Components/Input/InputCheckbox';\nimport { createOrder } from '../../../Data/createOrder';\nimport { setCreatedOrderId } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { destroyPortal } from '../../../Utils/portal';\n\nconst ACCEPT_CONDITIONS = 'confirm-conditions';\nconst ACCEPT_CONDITIONS_NODE = `${ACCEPT_CONDITIONS}-node`;\n\nconst CONFIRM_BUTTON_NODE = `confirm-button-node`;\nconst CONFIRM_BUTTON = `confirm-button`;\n\ninterface NoVerifyProps {\n store: WaykeStore;\n}\n\nclass NoVerify extends HtmlNode {\n private props: NoVerifyProps;\n private requestError = false;\n private notAvailable = false;\n private view: number = 1;\n private contexts: {\n acceptConditions?: InputCheckbox;\n confirmButton?: Button;\n } = {};\n private acceptConditions: boolean = false;\n\n constructor(element: HTMLElement | null, props: NoVerifyProps) {\n super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n this.props = props;\n\n this.render();\n }\n\n private async onCreateOrder() {\n const { store } = this.props;\n this.notAvailable = false;\n this.requestError = false;\n\n try {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_CREATE_ORDER_REQUESTED,\n EcomStep.CONFIRMATION\n );\n\n const { order } = store.getState();\n const response = await createOrder(store);\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_CREATE_ORDER_SUCCEEDED,\n EcomStep.CONFIRMATION\n );\n\n const paymentRequired = order?.isPaymentRequired;\n if (paymentRequired) {\n destroyPortal();\n }\n\n const payment = response.getPayment();\n\n setCreatedOrderId(response.getOrderNumber(), payment)(store.dispatch);\n } catch (ee) {\n const e = ee as { message?: string };\n this.view = 1;\n ecomEvent(EcomView.MAIN, EcomEvent.CONFIRMATION_CREATE_ORDER_FAILED, EcomStep.CONFIRMATION);\n if (e.message === 'The vehicle is not available for purchase') {\n this.requestError = false;\n this.notAvailable = true;\n } else {\n this.notAvailable = false;\n this.requestError = true;\n }\n destroyPortal();\n\n this.render();\n }\n }\n\n private onCheckbox(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n this.acceptConditions = currentTarget.checked;\n this.contexts.acceptConditions?.checked(this.acceptConditions);\n this.render();\n }\n\n render() {\n const { order, insurance } = this.props.store.getState();\n const name = order?.contactInformation?.name;\n\n this.node.innerHTML = `\n <div class=\"confirmation\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('confirmation.heading')}</h4>\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.description2', { name })}</p>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${ACCEPT_CONDITIONS_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CONFIRM_BUTTON_NODE}\"></div>\n </div>\n `;\n\n const conditionsPdfUri = order?.conditionsPdfUri;\n\n this.contexts.acceptConditions = new InputCheckbox(\n this.node.querySelector<HTMLDivElement>(`#${ACCEPT_CONDITIONS_NODE}`),\n {\n checked: this.acceptConditions,\n id: ACCEPT_CONDITIONS,\n disabled: this.notAvailable,\n name: 'acceptConditions',\n\n title: `<div>${i18next.t('confirmation.confirmConditionsTitle', { conditionsPdfUri, link: `<a href=\"${conditionsPdfUri}\" title=\"${i18next.t('confirmation.purchaseTermsAndCancellationPolicy')}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('confirmation.purchaseTermsAndCancellationPolicy')}</a>`, interpolation: { escapeValue: false } })}${\n insurance\n ? ` <span class=\"waykeecom-text waykeecom-text--margin-left\">${i18next.t('confirmation.insuranceText')}</span>`\n : ''\n }.</div>`,\n value: 'acceptConditions',\n onClick: (e) => this.onCheckbox(e),\n }\n );\n\n this.contexts.confirmButton = new Button(\n this.node.querySelector<HTMLDivElement>(`#${CONFIRM_BUTTON_NODE}`),\n {\n title: i18next.t('confirmation.title'),\n id: CONFIRM_BUTTON,\n disabled: !this.acceptConditions,\n onClick: () => this.onCreateOrder(),\n }\n );\n }\n}\n\nexport default NoVerify;\n", "export const swedbankPayment = (url: string) => {\n const script = document.createElement('script');\n script.setAttribute('src', url);\n script.onload = () => {\n window.payex?.hostedView\n .paymentMenu({\n container: 'payment-menu',\n culture: 'sv-SE',\n })\n .open();\n };\n const head = document.getElementsByTagName('head')[0];\n head.appendChild(script);\n};\n", "import i18next from '@i18n';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport { swedbankPayment } from '../../../Utils/payment';\n\ntype SupportedPaymentTypes = 'swedbank';\n\ninterface PaymentProps {\n store: WaykeStore;\n}\n\nclass Payment extends HtmlNode {\n private props: PaymentProps;\n\n constructor(element: HTMLElement | null, props: PaymentProps) {\n super(element);\n this.props = props;\n\n this.render();\n this.init();\n }\n\n init() {\n const { payment: _payment } = this.props.store.getState();\n const payment = _payment as unknown as { type: string; url: string };\n sessionStorage.setItem('wayke-ecom-state', JSON.stringify(this.props.store.getState()));\n\n switch (payment.type as SupportedPaymentTypes) {\n case 'swedbank':\n swedbankPayment(payment.url);\n break;\n\n default:\n break;\n }\n }\n\n render() {\n const { order } = this.props.store.getState();\n\n const name = order?.contactInformation?.name;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('confirmation.paymentHeading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentDescription')}</p>\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentDescription2', { name })}</p>\n\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentCardType')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentCardTypeValue')}</span></p>\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentCardNo3DSecure')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentCardNo3DSecureValue')}</span></p>\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentCard3DSecure')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentCard3DSecureValue')}</span></p>\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentExpiry')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentExpiryValue')}</span></p>\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.paymentCVC')} <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('confirmation.paymentCVCValue')}</span></p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div id=\"payment-menu\" style=\"padding: 24px;border: 1px solid #ececeb;\"></div>\n </div>\n `;\n }\n}\n\nexport default Payment;\n", "import i18next from '@i18n';\nimport { AuthMethod } from '@wayke-se/ecom';\nimport { BankIdAuthResponse } from '@wayke-se/ecom/dist-types/bankid/bankid-auth-response';\nimport { BankIdCollectResponse } from '@wayke-se/ecom/dist-types/bankid/bankid-collect-response';\nimport BankIdSign from '../../../Components/BankId/BankIdSign';\nimport ButtonAsLink from '../../../Components/Button/ButtonAsLink';\nimport ButtonBankId from '../../../Components/Button/ButtonBankId';\nimport Disclaimer from '../../../Components/Disclaimer/Disclaimer';\nimport DisclaimerPadlock from '../../../Components/Disclaimer/DisclaimerPadlock';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport InputCheckbox from '../../../Components/Input/InputCheckbox';\nimport { createOrder } from '../../../Data/createOrder';\nimport { creditAssessmentAccept } from '../../../Data/creditAssessmentAccept';\nimport { getBankIdAuth } from '../../../Data/getBankIdAuth';\nimport { getBankIdQrCode } from '../../../Data/getBankIdQrCode';\nimport { getBankIdStatus } from '../../../Data/getBankIdStatus';\nimport { setCreatedOrderId } from '../../../Redux/action';\nimport { WaykeStore } from '../../../Redux/store';\nimport Alert from '../../../Templates/Alert';\nimport ecomEvent, { EcomEvent, EcomStep, EcomView } from '../../../Utils/ecomEvent';\nimport { registerInterval } from '../../../Utils/intervals';\nimport { isMobile } from '../../../Utils/isMobile';\nimport { createPortal, destroyPortal } from '../../../Utils/portal';\nimport { validationMethods } from '../../../Utils/validationMethods';\n\nconst CONFIRM_CONDITIONS = 'confirm-conditions';\nconst CONFIRM_CONDITIONS_NODE = `${CONFIRM_CONDITIONS}-node`;\n\nconst BANKID_START_NODE = `bankid-start-node`;\nconst BANKID_START = `bankid-start`;\n\nconst DISCLAIMER_POLICY_NODE = 'address-disclaimer-policy-node';\nconst DISCLAIMER_RESERVATION_NODE = 'address-disclaimer-reservation-node';\n\ninterface VerifyByBankIdProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n}\n\nclass VerifyByBankId extends HtmlNode {\n private readonly props: VerifyByBankIdProps;\n private bankidStatusInterval?: NodeJS.Timer;\n private bankidQrCodeInterval?: NodeJS.Timer;\n private focusTimeout?: NodeJS.Timeout;\n private view: number = 1;\n private contexts: {\n buttonLinkToggle?: ButtonAsLink;\n bankId?: BankIdSign;\n confirmConditions?: InputCheckbox;\n startBankid?: ButtonBankId;\n } = {};\n private ageError = false;\n private requestError = false;\n private socialIdNotMatchingError = false;\n private notAvailable = false;\n private confirmConditions: boolean = false;\n\n private bankidRequestRef:\n | {\n reference: string;\n method: AuthMethod;\n }\n | undefined = undefined;\n\n constructor(element: HTMLElement, props: VerifyByBankIdProps) {\n super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--2' });\n this.props = props;\n this.ageError = false;\n\n this.render();\n }\n\n private addWindowEvents() {\n this.removeWindowEvents();\n window.addEventListener('focus', () => this.onFocus());\n }\n private removeWindowEvents() {\n window.removeEventListener('focus', () => this.onFocus());\n }\n\n private clearIntervals() {\n clearInterval(this.bankidQrCodeInterval as NodeJS.Timeout);\n clearInterval(this.bankidStatusInterval as NodeJS.Timeout);\n }\n\n private async onFocus() {\n clearTimeout(this.focusTimeout);\n this.focusTimeout = setTimeout(async () => {\n if (this.bankidRequestRef?.method === AuthMethod.SameDevice) {\n try {\n const response = await getBankIdStatus(this.bankidRequestRef.reference);\n this.handleBankidStatusResponse(response, this.bankidRequestRef.method);\n } catch (_e) {\n this.clearIntervals();\n this.contexts.bankId?.setErrorMessage(i18next.t('confirmation.bankIdStatusError'));\n }\n }\n }, 500);\n }\n\n private onSameDeviceClick() {\n this.addWindowEvents();\n }\n\n private setBankidRequestRef(reference: string, method: AuthMethod) {\n this.bankidRequestRef = {\n reference,\n method,\n };\n }\n\n private clearBankidRequestRef() {\n this.bankidRequestRef = undefined;\n }\n\n private async acceptCreditAssessment() {\n const { caseId } = this.props.store.getState();\n if (caseId) {\n try {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_REQUEST,\n EcomStep.CONFIRMATION\n );\n await creditAssessmentAccept(caseId);\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_SUCCEEDED,\n EcomStep.CONFIRMATION\n );\n } catch (_e) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_ACCEPT_CREDIT_ASSESSMENT_FAILED,\n EcomStep.CONFIRMATION\n );\n }\n }\n }\n\n private async onCreateOrder() {\n const { store } = this.props;\n this.notAvailable = false;\n this.requestError = false;\n try {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_CREATE_ORDER_REQUESTED,\n EcomStep.CONFIRMATION\n );\n\n const { order } = store.getState();\n const response = await createOrder(store);\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_CREATE_ORDER_SUCCEEDED,\n EcomStep.CONFIRMATION\n );\n\n const paymentRequired = order?.isPaymentRequired;\n if (paymentRequired) {\n destroyPortal();\n }\n\n const payment = response.getPayment();\n\n setCreatedOrderId(response.getOrderNumber(), payment)(store.dispatch);\n this.acceptCreditAssessment();\n } catch (ee) {\n const e = ee as { message?: string };\n this.view = 1;\n ecomEvent(EcomView.MAIN, EcomEvent.CONFIRMATION_CREATE_ORDER_FAILED, EcomStep.CONFIRMATION);\n if (e.message === 'The vehicle is not available for purchase') {\n this.requestError = false;\n this.notAvailable = true;\n } else {\n this.notAvailable = false;\n this.requestError = true;\n }\n destroyPortal();\n\n this.render();\n }\n }\n\n private async handleBankidStatusResponse(response: BankIdCollectResponse, method: AuthMethod) {\n if (response.isCompleted()) {\n this.removeWindowEvents();\n this.clearBankidRequestRef();\n this.clearIntervals();\n const address = response.getAddress();\n const socialId = response.getPersonalNumber();\n\n if (address && socialId) {\n const state = this.props.store.getState();\n const over18 = validationMethods.requiredSsnOver18(socialId);\n if (!over18) {\n ecomEvent(\n EcomView.MAIN,\n method === AuthMethod.SameDevice\n ? EcomEvent.CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_NOT_OVER_18\n : EcomEvent.CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_NOT_OVER_18,\n EcomStep.CONFIRMATION\n );\n this.view = 1;\n this.ageError = true;\n destroyPortal();\n this.render();\n return;\n }\n if (state.customer.socialId !== socialId) {\n ecomEvent(\n EcomView.MAIN,\n method === AuthMethod.SameDevice\n ? EcomEvent.CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED_SSN_MISSMATCH\n : EcomEvent.CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED_SSN_MISSMATCH,\n EcomStep.CONFIRMATION\n );\n this.view = 1;\n this.socialIdNotMatchingError = true;\n destroyPortal();\n this.render();\n return;\n }\n ecomEvent(\n EcomView.MAIN,\n method === AuthMethod.SameDevice\n ? EcomEvent.CONFIRMATION_BANKID_STATUS_SAME_DEVICE_SUCCEEDED\n : EcomEvent.CONFIRMATION_BANKID_STATUS_QR_SUCCEEDED,\n EcomStep.CONFIRMATION\n );\n this.contexts.bankId?.setDescription(i18next.t('confirmation.bankIdCompletedMessage'));\n await this.onCreateOrder();\n }\n }\n }\n\n private bankidStatus = async (reference: string) => {\n try {\n const response = await getBankIdStatus(reference);\n this.handleBankidStatusResponse(response, AuthMethod.QrCode);\n } catch (_e) {\n this.clearIntervals();\n this.contexts.bankId?.setErrorMessage(i18next.t('confirmation.bankIdStatusError'));\n }\n };\n\n private qrCode = async (reference: string) => {\n try {\n const response = await getBankIdQrCode(reference);\n const qrCode = response.getQrCode();\n this.contexts.bankId?.update(AuthMethod.QrCode, qrCode);\n } catch (_e) {\n this.clearIntervals();\n this.contexts.bankId?.setErrorMessage(i18next.t('confirmation.bankIdQrCodeErrorMessage'));\n }\n };\n\n private async startBankidSameDevice(\n response: BankIdAuthResponse,\n reference: string,\n supressTracking = false\n ) {\n if (!supressTracking) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_BANKID_STATUS_SAME_DEVICE_REQUESTED,\n EcomStep.CONFIRMATION\n );\n }\n try {\n this.setBankidRequestRef(reference, AuthMethod.SameDevice);\n //this.addWindowEvents();\n const autoLaunchUrl = response.getAutoLaunchUrl() as string;\n this.contexts.bankId?.update(AuthMethod.SameDevice, autoLaunchUrl);\n } catch (e) {\n this.removeWindowEvents();\n this.clearBankidRequestRef();\n const _e = e as { message: string };\n this.contexts.bankId?.setErrorMessage(`Error: ${_e.message}`);\n }\n }\n\n private async startBankidWithQr(reference: string, supressTracking = false) {\n if (!supressTracking) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_BANKID_STATUS_QR_REQUESTED,\n EcomStep.CONFIRMATION\n );\n }\n\n this.bankidStatusInterval = setInterval(() => {\n this.bankidStatus(reference);\n }, 2000);\n registerInterval('bankidStatusInterval', this.bankidStatusInterval as unknown as number);\n\n this.qrCode(reference);\n this.bankidQrCodeInterval = setInterval(async () => {\n this.qrCode(reference);\n }, 1000);\n registerInterval('bankidQrCodeInterval', this.bankidQrCodeInterval as unknown as number);\n }\n\n private async onStartBankIdAuth(method: AuthMethod, supressTracking = false) {\n this.clearIntervals();\n\n try {\n if (!supressTracking) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_BANKID_INIT_REQUESTED,\n EcomStep.CONFIRMATION\n );\n }\n this.contexts.bankId?.update(method);\n this.contexts.buttonLinkToggle?.disabled(true);\n const response = await getBankIdAuth(method);\n if (!supressTracking) {\n ecomEvent(\n EcomView.MAIN,\n EcomEvent.CONFIRMATION_BANKID_INIT_SUCCEEDED,\n EcomStep.CONFIRMATION\n );\n }\n const reference = response.getOrderRef();\n if (method === AuthMethod.QrCode) {\n this.startBankidWithQr(reference, supressTracking);\n } else {\n this.startBankidSameDevice(response, reference, supressTracking);\n }\n } catch (_e) {\n ecomEvent(EcomView.MAIN, EcomEvent.CONFIRMATION_BANKID_INIT_FAILED, EcomStep.CONFIRMATION);\n this.contexts.bankId?.setErrorMessage(i18next.t('confirmation.bankIdInitErrorMessage'));\n } finally {\n this.contexts.buttonLinkToggle?.disabled(false);\n }\n }\n\n private onAbort() {\n this.clearBankidRequestRef();\n this.removeWindowEvents();\n this.clearIntervals();\n ecomEvent(EcomView.MAIN, EcomEvent.CONFIRMATION_BANKID_ABORTED, EcomStep.CONFIRMATION);\n this.view = 1;\n\n destroyPortal();\n this.render();\n }\n\n private onCheckbox(e: Event) {\n const currentTarget = e.currentTarget as HTMLInputElement;\n this.confirmConditions = currentTarget.checked;\n this.contexts.confirmConditions?.checked(this.confirmConditions);\n this.contexts.startBankid?.disabled(!this.confirmConditions);\n }\n\n render() {\n const mobile = isMobile();\n const { navigation, order, insurance } = this.props.store.getState();\n\n if (this.view === 2) {\n this.contexts.bankId = new BankIdSign(createPortal(), {\n method: mobile ? AuthMethod.SameDevice : AuthMethod.QrCode,\n descriptionQrCode: i18next.t('confirmation.bankIdDescriptionQrCode'),\n descriptionSameDevice: i18next.t('confirmation.bankIdDescriptionSameDevice'),\n onAbort: () => this.onAbort(),\n onStart: (method: AuthMethod) => this.onStartBankIdAuth(method),\n onSameDeviceClick: () => this.onSameDeviceClick(),\n });\n } else {\n const name = order?.contactInformation?.name;\n const conditionsPdfUri = order?.conditionsPdfUri;\n const policy = 'https://www.wayke.se/trygghet-naer-det-kommer-till-dina-personuppgifter';\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('confirmation.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.description', { name })}</p>\n <p class=\"waykeecom-content__p\">${i18next.t('confirmation.description2', { name })}</p>\n </div>\n </div>\n ${\n this.ageError\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n tone: 'error',\n children: i18next.t('confirmation.ageError'),\n })}</div>\n `\n : ''\n }\n\n ${\n this.requestError\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n tone: 'error',\n children: i18next.t('confirmation.requestError'),\n })}</div>\n `\n : ''\n }\n\n ${\n this.notAvailable\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n tone: 'error',\n children: i18next.t('confirmation.notAvailable'),\n })}</div>\n `\n : ''\n }\n\n ${\n this.socialIdNotMatchingError\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--3\">${Alert({\n tone: 'error',\n children: i18next.t('confirmation.socialIdNotMatchingError'),\n })}</div>\n `\n : ''\n }\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${CONFIRM_CONDITIONS_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\" id=\"${BANKID_START_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${DISCLAIMER_POLICY_NODE}\"></div>\n <div class=\"waykeecom-stack waykeecom-stack--1\" id=\"${DISCLAIMER_RESERVATION_NODE}\"></div>\n </div>\n </div>\n `;\n this.contexts.confirmConditions = new InputCheckbox(\n this.node.querySelector<HTMLDivElement>(`#${CONFIRM_CONDITIONS_NODE}`),\n {\n checked: this.confirmConditions,\n id: CONFIRM_CONDITIONS,\n disabled: this.notAvailable,\n name: 'confirmConditions',\n\n title: `<div>${i18next.t('confirmation.confirmConditionsTitle', { conditionsPdfUri, link: `<a href=\"${conditionsPdfUri}\" title=\"${i18next.t('confirmation.purchaseTermsAndCancellationPolicy')}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('confirmation.purchaseTermsAndCancellationPolicy')}</a>`, interpolation: { escapeValue: false } })}${\n insurance\n ? ` <span class=\"waykeecom-text waykeecom-text--margin-left\">${i18next.t('confirmation.insuranceText')}</span>`\n : ''\n }.</div>`,\n value: 'confirmConditions',\n onClick: (e) => this.onCheckbox(e),\n }\n );\n\n this.contexts.startBankid = new ButtonBankId(\n this.node.querySelector<HTMLDivElement>(`#${BANKID_START_NODE}`),\n {\n title: i18next.t('confirmation.reserveButton'),\n id: BANKID_START,\n disabled: !this.confirmConditions || this.notAvailable,\n onClick: () => {\n this.view = 2;\n this.render();\n },\n }\n );\n\n new DisclaimerPadlock(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_POLICY_NODE}`), {\n text: i18next.t('confirmation.policyText', {\n link: `<a href=\"${policy}\" title=${i18next.t('confirmation.privacyPolicy')} target=\"_blank\" rel=\"noopener noreferrer\" class=\"waykeecom-link\">${i18next.t('confirmation.privacyPolicy')}</a>`,\n interpolation: { escapeValue: false },\n }),\n });\n\n new Disclaimer(this.node.querySelector<HTMLDivElement>(`#${DISCLAIMER_RESERVATION_NODE}`), {\n text: i18next.t('confirmation.reservationDisclaimer'),\n });\n\n if (navigation.stage === this.props.index) {\n this.node.parentElement?.scrollIntoView();\n }\n }\n }\n}\n\nexport default VerifyByBankId;\n", "import { creditAssessment } from '@wayke-se/ecom';\n\nexport const creditAssessmentAccept = (caseId: string) => {\n const request = creditAssessment.accept(caseId);\n return request;\n};\n", "import { AuthMethod, bankid } from '@wayke-se/ecom';\n\nexport const getBankIdAuth = (method: AuthMethod) => {\n const request = bankid.newAuthRequest().withMethod(method).build();\n\n return bankid.auth(request);\n};\n", "import { bankid } from '@wayke-se/ecom';\n\nexport const getBankIdQrCode = (reference: string) => {\n const request = bankid.newQrCodeRequest().withOrderRef(reference).build();\n\n return bankid.qrcode(request);\n};\n", "import { bankid } from '@wayke-se/ecom';\n\nexport const getBankIdStatus = (reference: string) => {\n const request = bankid.newCollectRequest().withOrderRef(reference).build();\n\n return bankid.collect(request);\n};\n", "import i18next from '@i18n';\nimport HtmlNode from '../../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../../Redux/store';\nimport watch from '../../../Redux/watch';\nimport ListItem from '../../../Templates/ListItem';\nimport NoVerify from './NoVerify';\nimport Payment from './Payment';\nimport VerifyByBankId from './VerifyByBankId';\n\ninterface ConfirmationProps {\n readonly store: WaykeStore;\n readonly index: number;\n readonly lastStage: boolean;\n readonly bypassBankId: boolean;\n}\n\nclass Confirmation extends HtmlNode {\n private readonly props: ConfirmationProps;\n private view = 1;\n\n constructor(element: HTMLElement, props: ConfirmationProps) {\n super(element);\n this.props = props;\n\n watch(this.props.store, 'navigation', () => {\n this.render();\n });\n\n this.render();\n }\n\n render() {\n const { store, index, bypassBankId } = this.props;\n const { topNavigation, navigation, order } = store.getState();\n\n const completed = topNavigation.stage > index;\n\n const content = ListItem(this.node, {\n completed,\n title: order?.isPaymentRequired\n ? i18next.t('confirmation.paymentTitle')\n : i18next.t('confirmation.title'),\n id: 'confirmation',\n active: navigation.stage === index,\n index: index,\n });\n\n if (navigation.stage === index) {\n if (navigation.subStage === 2) {\n new Payment(content, { store });\n } else if (bypassBankId) {\n new NoVerify(content, { store });\n } else {\n new VerifyByBankId(content, { lastStage: true, index, store: this.props.store });\n }\n content.parentElement?.scrollIntoView();\n }\n }\n}\n\nexport default Confirmation;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../@types/MarketCode';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../Redux/store';\nimport watch from '../../Redux/watch';\nimport ItemTileSmall from '../../Templates/ItemTileSmall';\nimport { stageMap } from '../../Utils/stage';\nimport Confirmation from './Confirmation';\n\ninterface MainProps {\n readonly store: WaykeStore;\n cdnMedia?: string;\n marketCode: MarketCode;\n}\n\nclass Main extends HtmlNode {\n private readonly props: MainProps;\n\n constructor(element: HTMLElement, props: MainProps) {\n super(element);\n this.props = props;\n\n watch<number>(this.props.store, 'navigation.view', (view) => {\n if (view === 2) {\n this.render();\n }\n });\n\n this.render();\n this.node.scrollTop = 0;\n }\n\n render() {\n const { store, cdnMedia } = this.props;\n const state = store.getState();\n const { order, stages } = state;\n if (!order) throw 'No order available';\n\n this.node.innerHTML = ``;\n\n // Create a node to append aside and stepper into. Required for portal to work as intended\n const asideStepperWrapper = document.createElement('div');\n this.node.appendChild(asideStepperWrapper);\n\n const pageFormAside = document.createElement('aside');\n pageFormAside.className = 'waykeecom-cart';\n pageFormAside.setAttribute('aria-label', i18next.t('vehicleInfo'));\n pageFormAside.innerHTML = ItemTileSmall({\n vehicle: state.vehicle,\n order: state.order,\n cdnMedia,\n });\n asideStepperWrapper.appendChild(pageFormAside);\n\n const stepper = document.createElement('ol');\n stepper.className = 'waykeecom-stepper';\n asideStepperWrapper.appendChild(stepper);\n\n const size = stages?.length;\n // Render stages\n stages?.forEach(\n (stage, index) =>\n new stageMap[stage.name].component(stepper, {\n store,\n index: index + 1,\n lastStage: false, //size === index + 1,\n marketCode: this.props.marketCode,\n })\n );\n\n new Confirmation(stepper, {\n store,\n index: (size || 0) + 1,\n lastStage: true,\n bypassBankId: this.props.marketCode === 'NO',\n });\n }\n}\n\nexport default Main;\n", "import i18next from '@i18n';\nimport { CallbackOrder } from '../../@types/CallbackOrder';\nimport { PaymentOrderResponse } from '../../@types/PaymentOrderResponse';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../Redux/store';\n\n// import Loader from '../../Templates/Loader';\n// import Summary from '../Summary';\ninterface OrderCallbackProps {\n readonly store: WaykeStore;\n readonly callbackOrder: CallbackOrder;\n readonly onClose: () => void;\n}\n\nclass OrderCallback extends HtmlNode {\n private readonly props: OrderCallbackProps;\n private order?: PaymentOrderResponse;\n private orderFetchFailed: boolean = false;\n\n constructor(element: HTMLElement, props: OrderCallbackProps) {\n super(element);\n this.props = props;\n sessionStorage.removeItem('wayke-ecom-state');\n this.render();\n // this.loadOrder();\n }\n\n async loadOrder() {\n this.orderFetchFailed = false;\n this.render();\n try {\n const response = await fetch(this.props.callbackOrder.orderUrl);\n this.order = (await response.json()) as PaymentOrderResponse;\n } catch (_e) {\n this.orderFetchFailed = true;\n } finally {\n this.render();\n }\n }\n\n render() {\n const { callbackOrder } = this.props;\n\n /*\n if (this.order) {\n new Summary(this.node, { store: this.props.store, onClose: this.props.onClose });\n return;\n }\n */\n\n this.node.innerHTML = `\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('orderCallback.thankYou')}</p>\n <p class=\"waykeecom-content__p\">${i18next.t('orderCallback.orderId')}: ${callbackOrder.orderUrl}</p>\n <p class=\"waykeecom-content__p\">${i18next.t('orderCallback.waykeId')}: ${callbackOrder.id}</p>\n </div>\n `;\n }\n}\n\nexport default OrderCallback;\n", "import i18next from '@i18n';\nimport HtmlNode from '../Extension/HtmlNode';\n\ninterface CheckListProps {\n readonly title: string;\n readonly ariaLabel: string;\n readonly checklistItems: string[];\n}\n\nclass CheckList extends HtmlNode {\n private readonly props: CheckListProps;\n\n constructor(element: HTMLElement | null, props: CheckListProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n this.node.innerHTML = `\n <h3 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('glossary.buyOnline')}</h3>\n <ul class=\"waykeecom-checklist\" aria-label=\"${i18next.t('glossary.ourAdvantages')}\">\n ${this.props.checklistItems\n .map((item) => ` <li class=\"waykeecom-checklist__item\">${item}</li>`)\n .join('')}\n </ul>\n `;\n }\n}\n\nexport default CheckList;\n", "import { IOrderVehicle } from '@wayke-se/ecom/dist-types/orders/types';\nimport { OrderOptions } from '../@types/OrderOptions';\nimport { toCdnMedia } from '../Utils/cdn';\nimport { formatShortDescription, prettyNumber } from '../Utils/format';\n\ninterface ItemTileLargeProps {\n vehicle?: IOrderVehicle;\n order?: OrderOptions;\n meta?: string;\n cdnMedia?: string;\n}\n\nconst ItemTileLarge = ({ vehicle, order, meta, cdnMedia }: ItemTileLargeProps) => {\n const imageUrls = vehicle?.imageUrls;\n const vehicleTitle = vehicle?.title;\n const price = prettyNumber(vehicle?.price || NaN);\n\n const sellerName = order?.contactInformation?.name;\n return `\n <div class=\"waykeecom-product-card\">\n ${\n imageUrls?.length\n ? `\n <div class=\"waykeecom-product-card__media\">\n ${imageUrls\n .slice(0, 3)\n .map(\n (imageUrl) => `\n <div class=\"waykeecom-product-card__media-item\">\n <img src=\"${toCdnMedia(imageUrl, cdnMedia)}?spec=800x&format=webp\" alt=\"\" class=\"waykeecom-product-card__image\" />\n </div>\n `\n )\n .join('')}\n </div>\n `\n : ''\n }\n <dl class=\"waykeecom-product-card__body\">\n <dt class=\"waykeecom-sr-only\">S\u00E4ljare</dt>\n <dd class=\"waykeecom-product-card__seller\">${sellerName}</dd>\n <dt class=\"waykeecom-sr-only\">Modell</dt>\n <dd class=\"waykeecom-product-card__heading\">\n <span class=\"waykeecom-product-card__title\">${vehicleTitle}</span> ${formatShortDescription(\n vehicle\n )}\n </dd>\n <dt class=\"waykeecom-sr-only\">Pris</dt>\n <dd class=\"waykeecom-product-card__price\">${price} kr</dd>\n ${\n meta\n ? `\n <div class=\"waykeecom-product-card__meta\">\n ${meta}\n </div>\n `\n : ''\n }\n </dl>\n </div>\n`;\n};\n\nexport default ItemTileLarge;\n", "import i18next from '@i18n';\nimport { IDeliveryOption, PaymentType } from '@wayke-se/ecom';\nimport { OrderOptions, PaymentOption } from '../../@types/OrderOptions';\nimport { StageTypes } from '../../@types/Stages';\nimport TimelineItem from '../../Templates/TimelineItem';\n\nconst getFinancialDescription = (options?: PaymentOption[]) => {\n const paymentTypes = options?.map((x) => x.type) || [];\n const hasCash = paymentTypes.find((x) => x === PaymentType.Cash);\n const hasLease = paymentTypes.find((x) => x === PaymentType.Lease);\n const hasLoan = paymentTypes.find((x) => x === PaymentType.Loan);\n\n if (hasCash && hasLoan && hasLease) {\n return i18next.t('howTo.financialDescriptionAll');\n }\n if (hasCash && hasLease) {\n return i18next.t('howTo.financialDescriptionCashLease');\n }\n if (hasCash && hasLoan) {\n return i18next.t('howTo.financialDescriptionCashLoan');\n }\n if (hasLoan && hasLease) {\n return i18next.t('howTo.financialDescriptionLoanLease');\n }\n if (hasCash) {\n return i18next.t('howTo.financialDescriptionCash');\n }\n if (hasLoan) {\n return i18next.t('howTo.financialDescriptionLoan');\n }\n if (hasLease) {\n return i18next.t('howTo.financialDescriptionLease');\n }\n return '???';\n};\n\nconst getDeliveryDescription = (options?: IDeliveryOption[]) => {\n const hasPickup = options?.find((x) => x.type === 'Pickup');\n const hasHomeDelivery = options?.find((x) => x.type === 'Delivery');\n if (hasPickup && hasHomeDelivery) {\n return i18next.t('howTo.deliveryDescriptionBoth');\n }\n if (hasPickup) {\n return i18next.t('howTo.deliveryDescriptionPickup');\n }\n if (hasHomeDelivery) {\n return i18next.t('howTo.deliveryDescriptionHome');\n }\n return '???';\n};\n\ninterface HowToProps {\n readonly stageOrderList?: StageTypes[];\n readonly order?: OrderOptions;\n}\n\nconst HowTo = ({ order, stageOrderList }: HowToProps) => {\n const timelineItemByStage = {\n customer: {\n heading: i18next.t('howTo.customerHeading'),\n },\n centralStorage: {\n heading: i18next.t('howTo.centralStorageHeading'),\n description: i18next.t('howTo.centralStorageDescription'),\n },\n delivery: {\n heading: i18next.t('howTo.deliveryHeading'),\n description: '',\n },\n tradeIn: {\n heading: i18next.t('howTo.tradeInHeading'),\n description: i18next.t('howTo.tradeInDescription'),\n },\n financial: {\n heading: i18next.t('howTo.financialHeading'),\n description: '',\n },\n insurance: {\n heading: i18next.t('howTo.insuranceHeading'),\n description: i18next.t('howTo.insuranceDescription'),\n },\n accessories: {\n heading: i18next.t('howTo.accessoriesHeading'),\n description: i18next.t('howTo.accessoriesDescription'),\n },\n };\n timelineItemByStage.financial.description = getFinancialDescription(order?.paymentOptions);\n timelineItemByStage.delivery.description = getDeliveryDescription(order?.deliveryOptions);\n\n return `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('howTo.heading')}</h4>\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('howTo.description')}</p>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-p--2\">\n <ol class=\"waykeecom-timeline\" aria-label=\"${i18next.t('howTo.timelineAriaLabel')}\">\n ${stageOrderList?.map((stage) => TimelineItem(timelineItemByStage[stage.name])).join('')}\n ${\n order?.isPaymentRequired\n ? TimelineItem({\n heading: i18next.t('howTo.paymentHeading'),\n description: i18next.t('howTo.paymentDescription'),\n })\n : ''\n }\n ${TimelineItem({\n heading: i18next.t('howTo.finalHeading'),\n final: true,\n })}\n </ol>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">${i18next.t('howTo.finalDescription', {\n contactName: order?.contactInformation?.name,\n })}</p>\n </div>\n </div>\n`;\n};\n\nexport default HowTo;\n", "interface TimelineItemProps {\n heading?: string;\n description?: string;\n final?: boolean;\n}\n\nconst TimelineItem = ({ heading, description, final }: TimelineItemProps) => `\n <li class=\"waykeecom-timeline__item${final ? ' waykeecom-timeline__item--final' : ''}\">\n <div class=\"waykeecom-timeline__stage\">\n <div class=\"waykeecom-timeline__badge\"></div>\n </div>\n <div class=\"waykeecom-timeline__content\">\n ${heading ? `<div class=\"waykeecom-timeline__heading\">${heading}</div>` : ''}\n ${description ? `<div class=\"waykeecom-timeline__description\">${description}</div>` : ''}\n </div>\n </li>\n`;\n\nexport default TimelineItem;\n", "import i18next from '@i18n';\nimport { StageTypes } from '../../@types/Stages';\nimport { Vehicle } from '../../@types/Vehicle';\nimport ButtonArrowRight from '../../Components/Button/ButtonArrowRight';\nimport CheckList from '../../Components/Checklist/Checklist';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\nimport { getOrder } from '../../Data/getOrder';\nimport { goTo, setOrder, setStages } from '../../Redux/action';\nimport { WaykeStore } from '../../Redux/store';\nimport Alert from '../../Templates/Alert';\nimport ItemTileLarge from '../../Templates/ItemTileLarge';\nimport Loader from '../../Templates/Loader';\nimport { convertOrderOptionsResponse } from '../../Utils/convert';\nimport ecomEvent, { EcomEvent, EcomView } from '../../Utils/ecomEvent';\nimport { StageMapKeys, stageMap } from '../../Utils/stage';\nimport HowTo from './HowTo';\n\nconst PROCEED_BUTTON = 'preview-proceed';\nconst PROCEED_BUTTON_NODE = `${PROCEED_BUTTON}-node`;\nconst PREVIEW_CHECKLIST = 'preview-checklist';\nconst PREVIEW_CHECKLIST_NODE = `${PREVIEW_CHECKLIST}-node`;\n\ninterface PreviewProps {\n readonly store: WaykeStore;\n readonly stageOrderList: StageMapKeys[];\n readonly vehicle?: Vehicle;\n readonly cdnMedia?: string;\n}\n\nclass Preview extends HtmlNode {\n private readonly props: PreviewProps;\n private contexts: { buttonProceed?: ButtonArrowRight } = {};\n private requestError = false;\n\n constructor(element: HTMLElement, props: PreviewProps) {\n super(element);\n this.props = props;\n this.init();\n this.render();\n }\n\n async init() {\n this.requestError = false;\n this.render();\n\n const state = this.props.store.getState();\n try {\n this.contexts.buttonProceed?.disabled(true);\n\n const _order = await getOrder(state.id);\n const order = convertOrderOptionsResponse(_order);\n const stages: StageTypes[] = [];\n this.props.stageOrderList.forEach((key) => {\n if (key === 'centralStorage' && !order.requiresDealerSelection) return;\n if (key === 'tradeIn' && !order.allowsTradeIn) return;\n if (key === 'insurance' && !order.insuranceOption) return;\n if (key === 'accessories' && !order.accessories.length) return;\n\n stages.push(stageMap[key]);\n });\n\n setStages(stages)(this.props.store.dispatch);\n\n setOrder(order, this.props.vehicle)(this.props.store.dispatch);\n this.render();\n } catch (e) {\n this.requestError = true;\n this.render();\n throw e;\n }\n }\n\n private onProceed() {\n ecomEvent(EcomView.PREVIEW, EcomEvent.PREVIEW_PROCEED);\n goTo('main')(this.props.store.dispatch);\n }\n\n render() {\n const { store, cdnMedia } = this.props;\n const state = store.getState();\n\n if (!state.order) {\n this.node.innerHTML = `\n ${\n this.requestError\n ? Alert({\n tone: 'error',\n children: i18next.t('preview.error'),\n })\n : Loader()\n }\n `;\n return;\n }\n\n const notOrderable = state.order.isReserved || state.order.isUnavailable;\n\n if (notOrderable) {\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${i18next.t('preview.heading')}</h3>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n ${ItemTileLarge({\n vehicle: state.vehicle,\n order: state.order,\n cdnMedia,\n })}\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n ${Alert({\n tone: 'warning',\n children: i18next.t(\n state.order.isReserved ? 'preview.reserved' : 'preview.unavailable'\n ),\n })}\n </div>\n `;\n return;\n }\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n <h3 class=\"waykeecom-heading waykeecom-heading--3 waykeecom-no-margin\">${i18next.t('preview.heading')}</h3>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--3\">\n ${ItemTileLarge({\n vehicle: state.vehicle,\n order: state.order,\n cdnMedia,\n })}\n </div>\n ${HowTo({ order: state.order, stageOrderList: state.stages })}\n <div class=\"waykeecom-stack waykeecom-stack--3\" id=\"${PROCEED_BUTTON_NODE}\"></div>\n <footer class=\"waykeecom-footer\" id=\"${PREVIEW_CHECKLIST_NODE}\"></footer>\n `;\n\n this.contexts.buttonProceed = new ButtonArrowRight(\n document.querySelector<HTMLDivElement>(`#${PROCEED_BUTTON_NODE}`),\n {\n id: PROCEED_BUTTON,\n title: i18next.t('preview.proceedButton'),\n onClick: () => this.onProceed(),\n }\n );\n\n new CheckList(document.querySelector<HTMLDivElement>(`#${PREVIEW_CHECKLIST_NODE}`), {\n title: i18next.t('preview.checklistTitle'),\n ariaLabel: i18next.t('preview.checklistAriaLabel'),\n checklistItems: [\n i18next.t('preview.checklistItem1'),\n i18next.t('preview.checklistItem2'),\n i18next.t('preview.checklistItem3'),\n i18next.t('preview.checklistItem4'),\n ],\n });\n }\n}\n\nexport default Preview;\n", "import HtmlNode from './HtmlNode';\n\nclass StackNode extends HtmlNode {\n constructor(element: HTMLElement) {\n super(element, { htmlTag: 'div', className: 'waykeecom-stack waykeecom-stack--4' });\n }\n}\n\nexport default StackNode;\n", "import i18next from '@i18n';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\n\ninterface CentralStorageProps {\n readonly store: WaykeStore;\n readonly createdOrderId?: string;\n}\n\nclass Delivery extends StackNode {\n private readonly props: CentralStorageProps;\n\n constructor(element: HTMLElement, props: CentralStorageProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store } = this.props;\n const { dealer, order } = store.getState();\n\n const dealerName = order?.dealerSites.find((x) => x.id === dealer)?.name;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.centralStorageTitle')}</h4>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('summary.dealerSelection'),\n value: dealerName || '',\n })}\n </ul>\n </div>\n </div>\n `;\n }\n}\n\nexport default Delivery;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../@types/MarketCode';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\nimport { maskSSn, maskText } from '../../Utils/mask';\n\ninterface CustomerProps {\n readonly store: WaykeStore;\n readonly marketCode: MarketCode;\n}\n\nclass Customer extends StackNode {\n private readonly props: CustomerProps;\n constructor(element: HTMLElement, props: CustomerProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store } = this.props;\n const state = store.getState();\n\n const customerName =\n this.props.marketCode === 'SE'\n ? `${maskText(state.address?.givenName || '')} ${maskText(state.address?.surname || '')}`\n : `${state.address?.givenName} ${state.address?.surname || ''}`;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.customerTitle')}</h4>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('summary.customerName'),\n value: customerName,\n })}\n ${\n this.props.marketCode === 'SE'\n ? KeyValueListItem({\n key: i18next.t('summary.customerSSN'),\n value: maskSSn(state.customer.socialId),\n })\n : ''\n }\n ${KeyValueListItem({\n key: i18next.t('summary.customerAddress'),\n value: `\n ${customerName}<br />${state.address?.street}<br />${state.address?.postalCode} ${\n state.address?.city\n }\n `,\n })}\n ${KeyValueListItem({\n key: i18next.t('summary.customerEmail'),\n value: state.customer.email,\n })}\n ${KeyValueListItem({\n key: i18next.t('summary.customerPhone'),\n value: state.customer.phone,\n })}\n </ul>\n </div>\n </div>\n `;\n }\n}\n\nexport default Customer;\n", "import i18next from '@i18n';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\n\ninterface DeliveryProps {\n readonly store: WaykeStore;\n readonly createdOrderId?: string;\n}\n\nclass Centrallager extends StackNode {\n private readonly props: DeliveryProps;\n\n constructor(element: HTMLElement, props: DeliveryProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store } = this.props;\n const state = store.getState();\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.deliveryTitle')}</h4>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-stack waykeecom-stack--1\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('summary.deliveryMethod'),\n value: state.homeDelivery\n ? i18next.t('summary.homeDelivery')\n : i18next.t('summary.pickup'),\n })}\n </ul>\n </div>\n </div>\n `;\n }\n}\n\nexport default Centrallager;\n", "import i18next from '@i18n';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\n\ninterface IntroProps {\n readonly store: WaykeStore;\n}\n\nclass Intro extends StackNode {\n private readonly props: IntroProps;\n\n constructor(element: HTMLElement, props: IntroProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store } = this.props;\n const { customer, order, createdOrderId } = store.getState();\n const email = customer.email;\n const contactInformation = order?.contactInformation;\n\n if (createdOrderId) {\n this.node.innerHTML = `\n <h3 class=\"waykeecom-heading waykeecom-heading--3\">${i18next.t('summary.thankYou')}</h3>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-content\">\n <p class=\"waykeecom-content__p\">\n <span class=\"waykeecom-text waykeecom-text--font-medium\">${i18next.t('summary.whatHappensNext')}</span>\n </p>\n <ol class=\"waykeecom-content__ol\">\n <li class=\"waykeecom-content__li\">${i18next.t('summary.orderConfirmation', { email })}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('summary.contactFromDealer', { contactName: contactInformation?.name })}</li>\n <li class=\"waykeecom-content__li\">${i18next.t('summary.driveSafely')}</li>\n </ol>\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-disclaimer-text\">${i18next.t('summary.orderConfirmationDisclaimer')}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-heading waykeecom-heading--4\">${i18next.t('summary.orderNumber', { createdOrderId })}</div>\n </div>\n `;\n }\n }\n}\n\nexport default Intro;\n", "import i18next from '@i18n';\nimport { PaymentType } from '@wayke-se/ecom';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport ItemTileLarge from '../../Templates/ItemTileLarge';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\nimport { prettyNumber } from '../../Utils/format';\nimport { extractPaymentType } from '../Main/Financial/utils';\n\ninterface OrderProps {\n readonly store: WaykeStore;\n readonly cdnMedia?: string;\n}\n\nclass Order extends StackNode {\n private readonly props: OrderProps;\n\n constructor(element: HTMLElement, props: OrderProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store, cdnMedia } = this.props;\n const state = store.getState();\n\n const paymentLoan = state.order?.paymentOptions.find((x) => x.type === PaymentType.Loan);\n const paymentLookupResponse = state.paymentLookupResponse || paymentLoan?.loanDetails;\n const paymentLease = state.order?.paymentOptions.find((x) => x.type === PaymentType.Lease);\n const paymentType = extractPaymentType(state.paymentType)!;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.orderTitle')}</h4>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n ${ItemTileLarge({\n vehicle: state.vehicle,\n order: state.order,\n cdnMedia,\n meta: `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n ${\n paymentType === PaymentType.Loan && paymentLoan\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${i18next.t('summary.paymentMethod')}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <ul class=\"waykeecom-key-value-list\">\n ${\n paymentLookupResponse\n ? KeyValueListItem({\n key: paymentLoan.name || '???',\n value: prettyNumber(paymentLookupResponse.costs.monthlyCost, {\n postfix: i18next.t('summary.perMonth'),\n }),\n })\n : ``\n }\n </ul>\n </div>\n `\n : paymentType === PaymentType.Cash\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${i18next.t('summary.paymentMethod')}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('summary.cash'),\n value: prettyNumber(state.vehicle?.price, { postfix: 'kr' }),\n })}\n </ul>\n </div>\n `\n : paymentType === PaymentType.Lease\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${i18next.t('summary.paymentMethod')}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('summary.lease'),\n value: `${i18next.t('summary.from')} ${prettyNumber(paymentLease?.price, {\n postfix: paymentLease?.unit,\n })}`,\n })}\n </ul>\n </div>\n `\n : ''\n }\n </div>\n ${\n !!state.accessories.length\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${i18next.t('summary.accessories')}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <ul class=\"waykeecom-key-value-list\">\n ${state.accessories\n .map((accessory) =>\n KeyValueListItem({\n key: accessory.name,\n value: prettyNumber(accessory.price, { postfix: 'kr' }),\n })\n )\n .join('')}\n </ul>\n </div>\n </div>`\n : ''\n }\n ${\n state.insurance || state.freeInsurance\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n ${\n state.insurance\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${i18next.t('summary.insurance')}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: state.insurance.name,\n value: prettyNumber(state.insurance.price, {\n postfix: i18next.t('summary.perMonth'),\n }),\n })}\n ${\n state.insuranceAddOns?.addOns.length &&\n state.insuranceAddOns.insurance === state.insurance.name\n ? state.insuranceAddOns.addOns\n .map((addon) =>\n KeyValueListItem({\n key: addon.title,\n value: prettyNumber(addon.monthlyPrice, {\n postfix: i18next.t('summary.perMonth'),\n }),\n })\n )\n .join('')\n : ''\n }\n </ul>\n </div>\n `\n : ''\n }\n ${\n state.freeInsurance\n ? `\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${i18next.t('summary.insurance')}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: state.freeInsurance.title,\n value: i18next.t('summary.free'),\n })}\n </ul>\n </div>\n `\n : ''\n }\n </div>`\n : ''\n }\n \n `,\n })}\n </div>\n `;\n }\n}\n\nexport default Order;\n", "import i18next from '@i18n';\nimport { MarketCode } from '../../@types/MarketCode';\nimport StackNode from '../../Components/Extension/StackNode';\nimport { WaykeStore } from '../../Redux/store';\nimport KeyValueListItem from '../../Templates/KeyValueListItem';\nimport { translateTradeInCondition } from '../../Utils/constants';\nimport { prettyNumber } from '../../Utils/format';\n\ninterface TradeInProps {\n readonly store: WaykeStore;\n readonly marketCode: MarketCode;\n}\n\nclass TradeIn extends StackNode {\n private readonly props: TradeInProps;\n constructor(element: HTMLElement, props: TradeInProps) {\n super(element);\n this.props = props;\n this.render();\n }\n\n render() {\n const { store } = this.props;\n const state = store.getState();\n const { order, tradeIn, tradeInVehicle } = state;\n if (!order?.allowsTradeIn) return;\n\n this.node.innerHTML = `\n <div class=\"waykeecom-stack waykeecom-stack--4\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <h4 class=\"waykeecom-heading waykeecom-heading--4 waykeecom-no-margin\">${i18next.t('summary.tradeInTitle')}</h4>\n </div>\n \n ${\n tradeIn && tradeIn.condition && tradeInVehicle\n ? `<div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-balloon\">\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <div class=\"waykeecom-label\">${tradeIn.registrationNumber}</div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--05\">\n <span class=\"waykeecom-text waykeecom-text--font-medium\">${\n tradeInVehicle.manufacturer\n } ${tradeInVehicle.modelSeries}</span> ${tradeInVehicle.modelName} ${\n tradeInVehicle.modelYear\n }\n </div>\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <hr class=\"waykeecom-separator\" />\n </div>\n <div class=\"waykeecom-stack waykeecom-stack--2\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('summary.mileage'),\n value: `${tradeIn.mileage} ${this.props.marketCode === 'SE' ? 'mil' : 'km'}`,\n })}\n ${KeyValueListItem({\n key: i18next.t('summary.description'),\n value: `${tradeIn.description}`,\n })}\n ${KeyValueListItem({\n key: i18next.t('summary.condition'),\n value: translateTradeInCondition[tradeIn.condition],\n })}\n ${KeyValueListItem({\n key: i18next.t('summary.estimatedValue'),\n value: `~ ${prettyNumber(tradeInVehicle.valuation, { postfix: 'kr' })}`,\n })}\n </ul>\n </div>\n </div>\n </div>`\n : `<div class=\"waykeecom-stack waykeecom-stack--2\">\n <ul class=\"waykeecom-key-value-list\">\n ${KeyValueListItem({\n key: i18next.t('summary.tradeInTitle'),\n value: i18next.t('summary.no'),\n })}\n </ul>\n </div>`\n }\n </div>\n `;\n }\n}\n\nexport default TradeIn;\n", "import { MarketCode } from '../../@types/MarketCode';\nimport HtmlNode from '../../Components/Extension/HtmlNode';\nimport { WaykeStore } from '../../Redux/store';\nimport watch from '../../Redux/watch';\nimport ecomEvent, { EcomEvent, EcomView } from '../../Utils/ecomEvent';\nimport { scrollTop } from '../../Utils/scroll';\nimport CentralStorage from './CentralStorage';\nimport Customer from './Customer';\nimport Delivery from './Delivery';\nimport Intro from './Intro';\nimport Order from './Order';\nimport TradeIn from './TradeIn';\n\nconst SUMMARY_NODE = 'summary-node';\n\ninterface SummaryProps {\n readonly store: WaykeStore;\n readonly cdnMedia?: string;\n readonly onClose: () => void;\n readonly marketCode: MarketCode;\n}\n\nclass Summary extends HtmlNode {\n private readonly props: SummaryProps;\n\n constructor(element: HTMLElement, props: SummaryProps) {\n super(element);\n this.props = props;\n ecomEvent(EcomView.SUMMARY, EcomEvent.SUMMARY_ACTIVE);\n\n watch<number>(this.props.store, 'navigation.view', (view) => {\n if (view === 3) {\n this.render();\n scrollTop();\n }\n });\n\n watch(this.props.store, 'createdOrderId', () => {\n this.render();\n });\n\n this.render();\n scrollTop();\n }\n\n render() {\n const { store, cdnMedia } = this.props;\n const { stages } = store.getState();\n\n this.node.innerHTML = `\n <div id=\"${SUMMARY_NODE}\"></div>\n `;\n\n const content = this.node.querySelector<HTMLDivElement>(`#${SUMMARY_NODE}`);\n if (content) {\n new Intro(content, { store });\n new Order(content, { store, cdnMedia });\n if (stages?.find((x) => x.name === 'tradeIn')) {\n new TradeIn(content, { store, marketCode: this.props.marketCode });\n }\n\n if (stages?.find((x) => x.name === 'centralStorage')) {\n new CentralStorage(content, { store });\n }\n new Delivery(content, { store });\n new Customer(content, { store, marketCode: this.props.marketCode });\n }\n }\n}\n\nexport default Summary;\n", "import WaykeEcomWeb from './App';\n\nexport { EcomEvent, EcomStep, EcomView } from './Utils/ecomEvent';\n\nexport default WaykeEcomWeb;\n", "const createDefaultOrigin = () => {\n if (!window || !window.location)\n return undefined;\n const topic = window.location.host.replace(\"www.\", \"\");\n const channel = \"Web\";\n return {\n topic,\n channel,\n };\n};\nconst createDefaultConfig = () => {\n if (process.env.WAYKE_ECOM_API_ADDRESS) {\n return {\n api: {\n address: process.env.WAYKE_ECOM_API_ADDRESS,\n },\n origin: createDefaultOrigin(),\n };\n }\n return undefined;\n};\nclass Configuration {\n constructor() {\n this.config = createDefaultConfig();\n }\n static current() {\n if (Configuration.instance) {\n return Configuration.instance;\n }\n const instance = new Configuration();\n if (!instance.config) {\n throw Configuration.notBoundError;\n }\n Configuration.instance = instance;\n return Configuration.instance;\n }\n static bind(newConfig) {\n Configuration.instance = new Configuration();\n Configuration.instance.config = {\n api: {\n address: newConfig.api.address,\n },\n origin: newConfig.origin\n ? {\n topic: newConfig.origin.topic,\n channel: newConfig.origin.channel,\n }\n : createDefaultOrigin(),\n bankIdThumbprint: newConfig.bankIdThumbprint,\n };\n return Configuration.instance;\n }\n static destroy() {\n Configuration.instance = undefined;\n }\n getApiAddress() {\n if (!this.config) {\n throw Configuration.notBoundError;\n }\n return this.config.api.address;\n }\n getOrigin() {\n if (!this.config) {\n throw Configuration.notBoundError;\n }\n return this.config.origin;\n }\n useBankIdThumbprint() {\n if (!this.config) {\n throw Configuration.notBoundError;\n }\n return !!this.config.bankIdThumbprint;\n }\n getBankIdThumbprint() {\n if (!this.config) {\n throw Configuration.notBoundError;\n }\n return this.config.bankIdThumbprint;\n }\n}\nConfiguration.instance = undefined;\nConfiguration.notBoundError = new Error(\"Configuration not bound yet\");\nexport default Configuration;\n", "export class ResponseError extends Error {\n constructor(response, message) {\n super(message);\n this.response = response;\n Object.setPrototypeOf(this, ResponseError.prototype);\n }\n getResponse() {\n return this.response;\n }\n}\n", "export class VehicleUnavailableError extends Error {\n constructor() {\n super(\"The vehicle is not available for purchase\");\n Object.setPrototypeOf(this, VehicleUnavailableError.prototype);\n }\n}\n", "import { VehicleUnavailableError } from \"../../errors/vehicle-unavailable-error\";\nconst throwErrorByType = (errorBody) => {\n switch (errorBody.errorCode) {\n case 1:\n throw new VehicleUnavailableError();\n default:\n throw new Error(errorBody.message);\n }\n};\nconst handleResponseError = (error) => {\n const response = error.getResponse();\n return response.json().then(throwErrorByType);\n};\nexport default handleResponseError;\n", "export const BANK_ID_THUMBPRINT_HEADER = \"x-certificate-thumbprint\";\nclass HttpRequestBuilder {\n constructor() {\n this._method = \"get\";\n this._headers = {};\n this._body = null;\n }\n accept(acceptHeader) {\n this._headers.Accept = acceptHeader;\n return this;\n }\n method(method) {\n this._method = method;\n return this;\n }\n authorization(token) {\n this._headers.Authorization = `Bearer ${token}`;\n return this;\n }\n requestForgeryToken(token) {\n if (!token)\n throw new Error(\"Missing request forgery token\");\n this._headers[\"x-rf-token\"] = token;\n return this;\n }\n content(body, contentType = \"application/json\") {\n switch (contentType) {\n case \"application/json\":\n this._body = JSON.stringify(body);\n break;\n default:\n this._body = body;\n break;\n }\n if (contentType)\n this._headers[\"Content-Type\"] = contentType;\n return this;\n }\n bankIdThumbprint(thumbprint) {\n if (!thumbprint)\n throw new Error(\"Bank id thumbprint can not be falsy\");\n this._headers[BANK_ID_THUMBPRINT_HEADER] = thumbprint;\n return this;\n }\n build() {\n return {\n body: this._body,\n headers: this._headers,\n method: this._method,\n };\n }\n}\nexport default HttpRequestBuilder;\n", "import { ResponseError } from \"../errors/request-error\";\nimport handleResponseError from \"./apis/handle-response-error\";\nimport HttpRequestBuilder from \"./http-request-builder\";\nconst httpStatusCheck = (response, request) => {\n if (response.status >= 200 && response.status < 300) {\n return response;\n }\n if (process.env.NODE_ENV === \"development\") {\n console.group(`Asynchronous request failed!`);\n console.log(`URL was ${response.url}`);\n console.log(`Status code: ${response.status}`);\n console.log(`Request:`, request);\n console.groupEnd();\n }\n throw new ResponseError(response, String(response.status));\n};\nconst httpStateContext = {\n requestForgeryToken: undefined,\n};\nexport const context = () => ({ ...httpStateContext });\nexport const contextualize = (response) => {\n httpStateContext.requestForgeryToken =\n response.requestForgeryToken || httpStateContext.requestForgeryToken;\n return response;\n};\nexport const raw = (url, options) => fetch(url, options).then((response) => httpStatusCheck(response, options));\nconst noContentCodes = [\"202\", \"204\"];\nexport const json = (url, options) => raw(url, options)\n .then((response) => {\n if (noContentCodes.includes(String(response.status)))\n return null;\n return response.json();\n})\n .catch((err) => {\n if (err instanceof ResponseError) {\n return handleResponseError(err);\n }\n throw err;\n});\nexport const captureStateContext = (promise) => promise.then(contextualize);\nexport const builder = () => new HttpRequestBuilder();\n", "import * as http from \"../index\";\nconst buildLookupRequest = ({ requestForgeryToken, }) => http\n .builder()\n .method(\"get\")\n .accept(\"application/json\")\n .requestForgeryToken(requestForgeryToken)\n .build();\nconst validateResponse = (response) => {\n if (!response || !response.successful || !response.response) {\n throw new Error(\"The request did not succeed\");\n }\n return response.response;\n};\nexport const lookupAddress = (lookupRequest, config) => http\n .captureStateContext(http.json(`${config.getApiAddress()}/v2/address?SocialId=${lookupRequest.personalNumber}`, buildLookupRequest(http.context())))\n .then(validateResponse);\n", "export class AddressLookupRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validateRequest(request) {\n if (!request) {\n throw new Error(\"Missing address lookup request\");\n }\n if (!request.personalNumber) {\n throw new Error(\"Missing personal number in address lookup request\");\n }\n }\n forCustomer(personalNumber) {\n this.properties.personalNumber = personalNumber;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class AddressLookupResponse {\n constructor(response) {\n if (!response) {\n throw new Error(\"Missing address lookup response data\");\n }\n this.response = response;\n }\n getAddress() {\n return {\n city: this.response.city,\n name: this.response.name,\n givenName: this.response.givenName,\n surname: this.response.surname,\n postalCode: this.response.postalCode,\n street: this.response.street,\n street2: this.response.street2,\n distance: this.response.distance,\n };\n }\n}\n", "export class CustomerBuilder {\n constructor() {\n this.properties = {};\n }\n withAddress(address) {\n this.properties.address = address;\n this.properties.name = address.name;\n this.properties.givenName = address.givenName;\n this.properties.surname = address.surname;\n return this;\n }\n withPersonalNumber(personalNumber) {\n this.properties.personalNumber = personalNumber;\n return this;\n }\n withEmail(email) {\n this.properties.email = email;\n return this;\n }\n withPhoneNumber(phoneNumber) {\n this.properties.phoneNumber = phoneNumber;\n return this;\n }\n withGivenName(givenName) {\n this.properties.givenName = givenName;\n return this;\n }\n withSurname(surname) {\n this.properties.surname = surname;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "import Configuration from \"../config/index\";\nimport * as api from \"../http/apis/customers\";\nimport { AddressLookupRequestBuilder } from \"./address-lookup-request-builder\";\nimport { AddressLookupResponse } from \"./address-lookup-response\";\nimport { CustomerBuilder } from \"./customer-builder\";\nexport const newAddressLookupRequest = () => new AddressLookupRequestBuilder();\nexport const newCustomer = () => new CustomerBuilder();\nexport const lookupAddress = (request) => {\n AddressLookupRequestBuilder.validateRequest(request);\n return api\n .lookupAddress(request, Configuration.current())\n .then((response) => new AddressLookupResponse(response));\n};\n", "import * as http from \"../index\";\nconst buildInsuranceRequest = (request, { requestForgeryToken }) => {\n const content = {\n drivingDistance: request.drivingDistance,\n socialId: request.personalNumber,\n vehicleId: request.id,\n branchId: request.branchId,\n };\n return http\n .builder()\n .method(\"post\")\n .accept(\"application/json\")\n .requestForgeryToken(requestForgeryToken)\n .content(content)\n .build();\n};\nconst validateResponse = (response) => {\n if (!response || !response.successful || !response.response) {\n throw new Error(\"The request did not succeed\");\n }\n return response.response;\n};\nexport const find = (request, config) => http\n .captureStateContext(http.json(`${config.getApiAddress()}/v3/insurance`, buildInsuranceRequest(request, http.context())))\n .then(validateResponse);\n", "export class InsuranceOptionsRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validateRequest(request) {\n if (!request) {\n throw new Error(\"Missing insurance options request\");\n }\n if (!request.id) {\n throw new Error(\"Missing vehicle ID for insurance options request\");\n }\n if (!request.personalNumber) {\n throw new Error(\"Missing personal number for insurance options request\");\n }\n if (!request.drivingDistance) {\n throw new Error(\"Missing driving distance for insurance options request\");\n }\n }\n forVehicle(id) {\n this.properties.id = id;\n return this;\n }\n forDealer(id) {\n this.properties.branchId = id;\n return this;\n }\n forCustomer(personalNumber) {\n this.properties.personalNumber = personalNumber;\n return this;\n }\n withDrivingDistance(drivingDistance) {\n this.properties.drivingDistance = drivingDistance;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class InsuranceOptionsResponse {\n constructor(response) {\n if (!response) {\n throw new Error(\"Missing insurance options response data\");\n }\n this.response = response;\n }\n getInsuranceOptions() {\n return this.response.insurances;\n }\n}\n", "import Configuration from \"../config/index\";\nimport * as api from \"../http/apis/insurances\";\nimport { InsuranceOptionsRequestBuilder } from \"./insurance-options-request-builder\";\nimport { InsuranceOptionsResponse } from \"./insurance-options-response\";\nexport const newInsuranceOptionsRequest = () => new InsuranceOptionsRequestBuilder();\nexport const getOptions = (request) => {\n InsuranceOptionsRequestBuilder.validateRequest(request);\n return api\n .find(request, Configuration.current())\n .then((response) => new InsuranceOptionsResponse(response));\n};\n", "import * as http from \"../index\";\nconst buildOptionsRequest = () => http.builder().method(\"get\").accept(\"application/json\").build();\nconst buildCreateRequest = (request, config, { requestForgeryToken }) => {\n const content = {\n vehicleId: request.id,\n tradeIn: request.tradein,\n insurance: request.insurance\n ? {\n ...request.insurance,\n socialId: request.insurance.personalNumber\n ? request.insurance.personalNumber\n : request.customer.personalNumber,\n }\n : undefined,\n payment: request.payment,\n delivery: request.deliveryType,\n customer: {\n socialId: request.customer.personalNumber,\n email: request.customer.email,\n phone: request.customer.phoneNumber,\n name: request.customer.name,\n address: request.customer.address,\n givenName: request.customer.givenName,\n surname: request.customer.surname,\n },\n accessories: request.accessories,\n urls: request.urls,\n origin: config.getOrigin(),\n };\n return http\n .builder()\n .method(\"post\")\n .accept(\"application/json\")\n .requestForgeryToken(requestForgeryToken)\n .content(content)\n .build();\n};\nconst validateOptionsResponse = (response) => {\n if (!response || !response.successful || !response.response) {\n throw new Error(\"The request did not succeed\");\n }\n return response.response;\n};\nconst validateCreateResponse = (response) => {\n if (!response || !response.successful || !response.response) {\n throw new Error(\"The request did not succeed\");\n }\n return response.response;\n};\nconst getInitUrl = ({ id, branchId }) => {\n const url = `/v3/orders/new?vehicleId=${id}`;\n if (!branchId)\n return url;\n return `${url}&branchId=${branchId}`;\n};\nexport const init = (request, config) => http\n .captureStateContext(http.json(`${config.getApiAddress()}${getInitUrl(request)}`, buildOptionsRequest()))\n .then(validateOptionsResponse);\nconst getCreateUrl = () => \"/v3/orders\";\nexport const create = (request, config) => http\n .captureStateContext(http.json(`${config.getApiAddress()}${getCreateUrl()}`, buildCreateRequest(request, config, http.context())))\n .then(validateCreateResponse);\n", "export class InsuranceBuilder {\n constructor() {\n this.properties = {};\n }\n forPersonalNumber(personalNumber) {\n this.properties.personalNumber = personalNumber;\n return this;\n }\n withDrivingDistance(drivingDistance) {\n this.properties.drivingDistance = drivingDistance;\n return this;\n }\n withAddOns(addons) {\n this.properties.addons = addons;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class OrderCreateRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validateRequest(request) {\n if (!request) {\n throw new Error(\"Missing order creation request\");\n }\n if (!request.id) {\n throw new Error(\"Missing vehicle ID in order creation request\");\n }\n if (!request.customer) {\n throw new Error(\"Missing customer in order creation request\");\n }\n if (!request.payment) {\n throw new Error(\"Missing payment in order creation request\");\n }\n if (!request.deliveryType) {\n throw new Error(\"Missing delivery type in order creation request\");\n }\n }\n forVehicle(id) {\n this.properties.id = id;\n return this;\n }\n withAccessories(accessories) {\n this.properties.accessories = accessories.map((a) => {\n return { id: a.id };\n });\n return this;\n }\n withCustomer(customer) {\n this.properties.customer = customer;\n return this;\n }\n withPayment(payment) {\n this.properties.payment = payment;\n return this;\n }\n withDeliveryType(deliveryType) {\n this.properties.deliveryType = deliveryType;\n return this;\n }\n withInsurance(insurance) {\n this.properties.insurance = insurance;\n return this;\n }\n withTradeIn(tradein) {\n this.properties.tradein = tradein;\n return this;\n }\n withUrls(redirect, payment) {\n this.properties.urls = { redirect, payment };\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class OrderCreateResponse {\n constructor(response) {\n if (!response) {\n throw new Error(\"Missing order create response data\");\n }\n this.response = response;\n }\n getId() {\n return this.response.id;\n }\n getPayment() {\n return this.response.payment;\n }\n getOrderNumber() {\n return this.response.orderNumber;\n }\n}\n", "export class OrderOptionsRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validateRequest(request) {\n if (!request) {\n throw new Error(\"Missing order setup request\");\n }\n if (!request.id) {\n throw new Error(\"Missing vehicle ID in order setup request\");\n }\n }\n forVehicle(id) {\n this.properties.id = id;\n return this;\n }\n forDealer(id) {\n this.properties.branchId = id;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class PaymentLookupResponse {\n constructor(response) {\n if (!response) {\n throw new Error(\"Missing payment lookup response data\");\n }\n this.response = response;\n }\n getCosts() {\n return {\n monthlyCost: this.response.monthlyCost,\n totalCreditCost: this.response.totalCreditCost,\n };\n }\n getFees() {\n return {\n setupFee: this.response.setupFee,\n administrationFee: this.response.administrationFee,\n };\n }\n getInterests() {\n return {\n interest: this.response.interest,\n effectiveInterest: this.response.effectiveInterest,\n };\n }\n getDurationSpec() {\n return this.response.duration;\n }\n getDownPaymentSpec() {\n return this.response.downPayment;\n }\n getResidualValueSpec() {\n return this.response.residual;\n }\n getTotalResidualValue() {\n return this.response.totalResidualValue;\n }\n getPublicURL() {\n return this.response.link;\n }\n shouldUseCreditScoring() {\n return this.response.useCreditScoring;\n }\n getFinancialProductCode() {\n return this.response.financialProductCode;\n }\n getPrice() {\n return this.response.vehiclePrice;\n }\n getCreditAmount() {\n return this.response.loanAmount;\n }\n hasPrivacyPolicy() {\n return !!this.response.privacyPolicyUrl;\n }\n getPrivacyPolicyUrl() {\n return this.response.privacyPolicyUrl;\n }\n hasMoneyLaunderingInformationURL() {\n return !!this.response.moneyLaunderingInformationUrl;\n }\n getMoneyLaunderingInformationURL() {\n return this.response.moneyLaunderingInformationUrl;\n }\n hasFinancialOptionId() {\n return !!this.response.financialOptionId;\n }\n getFinancialOptionId() {\n return this.response.financialOptionId;\n }\n}\n", "import { PaymentLookupResponse } from \"../payments/payment-lookup-response\";\nexport class OrderOptionsResponse {\n constructor(response) {\n if (!response) {\n throw new Error(\"Missing order options response data\");\n }\n this.response = response;\n }\n getOrderVehicle() {\n return this.response.vehicle;\n }\n getAccessories() {\n if (!this.response.accessories || !this.response.accessories.length) {\n return [];\n }\n return this.response.accessories.map((accessory) => ({\n id: accessory.id,\n articleNumber: accessory.articleNumber,\n logoUrl: accessory.logoUrl,\n longDescription: accessory.longDescription,\n shortDescription: accessory.shortDescription,\n manufacturer: accessory.manufacturer,\n model: accessory.model,\n name: accessory.name,\n price: accessory.price,\n assemblyPrice: accessory.assemblyPrice,\n salePrice: accessory.salePrice,\n productPageLink: accessory.productPageLink,\n productPageLinkText: accessory.productPageLinkText,\n media: accessory.media\n ? accessory.media.map((m) => {\n return {\n externalId: m.externalId,\n sortOrder: m.sortOrder,\n url: m.url,\n };\n })\n : [],\n }));\n }\n requiresDealerSelection() {\n return this.response.dealers && this.response.dealers.length > 1;\n }\n getDealerSites() {\n if (!this.response.dealers || !this.response.dealers.length) {\n return [];\n }\n return this.response.dealers;\n }\n getPaymentOptions() {\n if (!this.response.payment || !this.response.payment.length) {\n return [];\n }\n return this.response.payment.map((payment) => ({\n loanDetails: payment.loanDetails\n ? new PaymentLookupResponse(payment.loanDetails)\n : undefined,\n logo: payment.logo,\n name: payment.name,\n price: payment.price,\n type: payment.type,\n unit: payment.unit,\n externalId: payment.externalId,\n }));\n }\n getDeliveryOptions() {\n if (!this.response.delivery || !this.response.delivery.length) {\n return [];\n }\n return this.response.delivery.map((delivery) => ({\n type: delivery.type,\n deliveryTime: delivery.deliveryTime,\n startupCost: delivery.startupCost,\n unitPrice: delivery.unitPrice,\n unit: delivery.unit,\n minQuantity: delivery.minQuantity,\n maxQuantity: delivery.maxQuantity,\n }));\n }\n getInsuranceOption() {\n return this.response.insurance\n ? {\n institute: this.response.insurance.institute,\n identifier: this.response.insurance.identifier,\n longDescription: this.response.insurance.longDescription,\n description: this.response.insurance.description,\n logo: this.response.insurance.logo,\n title: this.response.insurance.title,\n url: this.response.insurance.url,\n ecomInsuranceText: this.response.insurance.ecomInsuranceText,\n requiresDistance: this.response.insurance.requiresDistance,\n requiresPersonalNumber: this.response.insurance\n .requiresPersonalNumber,\n }\n : undefined;\n }\n getOrderConditions() {\n return this.response.conditions;\n }\n getOrderReturnConditions() {\n return this.response.returnConditions;\n }\n getConditionsPdfUri() {\n return this.response.conditionsPdfUri;\n }\n getContactInformation() {\n return this.response.contactInformation;\n }\n allowsTradeIn() {\n return this.response.tradeIn;\n }\n isUnavailable() {\n return this.response.unavailable;\n }\n isReserved() {\n return !!this.response.reserved;\n }\n isPaymentRequired() {\n return this.response.paymentRequired;\n }\n}\n", "export class PaymentBuilder {\n constructor() {\n this.properties = {};\n }\n withType(paymentType) {\n this.properties.type = paymentType;\n return this;\n }\n withDuration(duration) {\n this.properties.months = duration;\n return this;\n }\n withDownPayment(downPayment) {\n this.properties.downPayment = downPayment;\n return this;\n }\n withResidualValue(residualValue) {\n this.properties.residualValue = residualValue;\n return this;\n }\n withExternalId(externalId) {\n this.properties.externalId = externalId;\n return this;\n }\n withCreditAssessment(creditAssessment) {\n this.properties.creditAssessment = creditAssessment;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class OrderCreditAssessmentBuilder {\n constructor() {\n this.properties = {};\n }\n withScoreId(scoreId) {\n this.properties.scoreId = scoreId;\n return this;\n }\n withFinancialProductCode(code) {\n this.properties.financialProductCode = code;\n return this;\n }\n withRecommendation(recommendation) {\n this.properties.recommendation = recommendation;\n return this;\n }\n withDecision(decision) {\n this.properties.decision = decision;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "import Configuration from \"../config/index\";\nimport * as api from \"../http/apis/orders\";\nimport { InsuranceBuilder } from \"./insurance-builder\";\nimport { OrderCreateRequestBuilder } from \"./order-create-request-builder\";\nimport { OrderCreateResponse } from \"./order-create-response\";\nimport { OrderOptionsRequestBuilder } from \"./order-options-request-builder\";\nimport { OrderOptionsResponse } from \"./order-options-response\";\nimport { PaymentBuilder } from \"./payment-builder\";\nimport { OrderCreditAssessmentBuilder } from \"./order-credit-assessment-builder\";\nexport const newOptionsRequest = () => new OrderOptionsRequestBuilder();\nexport const newCreateRequest = () => new OrderCreateRequestBuilder();\nexport const newInsurance = () => new InsuranceBuilder();\nexport const newPayment = () => new PaymentBuilder();\nexport const newCreditAssessment = () => new OrderCreditAssessmentBuilder();\nexport const getOptions = (request) => {\n OrderOptionsRequestBuilder.validateRequest(request);\n return api\n .init(request, Configuration.current())\n .then((response) => new OrderOptionsResponse(response));\n};\nexport const create = (request) => {\n OrderCreateRequestBuilder.validateRequest(request);\n return api\n .create(request, Configuration.current())\n .then((response) => new OrderCreateResponse(response));\n};\n", "import * as http from \"../index\";\nconst buildLookupRequest = (lookupRequest) => {\n const content = {\n branchId: lookupRequest.branchId,\n duration: lookupRequest.duration,\n downPayment: lookupRequest.downPayment,\n residual: lookupRequest.residual,\n financialOptionId: lookupRequest.financialOptionId,\n };\n return http\n .builder()\n .method(\"post\")\n .accept(\"application/json\")\n .content(content)\n .build();\n};\nconst validateResponse = (response) => {\n if (!response || !response.successful || !response.response) {\n throw new Error(\"The request did not succeed\");\n }\n return response.response;\n};\nexport const lookup = (lookupRequest, config) => http\n .json(`${config.getApiAddress()}/payment/${lookupRequest.id}`, buildLookupRequest(lookupRequest))\n .then(validateResponse);\n", "export class PaymentLookupRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validateRequest(request) {\n if (!request) {\n throw new Error(\"Missing payment lookup request\");\n }\n if (!request.id) {\n throw new Error(\"Missing vehicle ID in payment lookup request\");\n }\n if (!request.duration || request.duration < 1) {\n throw new Error(\"Missing month duration in payment lookup request\");\n }\n if (!request.downPayment || request.downPayment < 1) {\n throw new Error(\"Missing cash deposit in payment lookup request\");\n }\n }\n forVehicle(id) {\n this.properties.id = id;\n return this;\n }\n forDealer(id) {\n this.properties.branchId = id;\n return this;\n }\n withDuration(duration) {\n this.properties.duration = duration;\n return this;\n }\n withDownPayment(downPayment) {\n this.properties.downPayment = downPayment;\n return this;\n }\n withResidualValue(residual) {\n this.properties.residual = residual;\n return this;\n }\n withFinancialOptionId(financialOptionId) {\n this.properties.financialOptionId = financialOptionId;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "import Configuration from \"../config/index\";\nimport * as api from \"../http/apis/payments\";\nimport { PaymentLookupRequestBuilder } from \"./payment-lookup-request-builder\";\nimport { PaymentLookupResponse } from \"./payment-lookup-response\";\nexport const newLookupRequest = () => new PaymentLookupRequestBuilder();\nexport const lookupPayment = (request) => {\n PaymentLookupRequestBuilder.validateRequest(request);\n return api\n .lookup(request, Configuration.current())\n .then((response) => new PaymentLookupResponse(response));\n};\n", "import * as http from \"../index\";\nconst buildLookupRequest = ({ requestForgeryToken, }) => http\n .builder()\n .method(\"get\")\n .accept(\"application/json\")\n .requestForgeryToken(requestForgeryToken)\n .build();\nconst validateResponse = (response) => {\n if (!response || !response.successful || !response.response) {\n throw new Error(\"The request did not succeed\");\n }\n return response.response;\n};\nexport const lookup = (request, config) => http\n .captureStateContext(http.json(`${config.getApiAddress()}/v2/tradein/${request.registrationNumber}?mileage=${request.mileage}&condition=${request.condition}`, buildLookupRequest(http.context())))\n .then(validateResponse);\n", "export class VehicleLookupRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validateRequest(request) {\n if (!request) {\n throw new Error(\"Missing vehicle lookup request\");\n }\n if (!request.registrationNumber) {\n throw new Error(\"Missing registration number in vehicle lookup request\");\n }\n if (request.mileage && !request.condition) {\n throw new Error(\"Missing vehicle condition for valuation in vehicle lookup request\");\n }\n if (request.condition && !request.mileage) {\n throw new Error(\"Missing mileage for valuation in vehicle lookup request\");\n }\n }\n withRegistrationNumber(registrationNumber) {\n this.properties.registrationNumber = registrationNumber;\n return this;\n }\n withMileage(mileage) {\n this.properties.mileage = mileage;\n return this;\n }\n withCondition(condition) {\n this.properties.condition = condition;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class VehicleLookupResponse {\n constructor(response, registrationNumber) {\n if (!response) {\n throw new Error(\"Missing vehicle lookup response data\");\n }\n this.response = response;\n this.registrationNumber = registrationNumber;\n }\n getVehicle() {\n return {\n manufacturer: this.response.manufacturer,\n modelName: this.response.modelName,\n modelSeries: this.response.modelSeries,\n modelYear: this.response.modelYear,\n valuation: this.response.valuation,\n };\n }\n}\n", "export class VehicleTradeBuilder {\n constructor() {\n this.properties = {};\n }\n forVehicle(registrationNumber) {\n this.properties.registrationNumber = registrationNumber;\n return this;\n }\n withMileage(mileage) {\n this.properties.mileage = mileage;\n return this;\n }\n withCondition(condition) {\n this.properties.condition = condition;\n return this;\n }\n withComment(comment) {\n this.properties.comments = comment;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "import Configuration from \"../config/index\";\nimport * as api from \"../http/apis/vehicles\";\nimport { VehicleLookupRequestBuilder } from \"./vehicle-lookup-request-builder\";\nimport { VehicleLookupResponse } from \"./vehicle-lookup-response\";\nimport { VehicleTradeBuilder } from \"./vehicle-trade-builder\";\nexport const newLookupRequest = () => new VehicleLookupRequestBuilder();\nexport const newVehicleTrade = () => new VehicleTradeBuilder();\nexport const lookupVehicle = (request) => {\n VehicleLookupRequestBuilder.validateRequest(request);\n return api\n .lookup(request, Configuration.current())\n .then((response) => new VehicleLookupResponse(response, request.registrationNumber));\n};\n", "export var AuthMethod;\n(function (AuthMethod) {\n AuthMethod[\"SameDevice\"] = \"SameDevice\";\n AuthMethod[\"QrCode\"] = \"QrCode\";\n})(AuthMethod || (AuthMethod = {}));\nexport var AuthStatus;\n(function (AuthStatus) {\n AuthStatus[\"Pending\"] = \"pending\";\n AuthStatus[\"Failed\"] = \"failed\";\n AuthStatus[\"Complete\"] = \"complete\";\n AuthStatus[\"Unknown\"] = \"unknown\";\n})(AuthStatus || (AuthStatus = {}));\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nexport const createRequest = () => {\n const requestForgeryToken = http.context().requestForgeryToken;\n const builder = http\n .builder()\n .method(\"post\")\n .accept(\"application/json\")\n .requestForgeryToken(requestForgeryToken);\n if (Configuration.current().useBankIdThumbprint()) {\n const thumbprint = Configuration.current().getBankIdThumbprint();\n builder.bankIdThumbprint(thumbprint);\n }\n const request = builder.build();\n return request;\n};\n", "import { AuthMethod, } from \"../../../bankid/types\";\nimport * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nimport { createRequest } from \"./utils\";\nconst getRoute = (method) => {\n switch (method) {\n case AuthMethod.QrCode:\n return \"/qr-code\";\n case AuthMethod.SameDevice:\n return \"/same-device\";\n default:\n throw new Error(\"BankId auth method not supported\");\n }\n};\nexport const getUrl = (requestOptions) => {\n const route = getRoute(requestOptions.method);\n const host = Configuration.current().getApiAddress();\n const url = `${host}/bankid/auth${route}`;\n return url;\n};\nexport const auth = (requestOptions) => {\n const url = getUrl(requestOptions);\n const request = createRequest();\n return http.captureStateContext(http.json(url, request));\n};\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nimport { createRequest } from \"./utils\";\nexport const getUrl = (orderRef) => {\n const host = Configuration.current().getApiAddress();\n const url = `${host}/bankid/collect/${orderRef}`;\n return url;\n};\nexport const collect = (requestOptions) => {\n const url = getUrl(requestOptions.orderRef);\n const request = createRequest();\n return http.captureStateContext(http.json(url, request));\n};\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nimport { createRequest } from \"./utils\";\nexport const getUrl = (orderRef) => {\n const host = Configuration.current().getApiAddress();\n const url = `${host}/bankid/cancel/${orderRef}`;\n return url;\n};\nexport const cancel = (requestOptions) => {\n const url = getUrl(requestOptions.orderRef);\n const request = createRequest();\n return http.raw(url, request);\n};\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nimport { createRequest } from \"./utils\";\nexport const getUrl = (orderRef) => {\n const host = Configuration.current().getApiAddress();\n const url = `${host}/bankid/auth/${orderRef}/qr-code/refresh`;\n return url;\n};\nexport const refresh = (requestOptions) => {\n const url = getUrl(requestOptions.orderRef);\n const request = createRequest();\n return http.captureStateContext(http.json(url, request));\n};\n", "import { auth as doAuthRequest } from \"./bankid/auth\";\nimport { collect as doCollectRequest } from \"./bankid/collect\";\nimport { cancel as doCancelRequest } from \"./bankid/cancel\";\nimport { refresh as doQrCodeRefreshRequest } from \"./bankid/qrcode\";\nconst validate = (response) => {\n if (!response || !response.successful || !response.response) {\n throw new Error(\"The request did not succeed\");\n }\n return response.response;\n};\nexport const auth = (requestOptions) => doAuthRequest(requestOptions).then(validate);\nexport const collect = (requestOptions) => doCollectRequest(requestOptions).then(validate);\nexport const cancel = (requestOptions) => doCancelRequest(requestOptions).then(() => true);\nexport const qrcode = (requestOptions) => doQrCodeRefreshRequest(requestOptions).then(validate);\n", "export class BankIdAuthRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validate(request) {\n if (!request) {\n throw new Error(\"Request can not be falsy\");\n }\n if (!request.method) {\n throw new Error(\"Missing auth method\");\n }\n }\n withMethod(method) {\n this.properties.method = method;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "import { AuthMethod, } from \"./types\";\nexport class BankIdAuthResponse {\n constructor(response, method) {\n if (!response) {\n throw new Error(\"Response can not be falsy\");\n }\n if (!method) {\n throw new Error(\"Method can not be falsy\");\n }\n this.orderRef = response.orderRef;\n this.qrCodeAsBase64 = response.qrCodeAsBase64;\n this.autoLaunchUrl = response.autoLaunchUrl;\n this.method = method;\n }\n getMethod() {\n return this.method;\n }\n isQrCode() {\n return this.method === AuthMethod.QrCode;\n }\n isSameDevice() {\n return this.method === AuthMethod.SameDevice;\n }\n getOrderRef() {\n return this.orderRef;\n }\n getQrCode() {\n if (!this.isQrCode()) {\n throw new Error(\"Not qr code response\");\n }\n return this.qrCodeAsBase64;\n }\n getAutoLaunchUrl() {\n if (!this.isSameDevice()) {\n throw new Error(\"Not same device response\");\n }\n return this.autoLaunchUrl;\n }\n}\n", "export class BankIdCollectRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validate(request) {\n if (!request) {\n throw new Error(\"Request can not be falsy\");\n }\n if (!request.orderRef) {\n throw new Error(\"Missing order ref\");\n }\n }\n withOrderRef(orderRef) {\n this.properties.orderRef = orderRef;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "const outstandingTransaction = () => \"Starta BankID-appen.\";\nconst noClient = () => \"Starta BankID-appen.\";\nconst started = () => \"Söker efter BankID, det kan ta en liten stund... Om det har gått några sekunder och inget BankID har hittats har du sannolikt inget BankID som går att använda för den aktuella identifieringen/underskriften i den här enheten. Om du inte har något BankID kan du hämta ett hos din internetbank.\";\nconst userSign = () => \"Skriv in din säkerhetskod i BankID-appen och välj Legitimera eller Skriv under.\";\nconst expiredTransaction = () => \"BankID-appen svarar inte. Kontrollera att den är startad och att du har internetanslutning. Om du inte har något giltigt BankID kan du hämta ett hos din Bank. Försök sedan igen.\";\nconst certificateErr = () => \"Det BankID du försöker använda är för gammalt eller spärrat. Använd ett annat BankID eller hämta ett nytt hos din internetbank.\";\nconst userCancel = () => \"Åtgärden avbruten.\";\nconst cancelled = () => \"Åtgärden avbruten. Försök igen.\";\nconst startFailed = () => \"Starta BankID-appen.\";\nconst resolvers = {};\nresolvers[\"outstandingTransaction\"] = outstandingTransaction;\nresolvers[\"noClient\"] = noClient;\nresolvers[\"started\"] = started;\nresolvers[\"userSign\"] = userSign;\nresolvers[\"expiredTransaction\"] = expiredTransaction;\nresolvers[\"certificateErr\"] = certificateErr;\nresolvers[\"userCancel\"] = userCancel;\nresolvers[\"cancelled\"] = cancelled;\nresolvers[\"startFailed\"] = startFailed;\nexport default (hintCode) => {\n if (!hintCode) {\n return \"\";\n }\n const resolve = resolvers[hintCode];\n if (!resolve) {\n return \"\";\n }\n const message = resolve();\n return message;\n};\n", "import { AuthStatus, } from \"./types\";\nimport resolveMessage from \"./message-resolver\";\nexport class BankIdCollectResponse {\n constructor(response) {\n if (!response) {\n throw new Error(\"Response can not be falsy\");\n }\n this.orderRef = response.orderRef;\n this.status = this.parseStatus(response.status);\n this.hintCode = response.hintCode;\n this.message = resolveMessage(response.hintCode);\n if (this.isCompleted() && !!response.completionData) {\n this.personalNumber = response.completionData.personalNumber;\n this.address = response.completionData.address;\n }\n }\n parseStatus(status) {\n switch (status) {\n case \"pending\":\n return AuthStatus.Pending;\n case \"complete\":\n return AuthStatus.Complete;\n case \"failed\":\n return AuthStatus.Failed;\n default:\n return AuthStatus.Unknown;\n }\n }\n getOrderRef() {\n return this.orderRef;\n }\n getStatus() {\n return this.status;\n }\n isPending() {\n return this.status === AuthStatus.Pending;\n }\n getHintCode() {\n return this.hintCode;\n }\n hasMessage() {\n return !!this.message;\n }\n getMessage() {\n return this.message;\n }\n shouldRenew() {\n return (this.hintCode === BankIdCollectResponse.START_FAILED_CODE ||\n this.hintCode === BankIdCollectResponse.USER_CANCEL_CODE);\n }\n isCompleted() {\n return this.status === AuthStatus.Complete;\n }\n getPersonalNumber() {\n return this.personalNumber;\n }\n getAddress() {\n return this.address;\n }\n}\nBankIdCollectResponse.START_FAILED_CODE = \"startFailed\";\nBankIdCollectResponse.USER_CANCEL_CODE = \"userCancel\";\n", "export class BankIdCancelRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validate(request) {\n if (!request) {\n throw new Error(\"Request can not be falsy\");\n }\n if (!request.orderRef) {\n throw new Error(\"Missing order ref\");\n }\n }\n withOrderRef(orderRef) {\n this.properties.orderRef = orderRef;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class BankIdQrCodeRequestBuilder {\n constructor() {\n this.properties = {};\n }\n static validate(request) {\n if (!request) {\n throw new Error(\"Request can not be falsy\");\n }\n if (!request.orderRef) {\n throw new Error(\"Missing orderRef\");\n }\n }\n withOrderRef(orderRef) {\n this.properties.orderRef = orderRef;\n return this;\n }\n build() {\n return this.properties;\n }\n}\n", "export class BankIdQrCodeResponse {\n constructor(response) {\n if (!response) {\n throw new Error(\"Response can not be falsy\");\n }\n if (!response.orderRef) {\n throw new Error(\"Response is missing an orderRef\");\n }\n if (!response.qrCodeAsBase64) {\n throw new Error(\"Response is missing a QR code\");\n }\n this.orderRef = response.orderRef;\n this.qrCodeAsBase64 = response.qrCodeAsBase64;\n }\n getOrderRef() {\n return this.orderRef;\n }\n getQrCode() {\n return this.qrCodeAsBase64;\n }\n}\n", "import * as api from \"../http/apis/bankid\";\nimport { BankIdAuthRequestBuilder } from \"./bankid-auth-request-builder\";\nimport { BankIdAuthResponse } from \"./bankid-auth-response\";\nimport { BankIdCollectRequestBuilder } from \"./bankid-collect-request-builder\";\nimport { BankIdCollectResponse } from \"./bankid-collect-response\";\nimport { BankIdCancelRequestBuilder } from \"./bankid-cancel-request-builder\";\nimport { BankIdQrCodeRequestBuilder } from \"./bankid-qrcode-request-builder\";\nimport { BankIdQrCodeResponse } from \"./bankid-qrcode-response\";\nexport const newAuthRequest = () => new BankIdAuthRequestBuilder();\nexport const newCollectRequest = () => new BankIdCollectRequestBuilder();\nexport const newCancelRequest = () => new BankIdCancelRequestBuilder();\nexport const newQrCodeRequest = () => new BankIdQrCodeRequestBuilder();\nexport const auth = (request) => {\n BankIdAuthRequestBuilder.validate(request);\n return api\n .auth(request)\n .then((response) => new BankIdAuthResponse(response, request.method));\n};\nexport const collect = (request) => {\n BankIdCollectRequestBuilder.validate(request);\n return api\n .collect(request)\n .then((response) => new BankIdCollectResponse(response));\n};\nexport const cancel = (request) => {\n BankIdCancelRequestBuilder.validate(request);\n return api.cancel(request);\n};\nexport const qrcode = (request) => {\n BankIdQrCodeRequestBuilder.validate(request);\n return api\n .qrcode(request)\n .then((response) => new BankIdQrCodeResponse(response));\n};\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nexport const requestCaseStatus = (caseId) => {\n const host = Configuration.current().getApiAddress();\n const url = `${host}/credit-assessment/${caseId}`;\n const forgeryToken = http.context().requestForgeryToken;\n const request = http\n .builder()\n .method(\"get\")\n .accept(\"application/json\")\n .requestForgeryToken(forgeryToken)\n .build();\n return http.captureStateContext(http.json(url, request));\n};\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nexport const requestNewCase = (inquery) => {\n const host = Configuration.current().getApiAddress();\n const url = `${host}/credit-assessment/v2`;\n const forgeryToken = http.context().requestForgeryToken;\n const request = http\n .builder()\n .method(\"post\")\n .accept(\"application/json\")\n .requestForgeryToken(forgeryToken)\n .content(inquery)\n .build();\n return http.captureStateContext(http.json(url, request));\n};\n", "import { AuthMethod } from \"../../../bankid/types\";\nimport * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nconst getRoute = (method) => {\n switch (method) {\n case AuthMethod.QrCode:\n return \"/qr-code\";\n case AuthMethod.SameDevice:\n return \"/same-device\";\n default:\n throw new Error(\"BankId auth method not supported\");\n }\n};\nexport const getUrl = (requestOptions) => {\n const route = getRoute(requestOptions.method);\n const host = Configuration.current().getApiAddress();\n const url = `${host}/credit-assessment/sign/${requestOptions.caseId}${route}`;\n return url;\n};\nexport const requestSignCase = (requestOptions) => {\n const url = getUrl(requestOptions);\n const forgeryToken = http.context().requestForgeryToken;\n const request = http\n .builder()\n .method(\"post\")\n .accept(\"application/json\")\n .requestForgeryToken(forgeryToken)\n .build();\n return http.captureStateContext(http.json(url, request));\n};\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nexport const requestCancelSignCase = (caseId) => {\n const host = Configuration.current().getApiAddress();\n const url = `${host}/credit-assessment/sign/${caseId}`;\n const forgeryToken = http.context().requestForgeryToken;\n const request = http\n .builder()\n .method(\"delete\")\n .requestForgeryToken(forgeryToken)\n .build();\n return http.raw(url, request);\n};\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nexport const requestDeclineCase = (caseId) => {\n const host = Configuration.current().getApiAddress();\n const url = `${host}/credit-assessment/${caseId}`;\n const forgeryToken = http.context().requestForgeryToken;\n const request = http\n .builder()\n .method(\"delete\")\n .requestForgeryToken(forgeryToken)\n .build();\n return http.raw(url, request);\n};\n", "import * as http from \"../../index\";\nimport Configuration from \"../../../config/index\";\nexport const requestAcceptCase = (caseId) => {\n const host = Configuration.current().getApiAddress();\n const url = `${host}/credit-assessment/${caseId}/accept`;\n const forgeryToken = http.context().requestForgeryToken;\n const request = http\n .builder()\n .method(\"put\")\n .requestForgeryToken(forgeryToken)\n .build();\n return http.raw(url, request);\n};\n", "import { requestCaseStatus } from \"./credit-assessment/get-status\";\nimport { requestNewCase } from \"./credit-assessment/new-case\";\nimport { requestSignCase } from \"./credit-assessment/sign\";\nimport { requestCancelSignCase } from \"./credit-assessment/cancel-sign\";\nimport { requestDeclineCase } from \"./credit-assessment/decline\";\nimport { requestAcceptCase } from \"./credit-assessment/accept\";\nconst validate = (response) => {\n if (!response || !response.successful || !response.response) {\n throw new Error(\"The request did not succeed\");\n }\n return response.response;\n};\nexport const newCase = (inquiry) => requestNewCase(inquiry).then(validate);\nexport const getStatus = (caseId) => requestCaseStatus(caseId).then(validate);\nexport const signCase = (request) => requestSignCase(request).then(validate);\nexport const cancelSigning = (caseId) => requestCancelSignCase(caseId).then(() => true);\nexport const decline = (caseId) => requestDeclineCase(caseId).then(() => true);\nexport const accept = (caseId) => requestAcceptCase(caseId).then(() => true);\n", "import { AuthMethod } from \"../bankid/types\";\nexport class CreditAssessmentSignResponse {\n constructor(response, request) {\n if (!response) {\n throw new Error(\"Response can not be falsy\");\n }\n if (!request.method) {\n throw new Error(\"Method can not be falsy\");\n }\n this.qrCodeAsBase64 = response.qrCodeAsBase64;\n this.autoLaunchUrl = response.autoLaunchUrl;\n this.method = request.method;\n this.caseId = request.caseId;\n }\n getMethod() {\n return this.method;\n }\n isQrCode() {\n return this.method === AuthMethod.QrCode;\n }\n isSameDevice() {\n return this.method === AuthMethod.SameDevice;\n }\n getQrCode() {\n if (!this.isQrCode()) {\n throw new Error(\"Not qr code response\");\n }\n return this.qrCodeAsBase64;\n }\n getAutoLaunchUrl() {\n if (!this.isSameDevice()) {\n throw new Error(\"Not same device response\");\n }\n return this.autoLaunchUrl;\n }\n getCaseId() {\n return this.caseId;\n }\n}\n", "export var MaritalStatus;\n(function (MaritalStatus) {\n MaritalStatus[\"Married\"] = \"married\";\n MaritalStatus[\"Single\"] = \"single\";\n MaritalStatus[\"CommonLaw\"] = \"commonLaw\";\n})(MaritalStatus || (MaritalStatus = {}));\nexport var Employment;\n(function (Employment) {\n Employment[\"Other\"] = \"other\";\n Employment[\"Retired\"] = \"retired\";\n Employment[\"FullTimeEmployed\"] = \"fullTimeEmployed\";\n Employment[\"Student\"] = \"student\";\n Employment[\"TemporarilyEmployed\"] = \"temporarilyEmployed\";\n Employment[\"SelfEmployed\"] = \"selfEmployed\";\n})(Employment || (Employment = {}));\nexport var HousingType;\n(function (HousingType) {\n HousingType[\"SingleFamily\"] = \"singleFamily\";\n HousingType[\"Condominium\"] = \"condominium\";\n HousingType[\"Apartment\"] = \"apartment\";\n})(HousingType || (HousingType = {}));\nexport var CreditAssessmentStatus;\n(function (CreditAssessmentStatus) {\n CreditAssessmentStatus[\"Received\"] = \"received\";\n CreditAssessmentStatus[\"SigningInitiated\"] = \"signingInitiated\";\n CreditAssessmentStatus[\"SigningFailed\"] = \"signingFailed\";\n CreditAssessmentStatus[\"Signed\"] = \"signed\";\n CreditAssessmentStatus[\"ScoringInitiated\"] = \"scoringInitiated\";\n CreditAssessmentStatus[\"Scored\"] = \"scored\";\n CreditAssessmentStatus[\"NotScored\"] = \"notScored\";\n CreditAssessmentStatus[\"Accepted\"] = \"accepted\";\n CreditAssessmentStatus[\"Declined\"] = \"declined\";\n CreditAssessmentStatus[\"Unknown\"] = \"unknown\";\n})(CreditAssessmentStatus || (CreditAssessmentStatus = {}));\nexport var CreditAssessmentDecision;\n(function (CreditAssessmentDecision) {\n CreditAssessmentDecision[\"Approved\"] = \"approved\";\n CreditAssessmentDecision[\"Rejected\"] = \"rejected\";\n CreditAssessmentDecision[\"Unknown\"] = \"unknown\";\n})(CreditAssessmentDecision || (CreditAssessmentDecision = {}));\nexport var CreditAssessmentRecommendation;\n(function (CreditAssessmentRecommendation) {\n CreditAssessmentRecommendation[\"Approve\"] = \"approve\";\n CreditAssessmentRecommendation[\"AssessManually\"] = \"assessManually\";\n CreditAssessmentRecommendation[\"Reject\"] = \"reject\";\n CreditAssessmentRecommendation[\"Unknown\"] = \"unknown\";\n})(CreditAssessmentRecommendation || (CreditAssessmentRecommendation = {}));\n", "import { CreditAssessmentStatus } from \"./types\";\nconst asStatus = (statusString) => {\n switch (statusString) {\n case \"received\":\n return CreditAssessmentStatus.Received;\n case \"signingInitiated\":\n return CreditAssessmentStatus.SigningInitiated;\n case \"signingFailed\":\n return CreditAssessmentStatus.SigningFailed;\n case \"signed\":\n return CreditAssessmentStatus.Signed;\n case \"scoringInitiated\":\n return CreditAssessmentStatus.ScoringInitiated;\n case \"scored\":\n return CreditAssessmentStatus.Scored;\n case \"notScored\":\n return CreditAssessmentStatus.NotScored;\n case \"accepted\":\n return CreditAssessmentStatus.Accepted;\n case \"declined\":\n return CreditAssessmentStatus.Declined;\n default:\n return CreditAssessmentStatus.Unknown;\n }\n};\nexport default asStatus;\n", "import { CreditAssessmentDecision } from \"./types\";\nconst asDecision = (text) => {\n switch (text) {\n case \"approved\":\n return CreditAssessmentDecision.Approved;\n case \"rejected\":\n return CreditAssessmentDecision.Rejected;\n default:\n return CreditAssessmentDecision.Unknown;\n }\n};\nexport default asDecision;\n", "import { CreditAssessmentRecommendation } from \"./types\";\nconst asRecommendation = (text) => {\n switch (text) {\n case \"approve\":\n return CreditAssessmentRecommendation.Approve;\n case \"assessManually\":\n return CreditAssessmentRecommendation.AssessManually;\n case \"reject\":\n return CreditAssessmentRecommendation.Reject;\n default:\n return CreditAssessmentRecommendation.Unknown;\n }\n};\nexport default asRecommendation;\n", "import { CreditAssessmentStatus, } from \"./types\";\nimport asStatus from \"./convert-status\";\nimport resolveMessage from \"../bankid/message-resolver\";\nimport asDecision from \"./convert-decision\";\nimport asRecommendation from \"./convert-recommendation\";\nexport class CreditAssessmentStatusResponse {\n constructor(response) {\n this.hintCode = response.bankIdHintCode;\n this.vfScoreCaseId = response.vfScoreCaseId;\n this.signingMessage = resolveMessage(response.bankIdHintCode);\n this.status = asStatus(response.status);\n this.decision = asDecision(response.decision);\n this.recommendation = asRecommendation(response.recommendation);\n this.qrCode = response.qrCode;\n }\n getSigningMessage() {\n return this.signingMessage;\n }\n shouldRenewSigning() {\n const hasFailedSigning = this.status === CreditAssessmentStatus.SigningFailed;\n const isRenewHintCode = this.hintCode ===\n CreditAssessmentStatusResponse.START_FAILED_CODE ||\n this.hintCode === CreditAssessmentStatusResponse.USER_CANCEL_CODE;\n return hasFailedSigning && isRenewHintCode;\n }\n isSigned() {\n return (this.status === CreditAssessmentStatus.Signed ||\n this.status === CreditAssessmentStatus.ScoringInitiated ||\n this.status === CreditAssessmentStatus.Scored ||\n this.status === CreditAssessmentStatus.NotScored ||\n this.status === CreditAssessmentStatus.Accepted);\n }\n getAddress() {\n throw new Error(\"Method not implemented.\");\n }\n getStatus() {\n return this.status;\n }\n hasPendingSigning() {\n return this.status === CreditAssessmentStatus.SigningInitiated;\n }\n getHintCode() {\n return this.hintCode;\n }\n hasPendingScoring() {\n return (this.status === CreditAssessmentStatus.Signed ||\n this.status === CreditAssessmentStatus.ScoringInitiated);\n }\n isScored() {\n return (this.status === CreditAssessmentStatus.Scored ||\n this.status === CreditAssessmentStatus.Accepted);\n }\n hasScoringError() {\n return this.status === CreditAssessmentStatus.NotScored;\n }\n getScoringId() {\n return this.vfScoreCaseId;\n }\n getRecommendation() {\n return this.recommendation;\n }\n getDecision() {\n return this.decision;\n }\n getQrCode() {\n return this.qrCode;\n }\n isAccepted() {\n return this.status === CreditAssessmentStatus.Accepted;\n }\n}\nCreditAssessmentStatusResponse.START_FAILED_CODE = \"startFailed\";\nCreditAssessmentStatusResponse.USER_CANCEL_CODE = \"userCancel\";\n", "import { HousingType, } from \"./types\";\nexport const validateHouseholdEconomy = (householdEconomy) => {\n if (!householdEconomy) {\n throw new TypeError(\"Household economy can not be falsy\");\n }\n if (!householdEconomy.employment) {\n throw new TypeError(\"Household economy must have employment\");\n }\n if (!householdEconomy.maritalStatus) {\n throw new TypeError(\"Household economy must have marital status\");\n }\n if (!householdEconomy.income && householdEconomy.income !== 0) {\n throw new TypeError(\"Household economy must have income\");\n }\n if (!householdEconomy.householdChildren &&\n householdEconomy.householdChildren !== 0) {\n throw new TypeError(\"Household economy must have household children\");\n }\n if (householdEconomy.housingType === HousingType.SingleFamily &&\n householdEconomy.housingCost > 0) {\n throw new TypeError(\"A single family housing type can not have separate costs\");\n }\n if (!householdEconomy.housingType) {\n throw new TypeError(\"Household must be of a specific type\");\n }\n};\nexport const validateLoan = (loan) => {\n if (!loan) {\n throw new TypeError(\"Loan can not be falsy\");\n }\n if (!loan.financialProductId) {\n throw new TypeError(\"Loan must have financial product id\");\n }\n if (!loan.credit && loan.credit !== 0) {\n throw new TypeError(\"Loan must have credit\");\n }\n if (!loan.downPayment && loan.downPayment !== 0) {\n throw new TypeError(\"Loan must have down payment\");\n }\n if (!loan.interestRate && loan.interestRate !== 0) {\n throw new TypeError(\"Loan must have interest rate\");\n }\n if (!loan.monthlyCost && loan.monthlyCost !== 0) {\n throw new TypeError(\"Loan must have monthly cost\");\n }\n if (!loan.price && loan.price !== 0) {\n throw new TypeError(\"Loan must have price\");\n }\n};\nexport const validateCustomer = (customer) => {\n if (!customer) {\n throw new TypeError(\"Customer can not be falsy\");\n }\n if (!customer.socialId) {\n throw new TypeError(\"Customer must have social id\");\n }\n if (!customer.email) {\n throw new TypeError(\"Customer must have email\");\n }\n if (!customer.phone) {\n throw new TypeError(\"Customer must have phone\");\n }\n};\nexport const validateInquiry = (inquiry) => {\n if (!inquiry) {\n throw new TypeError(\"Inquiry can not be falsy\");\n }\n if (!inquiry.externalId) {\n throw new TypeError(\"Inquiry must have external id\");\n }\n validateHouseholdEconomy(inquiry.householdEconomy);\n validateLoan(inquiry.loan);\n validateCustomer(inquiry.customer);\n};\n", "import * as api from \"../http/apis/credit-assessment\";\nimport { CreditAssessmentSignResponse } from \"./sign-response\";\nimport { CreditAssessmentStatusResponse } from \"./status-response\";\nimport { validateInquiry } from \"./validator\";\nexport const newCase = (request) => {\n validateInquiry(request);\n return api.newCase(request);\n};\nexport const getStatus = (caseId) => api\n .getStatus(caseId)\n .then((response) => new CreditAssessmentStatusResponse(response));\nexport const signCase = (request) => api\n .signCase(request)\n .then((response) => new CreditAssessmentSignResponse(response, request));\nexport const cancelSigning = (caseId) => api.cancelSigning(caseId);\nexport const accept = (caseId) => api.accept(caseId);\nexport const decline = (caseId) => api.decline(caseId);\n", "export var DrivingDistance;\n(function (DrivingDistance) {\n DrivingDistance[\"Between0And1000\"] = \"Between0And1000\";\n DrivingDistance[\"Between1000And1500\"] = \"Between1000And1500\";\n DrivingDistance[\"Between1500And2000\"] = \"Between1500And2000\";\n DrivingDistance[\"Between2000And2500\"] = \"Between2000And2500\";\n DrivingDistance[\"Over2500\"] = \"Over2500\";\n})(DrivingDistance || (DrivingDistance = {}));\n", "export var DeliveryType;\n(function (DeliveryType) {\n DeliveryType[\"None\"] = \"None\";\n DeliveryType[\"Pickup\"] = \"Pickup\";\n DeliveryType[\"Delivery\"] = \"Delivery\";\n})(DeliveryType || (DeliveryType = {}));\nexport var PaymentType;\n(function (PaymentType) {\n PaymentType[\"Cash\"] = \"Cash\";\n PaymentType[\"Lease\"] = \"Lease\";\n PaymentType[\"Loan\"] = \"Loan\";\n})(PaymentType || (PaymentType = {}));\n", "export var VehicleCondition;\n(function (VehicleCondition) {\n VehicleCondition[\"VeryGood\"] = \"VeryGood\";\n VehicleCondition[\"Good\"] = \"Good\";\n VehicleCondition[\"Ok\"] = \"Ok\";\n})(VehicleCondition || (VehicleCondition = {}));\n", "/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nexport function formatProdErrorMessage(code: number) {\n return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or ` + 'use the non-minified dev environment for full errors. ';\n}", "declare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\nconst $$observable = /* #__PURE__ */(() => typeof Symbol === 'function' && Symbol.observable || '@@observable')();\nexport default $$observable;", "/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\n\nconst randomString = () => Math.random().toString(36).substring(7).split('').join('.');\nconst ActionTypes = {\n INIT: `@@redux/INIT${/* #__PURE__ */randomString()}`,\n REPLACE: `@@redux/REPLACE${/* #__PURE__ */randomString()}`,\n PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`\n};\nexport default ActionTypes;", "/**\n * @param obj The object to inspect.\n * @returns True if the argument appears to be a plain object.\n */\nexport default function isPlainObject(obj: any): obj is object {\n if (typeof obj !== 'object' || obj === null) return false;\n let proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null;\n}", "// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nexport function miniKindOf(val: any): string {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n const type = typeof val;\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n const constructorName = ctorName(val);\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n }\n\n // other\n return Object.prototype.toString.call(val).slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\nfunction ctorName(val: any): string | null {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\nfunction isError(val: any) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\nfunction isDate(val: any) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\nexport function kindOf(val: any) {\n let typeOfVal: string = typeof val;\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n return typeOfVal;\n}", "import { formatProdErrorMessage as _formatProdErrorMessage13 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage12 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage11 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage10 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage9 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage8 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage7 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage6 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage5 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage4 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage3 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage2 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport $$observable from './utils/symbol-observable';\nimport { Store, StoreEnhancer, Dispatch, Observer, ListenerCallback, UnknownIfNonSpecific } from './types/store';\nimport { Action } from './types/actions';\nimport { Reducer } from './types/reducers';\nimport ActionTypes from './utils/actionTypes';\nimport isPlainObject from './utils/isPlainObject';\nimport { kindOf } from './utils/kindOf';\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(2) : `Expected the root reducer to be a function. Instead, received: '${kindOf(reducer)}'`);\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = (preloadedState as StoreEnhancer<Ext, StateExt>);\n preloadedState = undefined;\n }\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(1) : `Expected the enhancer to be a function. Instead, received: '${kindOf(enhancer)}'`);\n }\n return enhancer(createStore)(reducer, (preloadedState as PreloadedState | undefined));\n }\n let currentReducer = reducer;\n let currentState: S | PreloadedState | undefined = (preloadedState as PreloadedState | undefined);\n let currentListeners: Map<number, ListenerCallback> | null = new Map();\n let nextListeners = currentListeners;\n let listenerIdCounter = 0;\n let isDispatching = false;\n\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = new Map();\n currentListeners.forEach((listener, key) => {\n nextListeners.set(key, listener);\n });\n }\n }\n\n /**\n * Reads the state tree managed by the store.\n *\n * @returns The current state tree of your application.\n */\n function getState(): S {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage4(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n return (currentState as S);\n }\n\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param listener A callback to be invoked on every dispatch.\n * @returns A function to remove this change listener.\n */\n function subscribe(listener: () => void) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage5(4) : `Expected the listener to be a function. Instead, received: '${kindOf(listener)}'`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage6(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n let isSubscribed = true;\n ensureCanMutateNextListeners();\n const listenerId = listenerIdCounter++;\n nextListeners.set(listenerId, listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage7(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n isSubscribed = false;\n ensureCanMutateNextListeners();\n nextListeners.delete(listenerId);\n currentListeners = null;\n };\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action: A) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage8(7) : `Actions must be plain objects. Instead, the actual type was: '${kindOf(action)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);\n }\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage9(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n if (typeof action.type !== 'string') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage10(17) : `Action \"type\" property must be a string. Instead, the actual type was: '${kindOf(action.type)}'. Value was: '${action.type}' (stringified)`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage11(9) : 'Reducers may not dispatch actions.');\n }\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n const listeners = currentListeners = nextListeners;\n listeners.forEach(listener => {\n listener();\n });\n return action;\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param nextReducer The reducer for the store to use instead.\n */\n function replaceReducer(nextReducer: Reducer<S, A>): void {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage12(10) : `Expected the nextReducer to be a function. Instead, received: '${kindOf(nextReducer)}`);\n }\n currentReducer = ((nextReducer as unknown) as Reducer<S, A, PreloadedState>);\n\n // This action has a similar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n dispatch(({\n type: ActionTypes.REPLACE\n } as A));\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n const outerSubscribe = subscribe;\n return {\n /**\n * The minimal observable subscription method.\n * @param observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe(observer: unknown) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage13(11) : `Expected the observer to be an object. Instead, received: '${kindOf(observer)}'`);\n }\n function observeState() {\n const observerAsObserver = (observer as Observer<S>);\n if (observerAsObserver.next) {\n observerAsObserver.next(getState());\n }\n }\n observeState();\n const unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe\n };\n },\n [$$observable]() {\n return this;\n }\n };\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch(({\n type: ActionTypes.INIT\n } as A));\n const store = (({\n dispatch: (dispatch as Dispatch<A>),\n subscribe,\n getState,\n replaceReducer,\n [$$observable]: observable\n } as unknown) as Store<S, A, StateExt> & Ext);\n return store;\n}\n\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n return createStore(reducer, (preloadedState as any), enhancer);\n}", "/**\n * Prints a warning in the console if it exists.\n *\n * @param message The warning message.\n */\nexport default function warning(message: string): void {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n}", "import { formatProdErrorMessage as _formatProdErrorMessage3 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage2 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport { Action } from './types/actions';\nimport { ActionFromReducersMapObject, PreloadedStateShapeFromReducersMapObject, Reducer, StateFromReducersMapObject } from './types/reducers';\nimport ActionTypes from './utils/actionTypes';\nimport isPlainObject from './utils/isPlainObject';\nimport warning from './utils/warning';\nimport { kindOf } from './utils/kindOf';\nfunction getUnexpectedStateShapeWarningMessage(inputState: object, reducers: {\n [key: string]: Reducer<any, any, any>;\n}, action: Action, unexpectedKeyCache: {\n [key: string]: true;\n}) {\n const reducerKeys = Object.keys(reducers);\n const argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n if (!isPlainObject(inputState)) {\n return `The ${argumentName} has unexpected type of \"${kindOf(inputState)}\". Expected argument to be an object with the following ` + `keys: \"${reducerKeys.join('\", \"')}\"`;\n }\n const unexpectedKeys = Object.keys(inputState).filter(key => !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]);\n unexpectedKeys.forEach(key => {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === ActionTypes.REPLACE) return;\n if (unexpectedKeys.length > 0) {\n return `Unexpected ${unexpectedKeys.length > 1 ? 'keys' : 'key'} ` + `\"${unexpectedKeys.join('\", \"')}\" found in ${argumentName}. ` + `Expected to find one of the known reducer keys instead: ` + `\"${reducerKeys.join('\", \"')}\". Unexpected keys will be ignored.`;\n }\n}\nfunction assertReducerShape(reducers: {\n [key: string]: Reducer<any, any, any>;\n}) {\n Object.keys(reducers).forEach(key => {\n const reducer = reducers[key];\n const initialState = reducer(undefined, {\n type: ActionTypes.INIT\n });\n if (typeof initialState === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(12) : `The slice reducer for key \"${key}\" returned undefined during initialization. ` + `If the state passed to the reducer is undefined, you must ` + `explicitly return the initial state. The initial state may ` + `not be undefined. If you don't want to set a value for this reducer, ` + `you can use null instead of undefined.`);\n }\n if (typeof reducer(undefined, {\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\n }) === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(13) : `The slice reducer for key \"${key}\" returned undefined when probed with a random type. ` + `Don't try to handle '${ActionTypes.INIT}' or other actions in \"redux/*\" ` + `namespace. They are considered private. Instead, you must return the ` + `current state for any unknown actions, unless it is undefined, ` + `in which case you must return the initial state, regardless of the ` + `action type. The initial state may not be undefined, but can be null.`);\n }\n });\n}\n\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @template S Combined state object type.\n *\n * @param reducers An object whose values correspond to different reducer\n * functions that need to be combined into one. One handy way to obtain it\n * is to use `import * as reducers` syntax. The reducers may never\n * return undefined for any action. Instead, they should return their\n * initial state if the state passed to them was undefined, and the current\n * state for any unrecognized action.\n *\n * @returns A reducer function that invokes every reducer inside the passed\n * object, and builds a state object with the same shape.\n */\nexport default function combineReducers<M>(reducers: M): M[keyof M] extends Reducer<any, any, any> | undefined ? Reducer<StateFromReducersMapObject<M>, ActionFromReducersMapObject<M>, Partial<PreloadedStateShapeFromReducersMapObject<M>>> : never;\nexport default function combineReducers(reducers: {\n [key: string]: Reducer<any, any, any>;\n}) {\n const reducerKeys = Object.keys(reducers);\n const finalReducers: {\n [key: string]: Reducer<any, any, any>;\n } = {};\n for (let i = 0; i < reducerKeys.length; i++) {\n const key = reducerKeys[i];\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning(`No reducer provided for key \"${key}\"`);\n }\n }\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n const finalReducerKeys = Object.keys(finalReducers);\n\n // This is used to make sure we don't warn about the same\n // keys multiple times.\n let unexpectedKeyCache: {\n [key: string]: true;\n };\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n let shapeAssertionError: unknown;\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n return function combination(state: StateFromReducersMapObject<typeof reducers> = {}, action: Action) {\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n if (process.env.NODE_ENV !== 'production') {\n const warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n let hasChanged = false;\n const nextState: StateFromReducersMapObject<typeof reducers> = {};\n for (let i = 0; i < finalReducerKeys.length; i++) {\n const key = finalReducerKeys[i];\n const reducer = finalReducers[key];\n const previousStateForKey = state[key];\n const nextStateForKey = reducer(previousStateForKey, action);\n if (typeof nextStateForKey === 'undefined') {\n const actionType = action && action.type;\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(14) : `When called with an action of type ${actionType ? `\"${String(actionType)}\"` : '(unknown type)'}, the slice reducer for key \"${key}\" returned undefined. ` + `To ignore an action, you must explicitly return the previous state. ` + `If you want this reducer to hold no value, you can return null instead of undefined.`);\n }\n nextState[key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}", "import { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport { Dispatch } from './types/store';\nimport { ActionCreator, ActionCreatorsMapObject, Action } from './types/actions';\nimport { kindOf } from './utils/kindOf';\nfunction bindActionCreator<A extends Action>(actionCreator: ActionCreator<A>, dispatch: Dispatch<A>) {\n return function (this: any, ...args: any[]) {\n return dispatch(actionCreator.apply(this, args));\n };\n}\n\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use `import * as`\n * syntax. You may also pass a single function.\n *\n * @param dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\nexport default function bindActionCreators<A, C extends ActionCreator<A>>(actionCreator: C, dispatch: Dispatch): C;\nexport default function bindActionCreators<A extends ActionCreator<any>, B extends ActionCreator<any>>(actionCreator: A, dispatch: Dispatch): B;\nexport default function bindActionCreators<A, M extends ActionCreatorsMapObject<A>>(actionCreators: M, dispatch: Dispatch): M;\nexport default function bindActionCreators<M extends ActionCreatorsMapObject, N extends ActionCreatorsMapObject>(actionCreators: M, dispatch: Dispatch): N;\nexport default function bindActionCreators(actionCreators: ActionCreator<any> | ActionCreatorsMapObject, dispatch: Dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n if (typeof actionCreators !== 'object' || actionCreators === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(16) : `bindActionCreators expected an object or a function, but instead received: '${kindOf(actionCreators)}'. ` + `Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?`);\n }\n const boundActionCreators: ActionCreatorsMapObject = {};\n for (const key in actionCreators) {\n const actionCreator = actionCreators[key];\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n return boundActionCreators;\n}", "type Func<T extends any[], R> = (...a: T) => R;\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for the\n * resulting composite function.\n *\n * @param funcs The functions to compose.\n * @returns A function obtained by composing the argument functions from right\n * to left. For example, `compose(f, g, h)` is identical to doing\n * `(...args) => f(g(h(...args)))`.\n */\nexport default function compose(): <R>(a: R) => R;\nexport default function compose<F extends Function>(f: F): F;\n\n/* two functions */\nexport default function compose<A, T extends any[], R>(f1: (a: A) => R, f2: Func<T, A>): Func<T, R>;\n\n/* three functions */\nexport default function compose<A, B, T extends any[], R>(f1: (b: B) => R, f2: (a: A) => B, f3: Func<T, A>): Func<T, R>;\n\n/* four functions */\nexport default function compose<A, B, C, T extends any[], R>(f1: (c: C) => R, f2: (b: B) => C, f3: (a: A) => B, f4: Func<T, A>): Func<T, R>;\n\n/* rest */\nexport default function compose<R>(f1: (a: any) => R, ...funcs: Function[]): (...args: any[]) => R;\nexport default function compose<R>(...funcs: Function[]): (...args: any[]) => R;\nexport default function compose(...funcs: Function[]) {\n if (funcs.length === 0) {\n // infer the argument type so it is usable in inference down the line\n return <T,>(arg: T) => arg;\n }\n if (funcs.length === 1) {\n return funcs[0];\n }\n return funcs.reduce((a, b) => (...args: any) => a(b(...args)));\n}", "import { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport compose from './compose';\nimport { Middleware, MiddlewareAPI } from './types/middleware';\nimport { StoreEnhancer, Dispatch } from './types/store';\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param middlewares The middleware chain to be applied.\n * @returns A store enhancer applying the middleware.\n *\n * @template Ext Dispatch signature added by a middleware.\n * @template S The type of the state supported by a middleware.\n */\nexport default function applyMiddleware(): StoreEnhancer;\nexport default function applyMiddleware<Ext1, S>(middleware1: Middleware<Ext1, S, any>): StoreEnhancer<{\n dispatch: Ext1;\n}>;\nexport default function applyMiddleware<Ext1, Ext2, S>(middleware1: Middleware<Ext1, S, any>, middleware2: Middleware<Ext2, S, any>): StoreEnhancer<{\n dispatch: Ext1 & Ext2;\n}>;\nexport default function applyMiddleware<Ext1, Ext2, Ext3, S>(middleware1: Middleware<Ext1, S, any>, middleware2: Middleware<Ext2, S, any>, middleware3: Middleware<Ext3, S, any>): StoreEnhancer<{\n dispatch: Ext1 & Ext2 & Ext3;\n}>;\nexport default function applyMiddleware<Ext1, Ext2, Ext3, Ext4, S>(middleware1: Middleware<Ext1, S, any>, middleware2: Middleware<Ext2, S, any>, middleware3: Middleware<Ext3, S, any>, middleware4: Middleware<Ext4, S, any>): StoreEnhancer<{\n dispatch: Ext1 & Ext2 & Ext3 & Ext4;\n}>;\nexport default function applyMiddleware<Ext1, Ext2, Ext3, Ext4, Ext5, S>(middleware1: Middleware<Ext1, S, any>, middleware2: Middleware<Ext2, S, any>, middleware3: Middleware<Ext3, S, any>, middleware4: Middleware<Ext4, S, any>, middleware5: Middleware<Ext5, S, any>): StoreEnhancer<{\n dispatch: Ext1 & Ext2 & Ext3 & Ext4 & Ext5;\n}>;\nexport default function applyMiddleware<Ext, S = any>(...middlewares: Middleware<any, S, any>[]): StoreEnhancer<{\n dispatch: Ext;\n}>;\nexport default function applyMiddleware(...middlewares: Middleware[]): StoreEnhancer<any> {\n return createStore => (reducer, preloadedState) => {\n const store = createStore(reducer, preloadedState);\n let dispatch: Dispatch = () => {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n const middlewareAPI: MiddlewareAPI = {\n getState: store.getState,\n dispatch: (action, ...args) => dispatch(action, ...args)\n };\n const chain = middlewares.map(middleware => middleware(middlewareAPI));\n dispatch = compose<typeof dispatch>(...chain)(store.dispatch);\n return {\n ...store,\n dispatch\n };\n };\n}", "import { Action } from '../types/actions';\nimport isPlainObject from './isPlainObject';\nexport default function isAction(action: unknown): action is Action<string> {\n return isPlainObject(action) && 'type' in action && typeof (action as Record<'type', unknown>).type === 'string';\n}"],
|
|
5
|
+
"mappings": "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B,mBAAoB,mCACpB,SAAU,WACV,oBAAqB,qBACrB,qBAAsB,kCACtB,OAAQ,gBACR,kBAAmB,0BACnB,mBAAoB,uCACpB,YAAa,UACb,uBAAwB,oBACxB,wBAAyB,iCACzB,cAAe,eACf,YAAa,SACb,QAAS,gBACT,aAAc,sEACd,OAAQ,eACR,kBACE,qPACF,SAAU,cACV,oBACE,6LACF,KAAM,UACN,gBACE,uFACF,sBAAuB,sCACvB,wBAAyB,uBACzB,kBAAmB,4DACnB,aAAc,sFACd,KAAM,UACN,QAAS,eACT,eAAgB,gBAChB,0BACE,6LACF,2BAA4B,yBAC5B,sBAAuB,yBACvB,uBAAwB,qBACxB,sBAAuB,iBACvB,iBAAkB,yBAClB,kBAAmB,qBACnB,iBAAkB,iBAClB,cAAe,uBACjB,EACA,KAAM,CACJ,MAAO,YACP,YAAa,+CACb,kBACE,mMACF,YACE,uGACF,iBAAkB,gBAClB,qBAAsB,mDACtB,2BACE,+VACF,cAAe,cACf,cAAe,eACf,cAAe,sCACf,cAAe,cACjB,EACA,YAAa,CACX,eACE,sIACF,YAAa,gBACb,QAAS,WACT,gBAAiB,qBACjB,OAAQ,SACR,SAAU,WACV,kBAAmB,oBACnB,SAAU,yBACV,kBAAmB,2BACnB,gBAAiB,sBACjB,gBACE,2OACF,gBACE,2OACF,SAAU,oCACZ,EACA,oBAAqB,CACnB,YAAa,gBACb,QAAS,WACT,gBAAiB,qBACjB,OAAQ,SACR,SAAU,WACV,kBAAmB,oBACnB,SAAU,yBACV,kBAAmB,2BACnB,gBAAiB,sBACjB,gBACE,2OACF,gBACE,2OACF,SAAU,oCACZ,EACA,uBAAwB,CACtB,YAAa,mCACb,SAAU,YACZ,EACA,wBAAyB,CACvB,YAAa,gBACb,WAAY,gBACZ,gBAAiB,qBACjB,OAAQ,SACR,YAAa,mCACb,eACE,sIACF,iBAAkB,6DAClB,gBAAiB,wBACjB,UAAW,eACX,KAAM,UACN,MAAO,eACT,EACA,wCAAyC,CACvC,SAAU,8DACV,oBACE,yJACF,eACE,8HACF,0BACE,iQACF,SAAU,6DACV,oBACE,+JACF,kBACE,gJACF,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",
|
|
6
|
+
"names": ["require_object_path", "__commonJSMin", "exports", "module", "root", "factory", "toStr", "hasOwnProperty", "obj", "prop", "isEmpty", "value", "isArray", "i", "toString", "type", "isObject", "isBoolean", "getKey", "key", "intKey", "options", "objectPath", "proxy", "hasShallowProperty", "getShallowProperty", "getShallowPropertySafely", "currentPath", "currentValue", "set", "path", "doNotReplace", "j", "at", "arr", "paths", "defaultValue", "len", "nextObj", "mod", "isInvalidCodePoint", "codePoint", "replaceCodePoint", "c1", "replaceCodePointXML", "init_decode_codepoint", "__esmMin", "decodeTrieDict", "input", "resultLength", "atomCount", "dict1AtomCount", "ngramCount", "dictSize", "inputLength", "twoCharBias", "pos", "readSlotCode", "c1", "BASE91_INVERSE", "dict2AtomCount", "slotCount", "single", "start", "length", "decodeDelta", "count", "off", "previous", "slot", "end", "code", "runLength", "next", "references", "poolSize", "ngramIndex", "readNgramReferences", "startSlot", "index", "a", "b", "entryLength", "pool", "write", "half", "source", "value", "read", "readEnd", "out", "outIndex", "init_decode_shared", "__esmMin", "table", "char", "htmlDecodeTree", "init_decode_data_html", "__esmMin", "init_decode_shared", "decodeTrieDict", "xmlDecodeTree", "init_decode_data_xml", "__esmMin", "BinTrieFlags", "init_bin_trie_flags", "__esmMin", "isNumber", "code", "CharCodes", "isHexadecimalCharacter", "TO_LOWER_BIT", "isAlpha", "isEntityInAttributeInvalidEnd", "determineBranch", "decodeTree", "current", "nodeIndex", "char", "branchCount", "BinTrieFlags", "jumpOffset", "slot", "stored", "packedKeySlots", "branchEnd", "index", "key", "pointerIndex", "EntityDecoderState", "DecodingMode", "EntityDecoder", "init_decode", "__esmMin", "init_decode_codepoint", "init_decode_data_xml", "init_bin_trie_flags", "init_decode_data_html", "emitCodePoint", "errors", "decodeMode", "input", "offset", "inputLength", "result", "consumed", "digit", "lastCp", "expectedLength", "xmlDecodeTree", "replaceCodePointXML", "replaceCodePoint", "excess", "valueLength", "isStrict", "treeIndex", "runLength", "runConsumed", "charIndexInPacked", "expectedChar", "next", "isWhitespace", "c", "CharCodes", "isEndOfTagSection", "isASCIIAlpha", "State", "QuoteType", "Sequences", "specialStartSequences", "Tokenizer", "init_Tokenizer", "__esmMin", "init_decode", "xmlMode", "decodeEntities", "recognizeSelfClosing", "cbs", "EntityDecoder", "xmlDecodeTree", "htmlDecodeTree", "cp", "consumed", "chunk", "lower", "offset", "endOfText", "actualIndex", "special", "quote", "DecodingMode", "indexInBuffer", "length", "endIndex", "cdataStart", "fromCodePoint", "formTags", "pTag", "headingTags", "tableSectionTags", "ddtTags", "rtpTags", "openImpliesClose", "DOCUMENT_TYPE", "voidElements", "foreignContextElements", "htmlIntegrationElements", "svgTagNameAdjustments", "ForeignContext", "reNameEnd", "Parser", "init_Parser", "__esmMin", "init_Tokenizer", "cbs", "options", "Tokenizer", "start", "endIndex", "data", "cp", "name", "adjusted", "impliesClose", "isImplied", "pos", "index", "implied", "element", "isOpenImplied", "quote", "QuoteType", "value", "offset", "end", "slice", "chunk", "dist_exports", "__export", "CDATA", "Comment", "Directive", "Doctype", "ElementType", "Root", "Script", "Style", "Tag", "Text", "isTag", "element", "init_dist", "__esmMin", "isTag", "node", "isCDATA", "ElementType", "isText", "isComment", "isDirective", "isDocument", "hasChildren", "cloneNode", "recursive", "result", "Text", "Comment", "children", "cloneChildren", "clone", "Element", "child", "CDATA", "Document", "instruction", "ProcessingInstruction", "childs", "index", "Node", "DataNode", "NodeWithChildren", "init_node", "__esmMin", "init_dist", "parent", "previous", "next", "data", "name", "attribs", "type", "defaultOptions", "DomHandler", "init_dist", "__esmMin", "init_node", "Document", "callback", "options", "elementCB", "parser", "error", "element", "name", "attribs", "type", "ElementType", "Element", "data", "lastNode", "node", "Text", "Comment", "text", "CDATA", "ProcessingInstruction", "parent", "previousSibling", "filter", "test", "node", "recurse", "limit", "find", "nodes", "result", "nodeStack", "indexStack", "element", "hasChildren", "findOne", "searchedNodes", "isTag", "found", "existsOne", "findAll", "init_querying", "__esmMin", "init_dist", "getAttribCheck", "attrib", "value", "element", "isTag", "combineFuncs", "a", "b", "compileTest", "options", "funcs", "key", "Checks", "testElement", "node", "test", "getElements", "nodes", "recurse", "limit", "filter", "getElementById", "id", "findOne", "getElementsByTagName", "tagName", "getElementsByClassName", "className", "getElementsByTagType", "type", "init_legacy", "__esmMin", "init_dist", "init_querying", "name", "data", "isText", "getEscape", "char", "isXmlEscapable", "code", "XML_BITSET_VALUE", "encodeXML", "input", "length", "out", "last", "index", "bound", "next", "xmlEncodeRegex", "cp", "escapeWithRegex", "re", "data", "escapeAttribute", "attributeEscapeRegex", "escapeText", "textEscapeRegex", "init_escape", "__esmMin", "EntityLevel", "EncodingMode", "init_dist", "__esmMin", "init_escape", "elementNames", "attributeNames", "init_foreign_names", "__esmMin", "name", "render", "node", "options", "nodes", "xmlMode", "output", "index", "renderNode", "renderChildren", "children", "Root", "Directive", "Comment", "CDATA", "Script", "Style", "Tag", "renderTag", "Text", "element", "data", "unencodedElements", "encodeXML", "escapeText", "elementNames", "foreignModeIntegrationPoints", "foreignElements", "name", "isVoid", "voidElements", "tag", "formatAttributes", "replaceQuotes", "value", "attributes", "encode", "escapeAttribute", "isForeign", "showEmpty", "result", "key", "k", "attributeNames", "dist_default", "init_dist", "__esmMin", "init_foreign_names", "getOuterHTML", "node", "options", "dist_default", "getInnerHTML", "hasChildren", "getText", "isTag", "isCDATA", "isText", "textContent", "isComment", "innerText", "ElementType", "init_stringify", "__esmMin", "init_dist", "getFeed", "document", "feedRoot", "getOneElement", "isValidFeed", "getAtomFeed", "getRssFeed", "childs", "feed", "getElementsByTagName", "item", "children", "entry", "getMediaElements", "addConditionally", "href", "description", "fetch", "pubDate", "updated", "where", "element", "attribs", "media", "attrib", "MEDIA_KEYS_STRING", "MEDIA_KEYS_INT", "tagName", "node", "recurse", "textContent", "object", "property", "value", "init_feeds", "__esmMin", "init_legacy", "init_stringify", "removeSubsets", "nodes", "index", "node", "ancestor", "compareDocumentPosition", "nodeA", "nodeB", "aParents", "bParents", "current", "hasChildren", "maxIndex", "DocumentPosition", "sharedParent", "siblings", "aSibling", "bSibling", "uniqueSort", "array", "a", "b", "relative", "init_helpers", "__esmMin", "init_dist", "removeElement", "element", "childs", "childsIndex", "replaceElement", "replacement", "children", "elementIndex", "appendChild", "parent", "child", "sibling", "append", "next", "currentNext", "prependChild", "prepend", "previous", "init_manipulation", "__esmMin", "getChildren", "element", "hasChildren", "getParent", "getSiblings", "parent", "siblings", "prev", "next", "getAttributeValue", "name", "attribs", "hasAttrib", "getName", "nextElementSibling", "isTag", "prevElementSibling", "init_traversal", "__esmMin", "init_dist", "dist_exports", "__export", "DocumentPosition", "append", "appendChild", "compareDocumentPosition", "existsOne", "filter", "find", "findAll", "findOne", "getAttributeValue", "getChildren", "getElementById", "getElements", "getElementsByClassName", "getElementsByTagName", "getElementsByTagType", "getFeed", "getInnerHTML", "getName", "getOuterHTML", "getParent", "getSiblings", "getText", "hasAttrib", "innerText", "nextElementSibling", "prepend", "prependChild", "prevElementSibling", "removeElement", "removeSubsets", "replaceElement", "testElement", "textContent", "uniqueSort", "init_dist", "__esmMin", "init_feeds", "init_helpers", "init_legacy", "init_manipulation", "init_querying", "init_stringify", "init_traversal", "dist_exports", "__export", "DomHandler", "Parser", "QuoteType", "Tokenizer", "createDocumentStream", "getFeed", "parseDocument", "parseFeed", "data", "options", "handler", "callback", "elementCallback", "error", "feed", "parseFeedDefaultOptions", "init_dist", "__esmMin", "init_Parser", "init_Tokenizer", "require_escape_string_regexp", "__commonJSMin", "exports", "module", "string", "require_is_plain_object", "__commonJSMin", "exports", "isObject", "o", "isPlainObject", "ctor", "prot", "require_parse_srcset", "__commonJSMin", "exports", "module", "root", "factory", "input", "isSpace", "c", "collectCharacters", "regEx", "chars", "match", "pos", "inputLength", "regexLeadingSpaces", "regexLeadingCommasOrSpaces", "regexLeadingNotSpaces", "regexTrailingCommas", "regexNonNegativeInteger", "regexFloatingPoint", "url", "descriptors", "currentDescriptor", "state", "candidates", "parseDescriptors", "tokenize", "pError", "w", "d", "h", "i", "candidate", "desc", "lastChar", "value", "intVal", "floatVal", "require_picocolors_browser", "__commonJSMin", "exports", "module", "x", "create", "require_css_syntax_error", "__commonJSMin", "exports", "module", "pico", "terminalHighlight", "CssSyntaxError", "_CssSyntaxError", "message", "line", "column", "source", "file", "plugin", "color", "css", "aside", "text", "mark", "highlight", "bold", "gray", "red", "lines", "start", "end", "maxWidth", "index", "number", "gutter", "padding", "subLineStart", "subLineEnd", "subLine", "spacing", "code", "require_stringifier", "__commonJSMin", "exports", "module", "AT_NAME_END", "DEFAULT_RAW", "capitalize", "str", "atruleStart", "node", "name", "params", "afterName", "isCustomProperty", "before", "pushBody", "stack", "nodes", "last", "semicolon", "isDocument", "i", "child", "childSemicolon", "pushBlock", "start", "between", "hasNodes", "close", "after", "Stringifier", "_Stringifier", "builder", "end", "detect", "value", "buf", "depth", "indent", "step", "proto", "expandable", "method", "entry", "left", "right", "raws", "string", "own", "parent", "root", "cache", "p", "parts", "prop", "raw", "require_stringify", "__commonJSMin", "exports", "module", "Stringifier", "STYLE_TAG", "COMMENT_OPEN", "escapeHTMLInCSS", "str", "SafeStringifier", "node", "print", "builder", "chunks", "css", "child", "type", "escaped", "i", "stringify", "require_symbols", "__commonJSMin", "exports", "module", "require_node", "__commonJSMin", "exports", "module", "CssSyntaxError", "Stringifier", "stringify", "isClean", "my", "cloneNode", "obj", "parent", "cloned", "stack", "source", "target", "targetParent", "i", "value", "type", "children", "j", "childClone", "valueClone", "sourceOffset", "inputCSS", "position", "column", "line", "offset", "Node", "_Node", "defaults", "name", "node", "error", "s", "add", "overrides", "keepBetween", "message", "opts", "end", "start", "prop", "next", "index", "inputString", "pos", "defaultType", "nodes", "bookmark", "foundSelf", "result", "_", "inputs", "emitInputs", "holderOfRoot", "queue", "step", "holder", "key", "fixed", "fixedArray", "item", "inputId", "input", "stringifier", "text", "data", "require_comment", "__commonJSMin", "exports", "module", "Node", "Comment", "defaults", "require_declaration", "__commonJSMin", "exports", "module", "Node", "Declaration", "defaults", "require_container", "__commonJSMin", "exports", "module", "Comment", "Declaration", "Node", "isClean", "my", "AtRule", "parse", "Root", "Rule", "cleanSource", "nodes", "stack", "node", "i", "markTreeDirty", "next", "Container", "_Container", "children", "child", "keepBetween", "callback", "iterator", "index", "result", "condition", "prop", "args", "cb", "other", "value", "exist", "add", "existIndex", "id", "type", "sample", "pattern", "opts", "decl", "parent", "e", "opened", "name", "selector", "dependant", "require_at_rule", "__commonJSMin", "exports", "module", "Container", "AtRule", "defaults", "children", "require_document", "__commonJSMin", "exports", "module", "Container", "LazyResult", "Processor", "Document", "defaults", "opts", "dependant", "require_non_secure", "__commonJSMin", "exports", "module", "urlAlphabet", "customAlphabet", "alphabet", "defaultSize", "size", "id", "i", "nanoid", "require_previous_map", "__commonJSMin", "exports", "module", "existsSync", "readFileSync", "realpathSync", "dirname", "isAbsolute", "join", "relative", "sep", "SourceMapConsumer", "SourceMapGenerator", "realPath", "path", "fromBase64", "str", "PreviousMap", "css", "opts", "prev", "text", "baseCharsetUri", "baseUri", "charsetUri", "uri", "uriMatch", "baseUriMatch", "encoding", "sourceMapString", "map", "comments", "start", "end", "cssFile", "trusted", "rel", "file", "prevPath", "unknown", "string", "require_input", "__commonJSMin", "exports", "module", "nanoid", "isAbsolute", "resolve", "SourceMapConsumer", "SourceMapGenerator", "fileURLToPath", "pathToFileURL", "CssSyntaxError", "PreviousMap", "terminalHighlight", "lineToIndexCache", "sourceMapAvailable", "pathAvailable", "getLineToIndex", "input", "lines", "lineToIndex", "prevIndex", "i", "l", "Input", "css", "opts", "map", "file", "message", "line", "column", "endColumn", "endLine", "endOffset", "offset", "result", "start", "end", "pos", "origin", "lastLine", "min", "max", "mid", "consumer", "from", "to", "toPosition", "fromUrl", "source", "json", "name", "require_root", "__commonJSMin", "exports", "module", "Container", "LazyResult", "Processor", "Root", "defaults", "child", "sample", "type", "keepBefore", "node", "nodes", "ignore", "index", "opts", "dependant", "require_list", "__commonJSMin", "exports", "module", "list", "string", "spaces", "separators", "last", "array", "current", "split", "func", "inQuote", "prevQuote", "escape", "inComment", "i", "letter", "value", "require_rule", "__commonJSMin", "exports", "module", "Container", "list", "Rule", "values", "match", "sep", "defaults", "require_fromJSON", "__commonJSMin", "exports", "module", "AtRule", "Comment", "Declaration", "Input", "PreviousMap", "Root", "Rule", "hydrateInputs", "json", "inputs", "input", "inputHydrated", "constructNode", "children", "defaults", "inputId", "source", "node", "child", "fromJSON", "result", "stack", "frame", "jsonNodes", "childJson", "require_map_generator", "__commonJSMin", "exports", "module", "dirname", "relative", "resolve", "sep", "SourceMapConsumer", "SourceMapGenerator", "pathToFileURL", "Input", "sourceMapAvailable", "pathAvailable", "MapGenerator", "stringify", "root", "opts", "cssString", "content", "eol", "prev", "from", "map", "node", "annotation", "css", "cursor", "startIndex", "endIndex", "result", "line", "column", "noSource", "mapping", "last", "lines", "str", "type", "p", "i", "file", "cached", "path", "input", "already", "fromUrl", "fileURL", "url", "require_tokenize", "__commonJSMin", "exports", "module", "RE_AT_END", "RE_WORD_END", "RE_BAD_BRACKET", "RE_HEX_ESCAPE", "input", "options", "css", "ignore", "code", "content", "escape", "next", "quote", "currentToken", "escaped", "escapePos", "n", "prev", "length", "pos", "buffer", "returned", "lastBadParen", "position", "unclosed", "what", "endOfFile", "nextToken", "opts", "ignoreUnclosed", "controlChar", "back", "token", "require_parser", "__commonJSMin", "exports", "module", "AtRule", "Comment", "Declaration", "Root", "Rule", "tokenizer", "SAFE_COMMENT_NEIGHBOR", "findLastWithPosition", "tokens", "i", "token", "pos", "tokensToString", "from", "to", "result", "Parser", "input", "node", "type", "prev", "shift", "last", "open", "params", "brackets", "colon", "founded", "j", "element", "text", "match", "customProperty", "start", "propStart", "betweenStart", "firstSpacesStart", "next", "firstSpaces", "string", "cache", "str", "offset", "end", "bracket", "prop", "length", "value", "clean", "raw", "all", "lastTokenType", "spaces", "require_parse", "__commonJSMin", "exports", "module", "Container", "Input", "Parser", "parse", "css", "opts", "input", "parser", "e", "require_warning", "__commonJSMin", "exports", "module", "Container", "my", "Warning", "text", "opts", "range", "opt", "require_result", "__commonJSMin", "exports", "module", "Warning", "Result", "processor", "root", "opts", "text", "warning", "i", "require_warn_once", "__commonJSMin", "exports", "module", "printed", "message", "require_lazy_result", "__commonJSMin", "exports", "module", "Container", "Document", "MapGenerator", "parse", "Result", "Root", "stringify", "isClean", "my", "warnOnce", "TYPE_TO_CLASS_NAME", "PLUGIN_PROPS", "NOT_VISITORS", "CHILDREN", "isPromise", "obj", "getEvents", "node", "key", "type", "toStack", "events", "cleanMarks", "stack", "next", "i", "postcss", "LazyResult", "_LazyResult", "processor", "css", "opts", "root", "parser", "error", "plugin", "onRejected", "onFinally", "err", "add", "cb", "event", "filter", "promise", "e", "visitor", "roots", "subRoot", "str", "rootSource", "result", "data", "onFulfilled", "visitors", "visit", "iterator", "child", "visitNode", "descended", "dependant", "require_no_work_result", "__commonJSMin", "exports", "module", "MapGenerator", "parse", "Result", "stringify", "warnOnce", "NoWorkResult", "root", "parser", "error", "processor", "css", "opts", "str", "self", "map", "generatedCSS", "generatedMap", "onRejected", "onFinally", "onFulfilled", "require_processor", "__commonJSMin", "exports", "module", "Document", "LazyResult", "NoWorkResult", "Root", "Processor", "plugins", "normalized", "i", "css", "opts", "plugin", "require_postcss", "__commonJSMin", "exports", "module", "AtRule", "Comment", "Container", "CssSyntaxError", "Declaration", "Document", "fromJSON", "Input", "LazyResult", "list", "Node", "parse", "Processor", "Result", "Root", "Rule", "stringify", "Warning", "postcss", "plugins", "name", "initializer", "warningPrinted", "creator", "args", "transformer", "cache", "css", "processOpts", "pluginOpts", "defaults", "require_dayjs_min", "__commonJSMin", "exports", "module", "n", "r", "i", "s", "u", "a", "o", "c", "f", "h", "d", "l", "$", "y", "M", "t", "e", "m", "v", "g", "D", "p", "S", "_", "w", "O", "b", "Y", "require_launder", "__commonJSMin", "exports", "module", "dayjs", "cleanHref", "href", "firstIndex", "lastIndex", "naughtyHref", "options", "allowedSchemes", "allowProtocolRelative", "matches", "scheme", "self", "tag", "s", "def", "strings", "min", "max", "places", "httpsFix", "fixUrl", "choices", "choice", "b", "name", "criteria", "value", "date", "now", "components", "returnDefault", "d", "nowYear", "nowCentury", "theirYear", "time", "hours", "minutes", "seconds", "ampm", "tags", "filter", "id", "ids", "require_sanitize_html", "__commonJSMin", "exports", "module", "htmlparser", "escapeStringRegexp", "isPlainObject", "parseSrcset", "postcssParse", "launderNaughtyHref", "mediaTags", "vulnerableTags", "svgAnimationTags", "alwaysUrlAttributes", "severities", "loggerFor", "options", "source", "logger", "severity", "args", "each", "obj", "cb", "key", "has", "mergeClasses", "specific", "wildcard", "mergeStyles", "merged", "rules", "prop", "filter", "a", "n", "v", "isEmptyObject", "stringifySrcset", "parsedSrcset", "part", "sanitizeHtml", "VALID_HTML_ATTRIBUTE_NAME", "MAX_IFRAME_FALLBACK_DEPTH", "html", "_fallback", "baseDepth", "iframeFallbackDepth", "result", "tempResult", "Frame", "tag", "attribs", "that", "stack", "parentFrame", "htmlParserDefaults", "tagAllowed", "name", "nonTextTagsArray", "allowedAttributesMap", "allowedAttributesGlobMap", "attributes", "globRegex", "allowedClassesMap", "allowedClassesGlobMap", "allowedClassesRegexMap", "classes", "transformTagsMap", "transformTagsAll", "transform", "transFun", "depth", "skipMap", "transformMap", "skipText", "skipTextDepth", "rawTextEnd", "skipRawText", "addedText", "initializeState", "parser", "updateRawTextRegion", "frame", "skip", "hasText", "transformedTag", "animatesUrlAttribute", "findRawTextEnd", "escaped", "escapeHtml", "value", "passedAllowedAttributesMapCheck", "o", "newValue", "splitStrArray", "s", "naughtyHref", "isRefresh", "naughtyRefresh", "allowed", "parsed", "parseUrl", "allowedHostname", "hostname", "allowedDomain", "domain", "allowedSpecificClasses", "allowedWildcardClasses", "allowedSpecificClassesGlob", "allowedSpecificClassesRegex", "allowedWildcardClassesRegex", "allowedWildcardClassesGlob", "allowedClassesGlobs", "t", "filterClasses", "abstractSyntaxTree", "filteredAST", "filterCss", "stringifyStyleAttributes", "text", "lastFrame", "isImplied", "filterResult", "lastParsedIndex", "unparsed", "tagName", "from", "re", "match", "quote", "href", "allowedSchemes", "content", "input", "isWhitespace", "c", "position", "skipWhitespace", "lowerAt", "i", "timeStart", "url", "quoted", "end", "localPart", "schemeCheckedAttributes", "attributeName", "target", "localName", "lower", "base", "allowedStyles", "astRules", "selectedRule", "filterDeclarations", "extractedAttributes", "attrObject", "allowedDeclarationsList", "attributeObject", "regularExpression", "allowedGlobs", "clss", "glob", "newTagName", "newAttribs", "merge", "attrib", "_i18next", "createDefaultOrigin", "createDefaultConfig", "Configuration", "_Configuration", "instance", "newConfig", "ResponseError", "_ResponseError", "response", "message", "VehicleUnavailableError", "_VehicleUnavailableError", "throwErrorByType", "errorBody", "handleResponseError", "error", "BANK_ID_THUMBPRINT_HEADER", "HttpRequestBuilder", "acceptHeader", "method", "token", "body", "contentType", "thumbprint", "httpStatusCheck", "request", "httpStateContext", "context", "contextualize", "raw", "url", "options", "noContentCodes", "json", "err", "captureStateContext", "promise", "builder", "buildLookupRequest", "requestForgeryToken", "http\n .builder", "validateResponse", "lookupAddress", "lookupRequest", "config", "http\n .captureStateContext", "http.json", "http.context", "AddressLookupRequestBuilder", "personalNumber", "AddressLookupResponse", "CustomerBuilder", "address", "email", "phoneNumber", "givenName", "surname", "newAddressLookupRequest", "newCustomer", "api\n .lookupAddress", "buildInsuranceRequest", "content", "http\n .builder", "find", "InsuranceOptionsRequestBuilder", "id", "drivingDistance", "InsuranceOptionsResponse", "newInsuranceOptionsRequest", "getOptions", "api\n .find", "buildOptionsRequest", "http.builder", "buildCreateRequest", "validateOptionsResponse", "validateCreateResponse", "getInitUrl", "branchId", "init", "getCreateUrl", "create", "InsuranceBuilder", "addons", "OrderCreateRequestBuilder", "accessories", "a", "customer", "payment", "deliveryType", "insurance", "tradein", "redirect", "OrderCreateResponse", "OrderOptionsRequestBuilder", "PaymentLookupResponse", "OrderOptionsResponse", "accessory", "m", "delivery", "PaymentBuilder", "paymentType", "duration", "downPayment", "residualValue", "externalId", "creditAssessment", "OrderCreditAssessmentBuilder", "scoreId", "code", "recommendation", "decision", "newOptionsRequest", "newCreateRequest", "newInsurance", "newPayment", "newCreditAssessment", "api\n .init", "api\n .create", "lookup", "http\n .json", "PaymentLookupRequestBuilder", "residual", "financialOptionId", "newLookupRequest", "lookupPayment", "api\n .lookup", "VehicleLookupRequestBuilder", "registrationNumber", "mileage", "condition", "VehicleLookupResponse", "VehicleTradeBuilder", "comment", "newVehicleTrade", "lookupVehicle", "AuthMethod", "AuthStatus", "createRequest", "getRoute", "getUrl", "requestOptions", "route", "auth", "http.captureStateContext", "orderRef", "collect", "cancel", "http.raw", "refresh", "validate", "doAuthRequest", "doCollectRequest", "doCancelRequest", "qrcode", "doQrCodeRefreshRequest", "BankIdAuthRequestBuilder", "BankIdAuthResponse", "BankIdCollectRequestBuilder", "outstandingTransaction", "noClient", "started", "userSign", "expiredTransaction", "certificateErr", "userCancel", "cancelled", "startFailed", "resolvers", "resolveMessage", "hintCode", "resolve", "BankIdCollectResponse", "_BankIdCollectResponse", "status", "BankIdCancelRequestBuilder", "BankIdQrCodeRequestBuilder", "BankIdQrCodeResponse", "newAuthRequest", "newCollectRequest", "newCancelRequest", "newQrCodeRequest", "api\n .auth", "api\n .collect", "api.cancel", "api\n .qrcode", "requestCaseStatus", "caseId", "forgeryToken", "requestNewCase", "inquery", "requestSignCase", "requestCancelSignCase", "requestDeclineCase", "requestAcceptCase", "newCase", "inquiry", "getStatus", "signCase", "cancelSigning", "decline", "accept", "CreditAssessmentSignResponse", "MaritalStatus", "Employment", "HousingType", "CreditAssessmentStatus", "CreditAssessmentDecision", "CreditAssessmentRecommendation", "asStatus", "statusString", "asDecision", "text", "asRecommendation", "CreditAssessmentStatusResponse", "_CreditAssessmentStatusResponse", "hasFailedSigning", "isRenewHintCode", "validateHouseholdEconomy", "householdEconomy", "validateLoan", "loan", "validateCustomer", "validateInquiry", "api.newCase", "api\n .getStatus", "api\n .signCase", "api.cancelSigning", "api.accept", "api.decline", "DrivingDistance", "DeliveryType", "PaymentType", "VehicleCondition", "formatProdErrorMessage", "code", "$$observable", "symbol_observable_default", "randomString", "ActionTypes", "actionTypes_default", "isPlainObject", "obj", "proto", "createStore", "reducer", "preloadedState", "enhancer", "formatProdErrorMessage", "currentReducer", "currentState", "currentListeners", "nextListeners", "listenerIdCounter", "isDispatching", "ensureCanMutateNextListeners", "listener", "key", "getState", "subscribe", "isSubscribed", "listenerId", "dispatch", "action", "isPlainObject", "replaceReducer", "nextReducer", "actionTypes_default", "observable", "outerSubscribe", "observer", "observeState", "observerAsObserver", "symbol_observable_default", "import_object_path", "import_sanitize_html", "marked", "nbNO", "nb_NO_default", "svSE", "sv_SE_default", "getLanguage", "marketCode", "i18next", "_i18next", "initializeI18N", "locale", "i18n_default", "package_default", "trapFocus", "modalElement", "e", "focusableElements", "firstElement", "lastElement", "HtmlNode", "element", "settings", "existingElement", "attribute", "item", "HtmlNode_default", "ModalBody", "id", "ModalBody_default", "ModalCenter", "ModalCenter_default", "ButtonClose", "props", "title", "onClick", "ButtonClose_default", "ModalClose", "event", "onClose", "ModalClose_default", "ModalContainer", "ModalContainer_default", "ModalDialog", "ModalDialog_default", "getWordmarkLogotype", "market", "className", "getSymbolLogotype", "ModalFooter", "ModalFooter_default", "ModalHeader", "logo", "logoX2", "button", "ModalHeader_default", "Modal", "container", "center", "dialog", "body", "Modal_default", "creditAssessmentCancelSigning", "caseId", "creditAssessment", "convertPaymentLookupResponse", "plr", "convertCreditAssessmentStatusResponse", "cCAr", "convertOrderOptionsResponse", "cOOR", "option", "convertVehicleLookupResponse", "cVLR", "RESET", "reset", "dispatch", "SET_ORDER", "setOrder", "order", "vehicle", "SET_ID", "setId", "SET_CONTACT_EMAIL_AND_PHONE", "setContactAndPhone", "value", "SET_SOCIAL_ID_AND_ADDRESS", "setSocialIdAndAddress", "socialId", "address", "lastStage", "SET_ADDRESS", "setAddress", "SET_HOME_DELIVERY", "setHomeDelivery", "homeDelivery", "SET_DEALER", "setDealer", "dealer", "INIT_TRADE_IN", "initTradeIn", "SET_TRADE_IN", "setTradeIn", "tradeIn", "tradeInVehicle", "SET_FINANCIAL", "setFinancial", "paymentType", "SET_PAYMENT_LOOKUP_RESPONSE", "setPaymentLookupResponse", "paymentLookupResponse", "RESET_PAYMENT_LOOKUP_RESPONSE", "resetPaymentLookupResponse", "SET_DRIVING_DISTANCE", "setDrivingDistance", "drivingDistance", "COMPLETE_STAGE", "completeStage", "SET_OR_REMOVE_INSURANCE", "addOrRemoveInsurance", "insurance", "SET_OR_REMOVE_INSURANCE_ADDONS", "addOrRemoveInsuranceAddon", "insuranceAddons", "SET_OR_REMOVE_FREE_INSURANCE", "addOrRemoveFreeInsurance", "freeInsurance", "SET_OR_REMOVE_ACCESSORY", "addOrRemoveAccessory", "accessory", "GO_TO", "goTo", "view", "index", "subStage", "SET_STAGES", "setStages", "stages", "SET_CREATED_ORDER_ID", "setCreatedOrderId", "payment", "SET_CREDIT_ASSESSMENT_RESPONSE", "setCreditAssessmentResponse", "creditAssessmentResponse", "SET_STATE", "setState", "state", "isSame", "a", "b", "mock", "initNavigation", "initialState", "DrivingDistance", "getNextNavigationState", "currentStage", "getNextTopNavigationState", "currentTopNavigation", "nextNavigation", "next", "resolveDefaultPaymentOption", "paymentOptions", "PaymentType", "reducer", "action", "navigation", "topNavigation", "clean", "reducer_default", "createStore", "createReduxStore", "defaultCompare", "reduxWatch", "getState", "objectPath", "compare", "selectedCompare", "currentValue", "getValue", "fn", "newValue", "oldValue", "subscriptions", "registerSubsription", "s", "unregisterAllSubscriptions", "watch", "store", "path", "callback", "doNotRegister", "w", "watch_default", "EcomEvent", "EcomStep", "EcomView", "listners", "registerEventListner", "unregisterEventListner", "f", "eventHistory", "getLastHistory", "ecomEvent", "currentStep", "data", "ecomEvent_default", "intervals", "registerInterval", "key", "interval", "unregisterAllIntervals", "setVw", "vw", "useVwListner", "getType", "type", "Loader", "classList", "classType", "Loader_default", "Button", "disabled", "loading", "Button_default", "ButtonAlt", "ButtonAlt_default", "CONFIRM_CLOSE_NODE", "ABORT_CLOSE_NODE", "ConfirmClose", "onConfirmClose", "onAbortClose", "ConfirmClose_default", "toCdnMedia", "url", "cdn", "asUrl", "removeSpaces", "formatDecimals", "decimals", "upper", "prettyNumber", "formattedValue", "removeParts", "orginal", "remove", "orginalSplitt", "removeSplitted", "x", "formatShortDescription", "ItemTileSmall", "cdnMedia", "imageUrl", "vehicleTitle", "price", "sellerName", "ItemTileSmall_default", "ButtonArrowRight", "ButtonArrowRight_default", "ButtonSkip", "ButtonSkip_default", "KeyValueListItem", "image", "KeyValueListItem_default", "StageCompleted", "keyValueList", "changeButtonTitle", "onEdit", "keyValue", "StageCompleted_default", "ListItem", "active", "completed", "existingListItem", "content", "ListItem_default", "Arrow", "hide", "dataIcon", "Arrow_default", "getRightVariables", "ref", "itemWidth", "scrollWidth", "scrollLeft", "overflowElementWidth", "overflowElementScrollWidth", "OverflowGridList", "listRef", "left", "PREV_ID", "NEXT_ID", "rightHide", "OverflowGridList_default", "ButtonAddRemove", "selected", "fullSize", "buttonClassName", "selectedIcon", "ButtonAddRemove_default", "ButtonAsLink", "disable", "ButtonAsLink_default", "BUTTON_ADD_REMOVE", "BUTTON_ADD_REMOVE_NODE", "READ_MORE", "READ_MORE_NODE", "GridItem", "changes", "change", "priceDetails", "description", "onInfo", "onInfoId", "addRemoveButtonNodeId", "d", "OverflowGridItem_default", "createPortal", "destroyPortal", "el", "node", "ButtonAsLinkArrowLeft", "ButtonAsLinkArrowLeft_default", "ButtonClear", "ButtonClear_default", "Gallery", "m", "Gallery_default", "asHtml", "sanitizeHtml", "marked", "scrollTop", "elementScrollDesktop", "WAYKE_ECOM_MODAL_ID", "elementScrollMobile", "BUTTON_TOP_LEFT_NODE", "BUTTON_BOTTOM_LEFT_NODE", "BUTTON_ACCESSORY_ADD_REMOVE_NODE", "ACCESSORY_GALLERY_NODE", "AccessoryItemInfo", "name", "media", "logoUrl", "shortDescription", "longDescription", "salePrice", "i", "AccessoryItemInfo_default", "AccessoryItem", "_accessory", "AccessoryItem_default", "AccessoryList", "accessories", "overflowElement", "AccessoryList_default", "PROCEED", "PROCEED_NODE", "SKIP", "SKIP_NODE", "ACCESSORY_GRID_LIST_NODE", "Accessories", "part", "Accessories_default", "errorInputClassName", "InputError", "error", "errorMessage", "errorNode", "errorElement", "InputError_default", "helpClassName", "foldoutClassName", "InputInformation", "information", "existHelp", "existFoldout", "label", "informationElement", "InputInformation_default", "InputRadioField", "checked", "meta", "input", "InputRadioField_default", "InputRadioGroup", "border", "options", "footer", "onClickInformation", "InputRadioGroup_default", "getOrder", "request", "orders", "Alert", "tone", "children", "polite", "Alert_default", "CENTRAL_STORAGE_BRANCH", "CENTRAL_STORAGE_BRANCH_NODE", "CentralStorage", "selectedDealer", "convertedOrder", "createdOrderId", "dealers", "CentralStorage_default", "maskText", "text", "maskSSn", "ssn", "InputField", "min", "autocomplete", "placeholder", "unit", "pattern", "inputmode", "help", "onChange", "onBlur", "InputField_default", "regexEmail", "regexPhoneNumberVariant", "regexZip", "regexPersonalNumber", "regexRegistrationNumberSweden", "regexRegistrationNumberNorway", "regexNumber", "validationMethods", "nonLast", "asDate", "from", "to", "number", "trimmed", "hasCorrectLength", "isRegexMatch", "_s", "EMAIL_NODE", "EMAIL_INPUT_ID", "PHONE_NODE", "PHONE_INPUT_ID", "validation", "initalState", "customer", "EmailAndPhone", "currentTarget", "keyValueItems", "kv", "EmailAndPhone_default", "DisclaimerPadlock", "DisclaimerPadlock_default", "getAddressBySsn", "customers", "renderConditional", "condition", "SOCIAL_ID_NODE", "SOCIAL_ID_INPUT_ID", "SOCIAL_ID_INFO", "DISCLAIMER_NODE", "FullAddressBySocialId", "response", "policy", "FullAddressBySocialId_default", "GIVENNAME_NODE", "GIVENNAME_INPUT_ID", "SURNAME_NODE", "SURNAME_INPUT_ID", "STREET_NODE", "STREET_INPUT_ID", "STREET2_NODE", "STREET2_INPUT_ID", "POSTALCODE_NODE", "POSTALCODE_INPUT_ID", "CITY_NODE", "CITY_INPUT_ID", "FullAddressForm", "FullAddressForm_default", "FullAddress", "FullAddress_default", "Customer", "part1", "part2", "Customer_default", "getDeliveryDistance", "distance", "deliveryOption", "getTotalDeliveryCost", "deliveryDistance", "RADIO_HOME_TRUE", "RADIO_HOME_TRUE_NODE", "RADIO_HOME_FALSE", "RADIO_HOME_FALSE_NODE", "Delivery", "contactInformation", "addressDistance", "totalDeliveryCost", "DeliveryType", "maxDistance", "tooFarAway", "Delivery_default", "Image", "translateTradeInCondition", "translateDrivingDistance", "Accordion", "Accordion_default", "isMobile", "BankIdSignQrCode", "qrCode", "BankIdSignQrCode_default", "ButtonBankId", "ButtonBankId_default", "BankIdSignSameDevice", "autoLaunchUrl", "BankIdSignSameDevice_default", "BANKID_START_NODE", "BANKID_START", "ABORT", "ABORT_NODE", "AUTH_METHOD_NODE", "BankIdSign", "AuthMethod", "method", "info", "finalizing", "descriptionQrCode", "descriptionSameDevice", "onStart", "onAbort", "methodTitle", "methodDescription", "toggleMethodTitle", "BankIdSign_default", "Disclaimer", "Disclaimer_default", "InputSelect", "InputSelect_default", "creditAssessmentDecline", "creditAssessmentGetStatus", "creditAssessmentNewCase", "inquiry", "creditAssessmentSignCase", "creditAssessmentCase", "StageCompletedFinancialCreditAssessment", "decision", "loan", "CreditAssessmentRecommendation", "StageCompletedFinancialCreditAssessment_default", "RESULT", "RESULT_NODE", "CreditAssessmentApproved", "onProceed", "onGoBack", "CreditAssessmentApproved_default", "CreditAssessmentAssessManually", "CreditAssessmentAssessManually_default", "CreditAssessmentRejected", "CreditAssessmentRejected_default", "CreditAssessmentResult", "CreditAssessmentResult_default", "createTerm", "months", "isPositive", "factorOf12", "utils_default", "extractPaymentType", "extractLoanIndex", "MARITAL_STATUS", "MARITAL_STATUS_NODE", "INCOME", "INCOME_NODE", "EMPLOYMENT", "EMPLOYMENT_NODE", "HOUSEHOLD_CHILDREN", "HOUSEHOLD_CHILDREN_NODE", "HOUSING_COST", "HOUSING_COST_NODE", "DEBT_SPECIFICATION_CARD_CREDIT", "DEBT_SPECIFICATION_CARD_CREDIT_NODE", "DEBT_SPECIFICATION_CAR_LOAN", "DEBT_SPECIFICATION_CAR_LOAN_NODE", "DEBT_SPECIFICATION_COLLATERAL", "DEBT_SPECIFICATION_COLLATERAL_NODE", "DEBT_SPECIFICATION_LEASING_FEES", "DEBT_SPECIFICATION_LEASING_FEES_NODE", "DEBT_SPECIFICATION_PRIVATE_LOAN", "DEBT_SPECIFICATION_PRIVATE_LOAN_NODE", "HOUSING_TYPE", "HOUSING_TYPE_NODE", "PERFORM_APPLICATION", "PERFORM_APPLICATION_NODE", "DISCLAIMER_WRAPPER_NODE", "DISCLAIMER_SAFE_NODE", "WHY_DESCRIPTION", "MaritalStatus", "Employment", "HousingType", "getMock", "creditAssessmentHouseholdEconomy", "CreditAssessment", "supressTracking", "status", "currentCaseId", "initialPaymentLookupResponse", "updatePaymentLookupResponse", "monthlyCost", "interest", "downPayment", "duration", "creditAmount", "financialProductId", "householdEconomy", "assessmentCase", "scrollIntoView", "mobile", "branchName", "housingCostNode", "CreditAssessment_default", "ErrorAlert", "ErrorAlert_default", "respectStep", "step", "InputRange", "max", "percentage", "foldout", "inputFieldValueAsNumber", "modifiedNumberInRespectWithSteps", "elem", "inputField", "allowSlider", "InputRange_default", "getPayment", "vehicleId", "dealerId", "residual", "financialOptionId", "payments", "PieChart", "PieChart_default", "LoanDetailsBasic", "downPaymentPercentage", "creditAmountPercentage", "LoanDetailsBasic_default", "persistedShowDetails", "LoanDetailsDetailed", "administrationFee", "setupFee", "totalCreditCost", "effectiveInterest", "publicUrl", "loanOrgName", "LoanDetailsDetailed_default", "LoanDetailsMonthlyCost", "LoanDetailsMonthlyCost_default", "LOAN_DETAILS_MONTHLY_COST_NODE", "LOAN_DETAILS_PIE_CHART_NODE", "LOAN_DETAILS_BASIC_NODE", "LOAN_DETAILS_DETAILED_NODE", "LoanDetails", "total", "loanOrgLogo", "disclaimerText", "LoanDetails_default", "DOWNPAYMENT_RANGE_NODE", "DOWNPAYMENT_RANGE", "DURATION_RANGE_NODE", "DURATION_RANGE", "RESIDUAL_RANGE_NODE", "RESIDUAL_RANGE", "LOAN_DETAILS_id", "LOAN_DETAILS_NODE", "CREDIT_ASSESMENT_NODE", "ERROR_NODE", "Loan", "loanDetails", "shouldUseCreditScoring", "Loan_default", "CREDIT_ASSESSMENT_RESULT", "CREDIT_ASSESSMENT_RESULT_NODE", "StageCompletedFinancial", "currentPaymentLookupResponse", "StageCompletedFinancial_default", "FINANCIAL_OPTION_ID", "FINANCIAL_OPTION_NODE", "FINANCIAL_OPTION_SECOND_ID", "FINANCIAL_OPTION_SECOND_NODE", "RADIO_FINANCIAL_CASH", "RADIO_FINANCIAL_LOAN", "RADIO_FINANCIAL_LEASE", "PAYMENT_NODE", "PAYMENT_NODE_DISCLAIMER", "Financial", "_paymentType", "preventScrollIntoView", "cash", "loans", "lease", "firstGroupOptions", "loanPrice", "getCreditAmount", "secondGroupOptions", "paymentNode", "loanIndex", "Financial_default", "BUTTON_INSURANCE_ADD_REMOVE_NODE", "InsuranceItemInfo", "InsuranceItemInfo_default", "InsuranceItem", "InsuranceItem_default", "InsuranceList", "insurances", "InsuranceList_default", "INSURANCE_GRID_LIST_NODE", "PROCEED_INSURANCE", "PROCEED_INSURANCE_NODE", "SKIP_INSURANCES", "SKIP_INSURANCES_NODE", "DefaultInsurance", "DefaultInsurance_default", "getInsurances", "ButtonSuccess", "ButtonSuccess_default", "InputCheckbox", "append", "InputCheckbox_default", "InsuracenAddonBox", "InsuranceAddonBox_default", "ADDONS_NODE", "ACCORDION_NODE", "slugify", "_InsuranceItemInfo", "insuranceAddOns", "_initialAddons", "_addons", "initialAddons", "addons", "selectedAddon", "exclude", "containChanges", "legalDescription", "legalUrl", "insuranceItems", "prev", "curr", "addon", "subNode", "ii", "selectedAddons", "k", "EDIT_DRIVING_DISTANCE", "EDIT_DRIVING_DISTANCE_NODE", "IF_INSURANCE_CACHE", "InsuranceView", "drivingDistanceListner", "customerIdListner", "insuranceListner", "cacheKey", "cache", "insuranceListNode", "InsuranceView_default", "DISTANCE", "DISTANCE_NODE", "INSURANCE_INFO_NODE", "SHOW_INSURANCES", "SHOW_INSURANCES_NODE", "SHOW_INSURANCES_DISCLAIMER_NODE", "IfInsurance", "onSkip", "insuranceDisclaimerTitle", "insuranceInfoNode", "IfInsurance_default", "Insurance", "keyValueOptions", "insuranceOptions", "Insurance_default", "InputTextarea", "InputTextarea_default", "getTradeInVehicle", "vehicles", "REGISTRATION_NUMBER_ID", "REGISTRATION_NUMBER_NODE", "MILEAGE_ID", "MILEAGE_NODE", "DESCRIPTION_ID", "DESCRIPTION_NODE", "CONDITION_ID", "CONDITION_NODE", "FETCH", "FETCH_NODE", "TRADE_IN_NO", "TRADE_IN_NO_NODE", "CHANGE_BUTTON", "CHANGE_BUTTON_NODE", "PartTradeIn", "scandinavianMileage", "_response", "keyValueItemsUpper", "PartTradeIn_default", "TRADE_IN_YES", "TRADE_IN_YES_NODE", "TradeIn", "TradeIn_default", "stageMap", "createOrder", "paymentBuilder", "externalId", "scoreId", "recommendation", "financialProductCode", "params", "callbackUrl", "paymentUrl", "requestBuilder", "insuranceBuilder", "ACCEPT_CONDITIONS", "ACCEPT_CONDITIONS_NODE", "CONFIRM_BUTTON_NODE", "CONFIRM_BUTTON", "NoVerify", "ee", "conditionsPdfUri", "NoVerify_default", "swedbankPayment", "script", "Payment", "_payment", "Payment_default", "creditAssessmentAccept", "getBankIdAuth", "bankid", "getBankIdQrCode", "reference", "getBankIdStatus", "CONFIRM_CONDITIONS", "CONFIRM_CONDITIONS_NODE", "DISCLAIMER_POLICY_NODE", "DISCLAIMER_RESERVATION_NODE", "VerifyByBankId", "_e", "VerifyByBankId_default", "Confirmation", "bypassBankId", "Confirmation_default", "Main", "asideStepperWrapper", "pageFormAside", "stepper", "size", "stage", "Main_default", "OrderCallback", "callbackOrder", "OrderCallback_default", "CheckList", "Checklist_default", "ItemTileLarge", "imageUrls", "ItemTileLarge_default", "TimelineItem", "heading", "final", "TimelineItem_default", "getFinancialDescription", "paymentTypes", "hasCash", "hasLease", "hasLoan", "getDeliveryDescription", "hasPickup", "hasHomeDelivery", "HowTo", "stageOrderList", "timelineItemByStage", "HowTo_default", "PROCEED_BUTTON", "PROCEED_BUTTON_NODE", "PREVIEW_CHECKLIST", "PREVIEW_CHECKLIST_NODE", "Preview", "_order", "Preview_default", "StackNode", "StackNode_default", "dealerName", "customerName", "Centrallager", "Intro", "email", "Intro_default", "Order", "paymentLoan", "paymentLease", "Order_default", "SUMMARY_NODE", "Summary", "Summary_default", "OrderIdQueryString", "Payment3DSecurityCallback", "OrderWaykeIdQueryString", "TEST_HOST", "PROD_HOST", "resolveCdnMedia", "App", "config", "createdRoot", "rootNode", "newVal", "orderUrl", "payment3dSecurityCallback", "waykeId", "stateAsString", "lastEvent", "orderId", "orderWaykeId", "urlChanged", "firstView", "App_default", "index_default"]
|
|
7
|
+
}
|