diff --git a/.storybook/main.js b/.storybook/main.js index 460397c2..3aa2ca8e 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -4,7 +4,7 @@ import remarkGfm from 'remark-gfm'; export default { stories: [ '../docs/src/**/*.mdx', - '../oereb_client/**/*.stories.@(js|jsx|ts|tsx|mdx)', + '../oereb_client/**/*.@(mdx|stories.@(js|jsx|ts|tsx))', ], addons: [ "@storybook/addon-links", diff --git a/CHANGELOG.rst b/CHANGELOG.rst index ee76de1e..8cca327f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -6,6 +6,7 @@ Changelog https://github.com/openoereb/oereb_client/milestone/17 +- Include Matomo JavaScript Client - Dependency updates 2.1.3 diff --git a/docs/src/Configuration.mdx b/docs/src/Configuration.mdx index 9995575c..379da515 100644 --- a/docs/src/Configuration.mdx +++ b/docs/src/Configuration.mdx @@ -304,6 +304,12 @@ oereb_client: # parameter undefined to disable Google Analytics. google_analytics: UA-12345678-9 + # [OPTIONAL] Enable Matomo tracking by specifying matomo URL and site ID. Leave this + # parameter undefined to disable Matomo. + matomo: + url: https://matomo.example.com + id: 1 + # [OPTIONAL] The mask_surrounding layer can be used to lay a mask (half-transparent # white layer) on the surrounding cantons. You have to define a WMS URL and # params according to the ol.source.ImageWMS documentation: diff --git a/oereb_client/static/src/component/app/app.jsx b/oereb_client/static/src/component/app/app.jsx index 41bed0f7..3ff6533a 100644 --- a/oereb_client/static/src/component/app/app.jsx +++ b/oereb_client/static/src/component/app/app.jsx @@ -1,6 +1,6 @@ import {isString} from 'lodash'; import PropTypes from 'prop-types'; -import React from 'react'; +import React, {useEffect} from 'react'; import {useDispatch} from 'react-redux'; import {initAvailability, setAvailabilityPrefix} from '../../reducer/availability'; @@ -15,6 +15,7 @@ import OerebInformationPanel from '../information_panel/information_panel'; import OerebMap from '../map/map'; import OerebMenu from '../menu/menu'; import OerebMessage from '../message/message'; +import MatomoTracker from '../matomo_tracker/matomo_tracker'; const App = function (props) { const dispatch = useDispatch(); @@ -67,6 +68,11 @@ const App = function (props) { }); } + let tracker = null; + if (config['matomo'] && config['matomo']['url'] && config['matomo']['site_id']) { + tracker = ; + } + return (
@@ -74,6 +80,7 @@ const App = function (props) { + {tracker}
); }; diff --git a/oereb_client/static/src/component/matomo_tracker/matomo_tracker.jsx b/oereb_client/static/src/component/matomo_tracker/matomo_tracker.jsx new file mode 100644 index 00000000..ce9b330d --- /dev/null +++ b/oereb_client/static/src/component/matomo_tracker/matomo_tracker.jsx @@ -0,0 +1,26 @@ +import PropTypes from 'prop-types'; +import React, {useEffect} from 'react'; + +const MatomoTracker = ({matomoUrl, siteId}) => { + useEffect(() => { + const script = document.createElement('script'); + script.type = 'text/javascript'; + script.async = true; + script.defer = true; + script.src = `${matomoUrl}/matomo.js`; + document.body.appendChild(script); + window._paq = window._paq || []; + window._paq.push(['trackPageView']); + window._paq.push(['enableLinkTracking']); + window._paq.push(['setTrackerUrl', `${matomoUrl}/matomo.php`]); + window._paq.push(['setSiteId', siteId]); + }, [matomoUrl, siteId]); + return null; +}; + +MatomoTracker.propTypes = { + matomoUrl: PropTypes.string.isRequired, + siteId: PropTypes.number.isRequired +}; + +export default MatomoTracker; diff --git a/oereb_client/static/src/component/matomo_tracker/matomo_tracker.mdx b/oereb_client/static/src/component/matomo_tracker/matomo_tracker.mdx new file mode 100644 index 00000000..067e1b39 --- /dev/null +++ b/oereb_client/static/src/component/matomo_tracker/matomo_tracker.mdx @@ -0,0 +1,18 @@ +import {Meta} from '@storybook/blocks'; + + + +# App + +A hidden component enabling user tracking using Matomo. + +```jsx + +``` + +### Parameters + +| Param | Type | Description | +| --- | --- | --- | +| matomoUrl | String | The URL of the Matomo instance. | +| siteId | Number | The ID of the Site configured in Matomo. | \ No newline at end of file diff --git a/oereb_client/static/src/reducer/accordion.mdx b/oereb_client/static/src/reducer/accordion.mdx deleted file mode 100644 index a869b779..00000000 --- a/oereb_client/static/src/reducer/accordion.mdx +++ /dev/null @@ -1,27 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; - -export const accordionSlice = createSlice({ - name: 'accordion', - initialState: { - category: null, - topic: null, - viewServices: [], - callback: null - }, - reducers: { - setActiveCategory: (state, action) => { - state.category = action.payload; - }, - setActiveTopic: (state, action) => { - state.topic = action.payload; - }, - setViewServices: (state, action) => { - state.viewServices = action.payload.viewServices; - state.callback = action.payload.callback; - } - } -}); - -export const {setActiveCategory, setActiveTopic, setViewServices} = accordionSlice.actions; - -export default accordionSlice.reducer; diff --git a/oereb_client/static/src/reducer/availability.mdx b/oereb_client/static/src/reducer/availability.mdx deleted file mode 100644 index a8f8596c..00000000 --- a/oereb_client/static/src/reducer/availability.mdx +++ /dev/null @@ -1,35 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; -import {isBoolean, isString} from "lodash"; - -export const availabilitySlice = createSlice({ - name: 'availability', - initialState: { - key: 'OerebAvailability', - visible: true - }, - reducers: { - setAvailabilityPrefix: (state, action) => { - state.key = action.payload + 'OerebAvailability'; - }, - initAvailability: (state) => { - const availability = localStorage.getItem(state.key); - if (isBoolean(availability)) { - state.visible = availability; - } - else if (isString(availability)) { - state.visible = JSON.parse(availability); - } - else { - state.visible = true; - } - }, - showAvailability: (state, action) => { - state.visible = action.payload; - localStorage.setItem(state.key, state.visible); - } - } -}); - -export const {setAvailabilityPrefix, initAvailability, showAvailability} = availabilitySlice.actions; - -export default availabilitySlice.reducer; diff --git a/oereb_client/static/src/reducer/config.mdx b/oereb_client/static/src/reducer/config.mdx deleted file mode 100644 index e200359f..00000000 --- a/oereb_client/static/src/reducer/config.mdx +++ /dev/null @@ -1,17 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; - -export const configSlice = createSlice({ - name: 'config', - initialState: { - config: {} - }, - reducers: { - update: (state, action) => { - state.config = action.payload; - } - } -}); - -export const {update} = configSlice.actions; - -export default configSlice.reducer; diff --git a/oereb_client/static/src/reducer/extract.mdx b/oereb_client/static/src/reducer/extract.mdx deleted file mode 100644 index 4146f92f..00000000 --- a/oereb_client/static/src/reducer/extract.mdx +++ /dev/null @@ -1,122 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; - -export const extractSlice = createSlice({ - name: 'extract', - initialState: { - loading: false, - zoom: false, - visible: false, - collapsed: false, - error: false, - egrid: null, - identdn: null, - number: null, - information: false, - tab: 0, - data: {}, - highlight: true, - background: true - }, - reducers: { - loadExtract: (state, action) => { - if (!state.loading) { - state.loading = true; - state.visible = false; - state.collapsed = false; - state.error = false; - state.information = false; - state.tab = 0; - state.egrid = action.payload.egrid; - state.identdn = action.payload.identdn; - state.number = action.payload.number; - state.zoom = action.payload.zoom; - state.data = {}; - const query = new URLSearchParams(window.location.search); - if (state.egrid !== null) { - query.set('egrid', state.egrid); - } - else if (state.identdn !== null && state.number !== null) { - query.set('identdn', state.identdn); - query.set('number', state.number); - } - window.history.pushState(null, null, '?' + query.toString()); - } - }, - showExtract: (state, action) => { - state.loading = false; - state.visible = true; - state.collapsed = false; - state.error = false; - state.information = false; - state.highlight = true; - state.background = true; - state.tab = 0; - state.data = action.payload; - }, - showError: (state) => { - state.loading = false; - state.zoom = false; - state.visible = false; - state.collapsed = false; - state.error = true; - state.information = false; - state.tab = 0; - state.data = {}; - const query = new URLSearchParams(window.location.search); - query.delete('egrid'); - query.delete('identdn'); - query.delete('number'); - window.history.pushState(null, null, '?' + query.toString()); - }, - hideExtract: (state) => { - state.loading = false; - state.zoom = false; - state.visible = false; - state.collapsed = false; - state.error = false; - state.egrid = null; - state.identdn = null; - state.number = null; - state.information = false; - state.tab = 0; - state.data = {}; - const query = new URLSearchParams(window.location.search); - query.delete('egrid'); - query.delete('identdn'); - query.delete('number'); - window.history.pushState(null, null, '?' + query.toString()); - }, - toggleCollapsed: (state) => { - state.collapsed = !state.collapsed; - }, - toggleHighlight: (state) => { - state.highlight = !state.highlight; - }, - toggleBackground: (state) => { - state.background = !state.background; - }, - toggleInformationPanel: (state) => { - state.information = !state.information; - if (state.information) { - state.tab = 0; - } - }, - setInformationPanelTab: (state, action) => { - state.tab = action.payload; - } - } -}); - -export const { - loadExtract, - showExtract, - showError, - hideExtract, - toggleCollapsed, - toggleHighlight, - toggleBackground, - toggleInformationPanel, - setInformationPanelTab -} = extractSlice.actions; - -export default extractSlice.reducer; diff --git a/oereb_client/static/src/reducer/history.mdx b/oereb_client/static/src/reducer/history.mdx deleted file mode 100644 index cb5d30dc..00000000 --- a/oereb_client/static/src/reducer/history.mdx +++ /dev/null @@ -1,49 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; -import {isEqual} from "lodash"; - -export const historySlice = createSlice({ - name: 'history', - initialState: { - key: 'OerebHistory', - elements: [] - }, - reducers: { - setHistoryPrefix: (state, action) => { - state.key = action.payload + 'OerebHistory'; - }, - initHistory: (state) => { - const history = localStorage.getItem(state.key); - if (history) { - state.elements = JSON.parse(history); - } - else { - state.elements = []; - } - }, - updateHistory: (state, action) => { - const extract = action.payload; - const realEstate = extract['GetExtractByIdResponse']['extract']['RealEstate']; - const newElement = { - EGRID: realEstate['EGRID'], - IdentDN: realEstate['IdentDN'], - Municipality: realEstate['MunicipalityName'], - Number: realEstate['Number'] - }; - for (let i = 0; i < state.elements.length; i++) { - if (isEqual(newElement, state.elements[i])) { - state.elements.splice(i, 1); - break; - } - } - if (state.elements.length > 4) { - state.elements.splice(0, 1); - } - state.elements.push(newElement); - localStorage.setItem(state.key, JSON.stringify(state.elements)); - } - } -}); - -export const {setHistoryPrefix, initHistory, updateHistory} = historySlice.actions; - -export default historySlice.reducer; diff --git a/oereb_client/static/src/reducer/language.mdx b/oereb_client/static/src/reducer/language.mdx deleted file mode 100644 index 8f45f834..00000000 --- a/oereb_client/static/src/reducer/language.mdx +++ /dev/null @@ -1,41 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; - -import i18n from "../i18n"; - -export const languageSlice = createSlice({ - name: 'language', - initialState: { - current: null, - default: null, - available: [] - }, - reducers: { - initLanguages: (state, action) => { - state.default = action.payload.default; - state.available = action.payload.available; - const query = new URLSearchParams(window.location.search); - if (query.has('lang') && state.available.indexOf(query.get('lang')) > -1) { - state.current = query.get('lang'); - } - else { - state.current = state.default; - } - i18n.changeLanguage(state.current); - query.set('lang', state.current); - window.history.pushState(null, null, '?' + query.toString()); - }, - setLanguage: (state, action) => { - if (state.available.indexOf(action.payload) > -1) { - state.current = action.payload; - i18n.changeLanguage(state.current); - const query = new URLSearchParams(window.location.search); - query.set('lang', state.current); - window.history.pushState(null, null, '?' + query.toString()); - } - } - } -}); - -export const {initLanguages, setLanguage} = languageSlice.actions; - -export default languageSlice.reducer; diff --git a/oereb_client/static/src/reducer/map.mdx b/oereb_client/static/src/reducer/map.mdx deleted file mode 100644 index 7c0aa44b..00000000 --- a/oereb_client/static/src/reducer/map.mdx +++ /dev/null @@ -1,21 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; - -export const mapSlice = createSlice({ - name: 'map', - initialState: { - map: null, - topicLayers: null, - baseLayer: null - }, - reducers: { - initMap: (state, action) => { - state.map = action.payload.map; - state.topicLayers = action.payload.topicLayers; - state.baseLayer = action.payload.baseLayer; - } - } -}); - -export const {initMap} = mapSlice.actions; - -export default mapSlice.reducer; diff --git a/oereb_client/static/src/reducer/map_query.mdx b/oereb_client/static/src/reducer/map_query.mdx deleted file mode 100644 index b2cf9f23..00000000 --- a/oereb_client/static/src/reducer/map_query.mdx +++ /dev/null @@ -1,36 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; - -export const mapQuerySlice = createSlice({ - name: 'mapQuery', - initialState: { - loading: false, - visible: false, - posX: 0.0, - posY: 0.0, - results: [] - }, - reducers: { - loadAt: (state, action) => { - if (!state.loading) { - state.loading = true; - state.visible = false; - state.posX = action.payload.posX; - state.posY = action.payload.posY; - state.results = []; - } - }, - show: (state, action) => { - state.loading = false; - state.visible = true; - state.results = action.payload.results; - }, - hide: (state) => { - state.loading = false; - state.visible = false; - } - } -}); - -export const {loadAt, show, hide} = mapQuerySlice.actions; - -export default mapQuerySlice.reducer; diff --git a/oereb_client/static/src/reducer/message.mdx b/oereb_client/static/src/reducer/message.mdx deleted file mode 100644 index 23f6fe58..00000000 --- a/oereb_client/static/src/reducer/message.mdx +++ /dev/null @@ -1,59 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; -import {v4 as uuidv4} from "uuid"; - -export const MESSAGE_TIMEOUT = 10000; - -export const messageSlice = createSlice({ - name: 'message', - initialState: { - messages: [] - }, - reducers: { - warning: (state, action) => { - state.messages.push({ - id: uuidv4(), - type: 'warning', - text: action.payload, - timestamp: Date.now() - }); - }, - error: (state, action) => { - state.messages.push({ - id: uuidv4(), - type: 'error', - text: action.payload, - timestamp: Date.now() - }); - }, - cleanMessages: (state) => { - for (let i = state.messages.length; i > 0; i--) { - const now = Date.now(); - if (now - state.messages[i - 1].timestamp >= MESSAGE_TIMEOUT) { - state.messages.splice(i - 1, 1); - } - } - } - } -}); - -export const {cleanMessages, error, warning} = messageSlice.actions; - -export const showWarning = function(text) { - return function(dispatch) { - dispatch(warning(text)); - setTimeout(() => { - dispatch(cleanMessages()); - }, MESSAGE_TIMEOUT); - } -} - -export const showError = function(text) { - return function(dispatch) { - dispatch(error(text)); - setTimeout(() => { - dispatch(cleanMessages()); - }, MESSAGE_TIMEOUT); - } -} - -export default messageSlice.reducer; diff --git a/oereb_client/static/src/reducer/symbol_zoom.mdx b/oereb_client/static/src/reducer/symbol_zoom.mdx deleted file mode 100644 index 5fd5525e..00000000 --- a/oereb_client/static/src/reducer/symbol_zoom.mdx +++ /dev/null @@ -1,35 +0,0 @@ -import {createSlice} from "@reduxjs/toolkit"; -import {isBoolean, isString} from "lodash"; - -export const symbolZoomSlice = createSlice({ - name: 'symbolZoom', - initialState: { - key: 'OerebSymbolZoom', - enabled: true - }, - reducers: { - setSymbolZoomPrefix: (state, action) => { - state.key = action.payload + 'OerebSymbolZoom'; - }, - initSymbolZoom: (state) => { - const enabled = localStorage.getItem(state.key); - if (isBoolean(enabled)) { - state.enabled = enabled; - } - else if (isString(enabled)) { - state.enabled = JSON.parse(enabled); - } - else { - state.enabled = true; - } - }, - enableSymbolZoom: (state, action) => { - state.enabled = action.payload; - localStorage.setItem(state.key, state.enabled); - } - } -}); - -export const {setSymbolZoomPrefix, initSymbolZoom, enableSymbolZoom} = symbolZoomSlice.actions; - -export default symbolZoomSlice.reducer; diff --git a/oereb_client/views/index.py b/oereb_client/views/index.py index 0979bbd6..d403e39c 100644 --- a/oereb_client/views/index.py +++ b/oereb_client/views/index.py @@ -195,7 +195,8 @@ def get_config(self): 'use_tile_wms': self.config_.get('use_tile_wms', False), 'show_scale_bar': self.config_.get('show_scale_bar', False), 'extract_json_timeout': self.config_.get('extract_json_timeout', 60), - 'extract_pdf_timeout': self.config_.get('extract_pdf_timeout', 120) + 'extract_pdf_timeout': self.config_.get('extract_pdf_timeout', 120), + 'matomo': self.config_.get('matomo', {}) } def get_title(self): diff --git a/package-lock.json b/package-lock.json index 0fa8b5f0..c2902294 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2827,17 +2827,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -4111,28 +4100,6 @@ "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==", "dev": true }, - "node_modules/@types/eslint": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", - "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", @@ -4550,181 +4517,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, "node_modules/@yarnpkg/fslib": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", @@ -4792,16 +4584,6 @@ "acorn": "^6 || ^7 || ^8" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5788,16 +5570,6 @@ "node": ">=10" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/citty": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", @@ -6480,20 +6252,6 @@ "node": ">= 0.8" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/ensure-type": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/ensure-type/-/ensure-type-1.5.1.tgz", @@ -7749,16 +7507,6 @@ "node": ">= 0.6" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -8581,13 +8329,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, "node_modules/globals": { "version": "15.9.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", @@ -9833,47 +9574,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -10064,13 +9764,6 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -10210,16 +9903,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -12681,16 +12364,6 @@ "url": "https://opencollective.com/ramda" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -13574,16 +13247,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -14489,120 +14152,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terser": { - "version": "5.31.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", - "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -15539,20 +15088,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", @@ -16604,20 +16139,6 @@ "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", "dev": true }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -16642,54 +16163,6 @@ "node": ">=12" } }, - "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -16705,90 +16178,6 @@ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "peer": true - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", diff --git a/test/js/component/matomo_tracker/matomo_tracker.test.jsx b/test/js/component/matomo_tracker/matomo_tracker.test.jsx new file mode 100644 index 00000000..46577315 --- /dev/null +++ b/test/js/component/matomo_tracker/matomo_tracker.test.jsx @@ -0,0 +1,16 @@ +import {render} from '@testing-library/react'; +import React from "react"; + +import MatomoTracker from '../../../../oereb_client/static/src/component/matomo_tracker/matomo_tracker'; + +describe('permalink component', () => { + + it('should render permalink modal', async () => { + expect(document.body.getElementsByTagName('script')).toHaveLength(0); + render(); + const scripts = document.body.getElementsByTagName('script'); + expect(scripts).toHaveLength(1); + expect(scripts[0].src).toEqual('https://example.com/matomo.js'); + }); + +}); \ No newline at end of file diff --git a/test/py/test_views_index.py b/test/py/test_views_index.py index a8924a32..bb27a84f 100644 --- a/test/py/test_views_index.py +++ b/test/py/test_views_index.py @@ -148,7 +148,8 @@ def test_get_config(mock_request): 'use_tile_wms': False, 'show_scale_bar': False, 'extract_json_timeout': 60, - 'extract_pdf_timeout': 120 + 'extract_pdf_timeout': 120, + 'matomo': {} } @@ -182,7 +183,8 @@ def test_get_optional_parameters(mock_request): 'use_tile_wms': True, 'show_scale_bar': True, 'extract_json_timeout': 60, - 'extract_pdf_timeout': 120 + 'extract_pdf_timeout': 120, + 'matomo': {} } @@ -215,7 +217,8 @@ def test_get_config_custom_timeout(mock_request): 'use_tile_wms': False, 'show_scale_bar': False, 'extract_json_timeout': 10, - 'extract_pdf_timeout': 20 + 'extract_pdf_timeout': 20, + 'matomo': {} }