diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..882936f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +coverage +.idea \ No newline at end of file diff --git a/README.md b/README.md index 42815b9..c33e962 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# GetBible Tooltips Integration Guide +# GetBible Loader Integration Guide ## Overview -GetBible Tooltips is an intuitive and lightweight JavaScript solution for embedding Bible scripture tooltips into your website. By simply adding the `getBible` class to any element on your webpage, you can enable users to see the full scripture text in a tooltip when they hover over a reference. +GetBible loader is an intuitive and lightweight JavaScript solution for embedding Bible scripture into your website. By simply adding the `getBible` class to any element that has a scripture reference on your webpage, you can enable users to see the full scripture text as inline text, a tooltip or a modal. ## How to Add GetBible Tooltips to Your Website @@ -12,7 +12,7 @@ GetBible Tooltips is an intuitive and lightweight JavaScript solution for embedd ```html - + ``` 2. **Markup Your Scripture References:** @@ -27,12 +27,13 @@ GetBible Tooltips is an intuitive and lightweight JavaScript solution for embedd ``` - For a detailed example, check out the [basic usage example](https://git.vdm.dev/getBible/loader/src/branch/master/example/basic.html) in the `getbible/loader` repository. + For a detailed examples, check out the [tests](https://git.vdm.dev/getBible/loader/src/branch/master/tests/) in the `getbible/loader` repository. ## Utilizing Data Attributes -Data attributes allow you to customize the behavior and display of the scripture tooltips. +Data attributes allow you to customize the behavior and display of the scripture. +- `data-format`: Specify the format you would like to load (e.g., `modal`). There are three options `modal`, `inline`, and `tooltip` you can just select one at a time. - `data-translation`: Specify the Bible translations to use, separated by semicolons (e.g., `kjv;aov`). The tooltip will fetch the scripture from each translation listed. - `data-show-translation`: Set to `1` to display the translation name in the tooltip. - `data-show-abbreviation`: Set to `1` to display the abbreviation of the translation in the tooltip. diff --git a/dist/js/getBible.js b/dist/js/getBible.js index 7977d57..e7beea6 100644 --- a/dist/js/getBible.js +++ b/dist/js/getBible.js @@ -1,152 +1,976 @@ -/*! getBible Loader v2.0.2 | https://getbible.net | (c) 2023 Llewellyn van der Merwe | MIT License */ +/** + * getBible Loader v3.0.0 + * https://getbible.net + * (c) 2014 - 2023 Llewellyn van der Merwe + * MIT License + **/ -class GetBibleTooltip { - constructor() { - this.apiEndpoint = 'https://query.getbible.net/v2/'; - this.findAndFetchScriptureReferences(); - } +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +})((function () { 'use strict'; - // Find elements with the 'getBible' class and fetch their references individually - findAndFetchScriptureReferences() { - const elements = document.querySelectorAll('.getBible'); - elements.forEach(element => { - const references = element.innerHTML.split(';'); - const translations = (element.dataset.translation || 'kjv').toLowerCase().split(';'); - const showBookName = element.dataset.showBookName ? - parseInt(element.dataset.showBookName, 10) : 1; - const showTranslation = element.dataset.showTranslation ? - parseInt(element.dataset.showTranslation, 10) : 0; - const showAbbreviation = element.dataset.showAbbreviation ? - parseInt(element.dataset.showAbbreviation, 10) : 0; - const showLanguage = element.dataset.showLanguage ? - parseInt(element.dataset.showLanguage, 10) : 0; - if (references) { - references.forEach(reference => { - translations.forEach(translation => { - this.fetchScripture(reference.trim(), translation.trim()).then(scripture => { - if (scripture) { - this.addToolTip( - element, - scripture, - showBookName, - showTranslation, - showAbbreviation, - showLanguage - ); - } - }).catch(error => console.error(error)); - }); + /** + * Class for managing local storage of scripture data. + */ + class Memory { + // Constant representing one month in milliseconds. + static ONE_MONTH_IN_MILLISECONDS = 30 * 24 * 60 * 60 * 1000; + + /** + * Stores scripture data in local storage. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @param {Object} data - The scripture data to be stored. + * @throws {Error} If storing data fails. + */ + static set(reference, translation, data) { + const key = this.#key(reference, translation); + const item = { + data, + timestamp: Date.now(), + }; + try { + localStorage.setItem(key, JSON.stringify(item)); + } catch (error) { + console.error('Error storing data in local storage:', error); + throw error; + } + } + + /** + * Retrieves scripture data from local storage. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {Promise} The scripture data or null if not found. + */ + static async get(reference, translation) { + return this.#get(reference, translation); + } + + /** + * Internal method to check local storage for scripture data. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {Object|null} The stored data or null if not found. + * @throws {Error} If parsing or retrieval from local storage fails. + * @private + */ + static #get(reference, translation) { + const key = this.#key(reference, translation); + try { + const storedItem = localStorage.getItem(key); + if (storedItem) { + const { data, timestamp } = JSON.parse(storedItem); + if (timestamp > Date.now() - Memory.ONE_MONTH_IN_MILLISECONDS) { + return data; + } + } + return null; + } catch (error) { + console.error('Error parsing or retrieving data from local storage:', error); + throw error; + } + } + + /** + * Generates a key for scripture data storage. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {string} A unique key for local storage. + * @private + */ + static #key(reference, translation) { + return `getBible-${translation}-${reference}`; + } + } + + /** + * Class for handling API calls to fetch scripture data. + */ + class Api { + /** + * Constructs an Api instance with a default or specified API endpoint. + * + * @param {string} apiEndpoint - The endpoint URL for the API. + */ + constructor(apiEndpoint = 'https://query.getbible.net/v2/') { + this.apiEndpoint = apiEndpoint; + } + + /** + * Fetches scripture from the API, using local storage to cache responses. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {Promise} A promise that resolves with the scripture data. + * @throws {Error} If the API request fails. + */ + async get(reference, translation) { + try { + const localStorageData = await Memory.get(reference, translation); + if (localStorageData !== null) { + return localStorageData; + } + + const response = await fetch(this.#url(reference, translation)); + + if (!response.ok) { + throw new Error(`${response.status} - ${response.statusText || 'Failed to fetch scripture'}`); + } + + const data = await response.json(); + await Memory.set(reference, translation, data); + return data; + } catch (error) { + console.error('Error fetching data:', error); + throw new Error(error.message || 'Error fetching scripture'); + } + } + + /** + * Constructs the URL for the API call. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {string} The constructed URL for the API request. + * @private + */ + #url(reference, translation) { + return `${this.apiEndpoint}${encodeURIComponent(translation)}/${encodeURIComponent(reference)}`; + } + } + + class BaseFormat { + /** + * Get formats the verses. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted verses. + * @abstract + */ + get(data, showBook, showTrans, showAbbr, showLang) { + throw new Error("The 'get' method must be implemented in BaseFormat subclass."); + } + } + + class BlockFormat extends BaseFormat { + /** + * Formats the verses for HTML block elements. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted HTML string. + */ + get(data, showBook, showTrans, showAbbr, showLang) { + let formattedHtml = ''; + let setBookName = new Set(); + let setTranslation = new Set(); + let setAbbreviation = new Set(); + let setLanguage = new Set(); + + for (const key in data) { + if (!data.hasOwnProperty(key)) continue; + + let headerParts = []; + if (showTrans && !setTranslation.has(key)) { + headerParts.push(`${data[key].translation}`); + setTranslation.add(key); + } + if (showAbbr && !setAbbreviation.has(key)) { + headerParts.push(`${data[key].abbreviation}`); + setAbbreviation.add(key); + } + if (showBook && !setBookName.has(key)) { + headerParts.push(`${data[key].name}`); + setBookName.add(key); + } + if (showLang && !setLanguage.has(key)) { + headerParts.push(`${data[key].language}`); + setLanguage.add(key); + } + + // Construct the header + if (headerParts.length > 0) { + formattedHtml += `
[${headerParts.join(' - ')}]
\n`; + } + + // Add verses + const verses = data[key].verses + .map(verse => `${verse.verse}. ${verse.text}`) + .join("
"); + formattedHtml += `
${verses}

`; + } + + return `
${formattedHtml}
`; + } + } + + class InlineFormat extends BaseFormat { + /** + * Formats the verses for HTML inline elements. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted HTML string. + */ + get(data, showBook, showTrans, showAbbr, showLang) { + let formattedHtml = ''; + let setBookName = new Set(); + let setTranslation = new Set(); + let setAbbreviation = new Set(); + let setLanguage = new Set(); + + for (const key in data) { + if (!data.hasOwnProperty(key)) continue; + + let footerParts = []; + if (showTrans && !setTranslation.has(key)) { + footerParts.push(`${data[key].translation}`); + setTranslation.add(key); + } + if (showAbbr && !setAbbreviation.has(key)) { + footerParts.push(`${data[key].abbreviation}`); + setAbbreviation.add(key); + } + if (showBook && !setBookName.has(key)) { + footerParts.push(`${data[key].name}`); + setBookName.add(key); + } + if (showLang && !setLanguage.has(key)) { + footerParts.push(`${data[key].language}`); + setLanguage.add(key); + } + + // Add verses + const verses = data[key].verses + .map(verse => `${verse.verse}. ${verse.text}`) + .join("\n"); + formattedHtml += `${verses}\n`; + + // Construct the footer + if (footerParts.length > 0) { + formattedHtml += `[${footerParts.join(' - ')}]\n`; + } + } + + return `${formattedHtml}`; + } + } + + class PlainFormat extends BaseFormat { + /** + * Formats the verses for plain text display. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted text. + */ + get(data, showBook, showTrans, showAbbr, showLang) { + let formattedText = ''; + let setBookName = new Set(); + let setTranslation = new Set(); + let setAbbreviation = new Set(); + let setLanguage = new Set(); + + for (const key in data) { + if (!data.hasOwnProperty(key)) continue; // Ensure processing only own properties + + let headerParts = []; + if (showTrans && !setTranslation.has(key)) { + headerParts.push(data[key].translation); + setTranslation.add(key); + } + if (showAbbr && !setAbbreviation.has(key)) { + headerParts.push(data[key].abbreviation); + setAbbreviation.add(key); + } + if (showBook && !setBookName.has(key)) { + headerParts.push(data[key].name); + setBookName.add(key); + } + if (showLang && !setLanguage.has(key)) { + headerParts.push(data[key].language); + setLanguage.add(key); + } + + // Construct the header + if (headerParts.length > 0) { + formattedText += '[' + headerParts.join(' - ') + "]\n"; + } + + // Add verses + const verses = data[key].verses.map(verse => `${verse.verse}. ${verse.text}`).join("\n"); + formattedText += verses + "\n\n"; // Add extra newline for separation + } + + return formattedText.trim(); + } + } + + /** + * Format class responsible for creating and managing different types of formats + * based on the specified type. + */ + class Format { + /** + * Constructs a Format instance based on the given type. + * + * @param {string} formatType - The format type. + */ + constructor(formatType = 'tooltip') { + const formatTypes = { + 'modal': BlockFormat, + 'inline': InlineFormat, + 'tooltip': PlainFormat + }; + + const FormatType = formatTypes[formatType] || PlainFormat; + this.format = new FormatType(); + } + + /** + * Get the formatted verses. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted verses. + */ + get(data, showBook, showTrans, showAbbr, showLang) { + return this.format.get(data, showBook, showTrans, showAbbr, showLang); + } + } + + class BaseModal { + /** + * Creates a new BaseModal instance. + * + * @param {HTMLElement} triggerElement - The elements that triggers the modal. + */ + constructor(triggerElement) { + this.modalId = `modal-${Math.random().toString(36).slice(2, 11)}`; + this.triggerElement = triggerElement; + this.triggerElement.style.cursor = 'pointer'; + this.initializeTrigger(); + } + + /** + * Loads content into the modal. + * + * @param {string} content - The content to load into the modal. + */ + load(content) { + const existingModal = document.getElementById(this.modalId); + // Check if modal already exists + if (existingModal) { + // Update the content of the existing modal + const contentDiv = document.getElementById(`${this.modalId}-content`); + if (contentDiv) { + contentDiv.innerHTML += content; + } + } else { + // If modal doesn't exist, create it with the new content + this.create(content); + } + } + + /** + * Insert HTML into the dom. + * + * @param {string} html - The html to insert. + */ + insertIntoDOM(html) { + document.body.insertAdjacentHTML('beforeend', html); + } + + /** + * Creates the modal. + * + * @param {string} content - The initial content of the modal. + */ + create(content) { + const modalHtml = ` + `; + this.insertIntoDOM(modalHtml); + + const modalElement = document.getElementById(this.modalId); + modalElement.addEventListener('click', (event) => { + if (event.target === modalElement) { + modalElement.style.display = 'none'; + } }); } + + /** + * Initializes the modal trigger. + * + */ + initializeTrigger() { + this.triggerElement.addEventListener('click', () => { + document.getElementById(this.modalId).style.display = 'flex'; + }); + } + } + + class UikitModal extends BaseModal { + constructor(triggerElement) { + super(triggerElement); + } + + show() { + UIkit.modal(`#${this.modalId}`).show(); + } + + hide() { + UIkit.modal(`#${this.modalId}`).hide(); + } + + create(content) { + const modalHtml = ` +
+
+ +
+ ${content} +
+
+
`; + this.insertIntoDOM(modalHtml); + } + + initializeTrigger() { + this.triggerElement.setAttribute('uk-toggle', `target: #${this.modalId}`); + } + } + + class BootstrapModal extends BaseModal { + constructor(triggerElement) { + super(triggerElement); + } + + show() { + const modal = new bootstrap.Modal(document.getElementById(this.modalId)); + modal.show(); + } + + hide() { + const modal = bootstrap.Modal.getInstance(document.getElementById(this.modalId)); + if (modal) { + modal.hide(); + } + } + + create(content) { + const modalHtml = ` + `; + this.insertIntoDOM(modalHtml); + } + + initializeTrigger() { + this.triggerElement.setAttribute('data-bs-toggle', 'modal'); + this.triggerElement.setAttribute('data-bs-target', `#${this.modalId}`); + } + } + + class FoundationModal extends BaseModal { + constructor(triggerElement) { + super(triggerElement); + this.modalElement = null; + } + + show() { + if (this.modalElement) { + this.modalElement.open(); + } + } + + hide() { + if (this.modalElement) { + this.modalElement.close(); + } + } + + create(content) { + const modalHtml = ` +
+
+ ${content} +
+ +
`; + this.insertIntoDOM(modalHtml); + this.modalElement = new Foundation.Reveal(document.getElementById(this.modalId)); + } + + initializeTrigger() { + this.triggerElement.setAttribute('data-open', this.modalId); + } + } + + class TailwindModal extends BaseModal { + constructor(triggerElement) { + super(triggerElement); + } + + show() { + document.getElementById(this.modalId).classList.remove('hidden'); + } + + hide() { + document.getElementById(this.modalId).classList.add('hidden'); + } + + create(content) { + const modalHtml = ` + `; + this.insertIntoDOM(modalHtml); + } + + initializeTrigger(triggerElement) { + this.triggerElement.addEventListener('click', () => { + document.getElementById(this.modalId).classList.remove('hidden'); + }); + } + } + + /** + * ModalElement class responsible for creating and managing modal elements. + * It dynamically selects the appropriate modal style based on the available UI framework. + */ + class ModalElement { + /** + * Constructs an instance of ModalElement with the appropriate modal type + * based on the detected UI framework. + * + * @param {HTMLElement} triggerElement - The element that triggers the modal. + */ + constructor(triggerElement) { + this.modal = ModalElement.framework(triggerElement); + } + + /** + * Loads content into the modal. + * + * @param {string} content - The content to load into the modal. + */ + load(content) { + this.modal.load(content); + } + + /** + * Determines the appropriate modal implementation based on the available UI framework. + * + * @param {HTMLElement} triggerElement - The element triggering the modal. + * @returns {BaseModal|BootstrapModal|UikitModal|FoundationModal|TailwindModal} The modal instance. + */ + static framework(triggerElement) { + const frameworks = { + 'UIkit': UikitModal, + 'bootstrap': BootstrapModal, + 'Foundation': FoundationModal, + 'tailwind': TailwindModal + }; + + for (const [key, ModalType] of Object.entries(frameworks)) { + if (typeof window[key] !== 'undefined' || (key === 'tailwind' && document.querySelector('.tailwind-class') !== null)) { + { + console.log(`${key} modal selected`); + } + return new ModalType(triggerElement); + } + } + + { + console.log(`base modal selected`); + } + return new BaseModal(triggerElement); + } + } + + /** + * InlineElement class responsible for adding inline elements. + */ + class InlineElement { + /** + * Creates an instance of InlineElement. + * + * @param {HTMLElement} triggerElement - The element that triggers the inline display. + */ + constructor(triggerElement) { + if (!(triggerElement instanceof HTMLElement)) { + throw new Error("triggerElement must be an instance of HTMLElement."); + } + this.triggerElement = triggerElement; + // Clear initial content + this.triggerElement.innerHTML = ''; + } + + /** + * Loads content into the trigger element. Appends new content if existing content is present. + * + * @param {string} content - The content to load into the trigger element. + */ + load(content) { + const existingContent = this.triggerElement.innerHTML; + this.triggerElement.innerHTML = existingContent ? `${existingContent}\n ${content}` : content; + } + } + + class BaseTooltip { + /** + * Creates a new BaseTooltip instance. + * + * @param {HTMLElement} triggerElement - The elements that triggers the tooltip. + */ + constructor(triggerElement) { + this.triggerElement = triggerElement; + this.triggerElement.style.cursor = 'help'; + } + + /** + * Loads content into the tooltip. If the trigger elements already has a title, + * the new content is appended to it. + * + * @param {string} content - The content to load into the tooltip. + * @throws {Error} Throws an error if the trigger elements is not valid. + */ + load(content) { + const existingTitle = this.triggerElement.getAttribute('title'); + const newTitle = existingTitle ? existingTitle + "\n" + content : content; + this.triggerElement.setAttribute('title', newTitle); + } + } + + class BootstrapTooltip extends BaseTooltip { + constructor(triggerElement) { + super(triggerElement); + } + + load(content) { + try { + super.load(content); + const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); + const tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl); + }); + } catch (error) { + console.error('Error loading BootstrapTooltip:', error); + } + } + } + + class UikitTooltip extends BaseTooltip { + constructor(triggerElement) { + super(triggerElement); + } + + load(content) { + try { + super.load(content); + UIkit.tooltip(this.triggerElement); + } catch (error) { + console.error('Error loading UikitTooltip:', error); + } + } + } + + class FoundationTooltip extends BaseTooltip { + constructor(triggerElement) { + super(triggerElement); + } + + load(content) { + try { + this.triggerElement.setAttribute('data-tooltip', ''); + super.load(content); + this.triggerElement.classList.add('has-tip'); + + new Foundation.Tooltip(this.triggerElement, { + // Default options + disableHover: false, // Allows tooltip to be hoverable + fadeOutDuration: 150, // Duration of fade out animation in milliseconds + fadeInDuration: 150, // Duration of fade in animation in milliseconds + showOn: 'all', // Can be 'all', 'large', 'medium', 'small' + templateClasses: '', // Custom class(es) to be added to the tooltip template + tipText: () => this.triggerElement.getAttribute('title'), // Function to define tooltip text + triggerClass: 'has-tip', // Class to be added on the trigger elements + touchCloseText: 'tap to close', // Text for close button on touch devices + positionClass: 'top', // Position of tooltip, can be 'top', 'bottom', 'left', 'right', etc. + vOffset: 10, // Vertical offset + hOffset: 12, // Horizontal offset + allowHtml: false // Allow HTML in tooltip content + }); + } catch (error) { + console.error('Error loading FoundationTooltip:', error); + } + } + } + + class TailwindTooltip extends BaseTooltip { + constructor(triggerElement) { + super(triggerElement); + } + + load(content) { + try { + super.load(content); + this._createTooltipElement(); + this._initializeEvents(); + } catch (error) { + console.error('Error loading TailwindTooltip:', error); + } + } + + _createTooltipElement() { + this.tooltipElement = document.createElement('div'); + this.tooltipElement.id = this.tooltipId; + this.tooltipElement.className = 'absolute invisible bg-gray-800 text-white text-xs px-2 py-1 rounded-md'; + this.tooltipElement.style.transition = 'visibility 0.3s linear, opacity 0.3s linear'; + this.tooltipElement.textContent = this.triggerElement.getAttribute('title'); + document.body.appendChild(this.tooltipElement); + } + + _initializeEvents() { + this.triggerElement.addEventListener('mouseenter', () => { + const rect = this.triggerElement.getBoundingClientRect(); + this._title = this.triggerElement.getAttribute('title'); + this.tooltipElement.style.left = `${rect.left + window.scrollX}px`; + this.tooltipElement.style.top = `${rect.bottom + 5 + window.scrollY}px`; + this.tooltipElement.classList.remove('invisible'); + this.tooltipElement.classList.add('opacity-100'); + this.triggerElement.setAttribute('title', ''); + }); + + this.triggerElement.addEventListener('mouseleave', () => { + this.tooltipElement.classList.add('invisible'); + this.tooltipElement.classList.remove('opacity-100'); + this.triggerElement.setAttribute('title', this._title); + }); + } + } + + /** + * TooltipElement class responsible for creating and managing tooltip elements. + * It dynamically selects the appropriate tooltip style based on the available UI framework. + */ + class TooltipElement { + /** + * Constructs an instance of TooltipElement with the appropriate tooltip type + * based on the detected UI framework. + * + * @param {HTMLElement} triggerElement - The element that triggers the tooltip. + */ + constructor(triggerElement) { + this.tooltip = TooltipElement.framework(triggerElement); + } + + /** + * Loads content into the tooltip. + * + * @param {string} content - The content to load into the tooltip. + */ + load(content) { + this.tooltip.load(content); + } + + /** + * Determines the appropriate tooltip implementation based on the available UI framework. + * + * @param {HTMLElement} triggerElement - The element triggering the tooltip. + * @returns {BaseTooltip|BootstrapTooltip|UikitTooltip|FoundationTooltip|TailwindTooltip} The tooltip instance. + * @param debug + */ + static framework(triggerElement) { + const frameworks = { + 'UIkit': UikitTooltip, + 'bootstrap': BootstrapTooltip, + 'Foundation': FoundationTooltip, + 'tailwind': TailwindTooltip + }; + + for (const [key, TooltipType] of Object.entries(frameworks)) { + if (typeof window[key] !== 'undefined' || (key === 'tailwind' && document.querySelector('.tailwind-class') !== null)) { + { + console.log(`${key} tooltip selected`); + } + return new TooltipType(triggerElement); + } + } + + { + console.log(`base tooltip selected`); + } + return new BaseTooltip(triggerElement); + } + } + + /** + * Element class responsible for creating and managing different types of elements + * based on the specified format. + */ + class Element { + /** + * Constructs an Element instance based on the given format. + * + * @param {HTMLElement} triggerElement - The trigger element. + * @param {string} format - The format type. + */ + constructor(triggerElement, format = 'tooltip') { + if (!(triggerElement instanceof HTMLElement)) { + throw new Error("triggerElement must be an instance of HTMLElement."); + } + + const elementTypes = { + 'modal': ModalElement, + 'inline': InlineElement, + 'tooltip': TooltipElement + }; + + const ElementType = elementTypes[format] || TooltipElement; + this.element = new ElementType(triggerElement); + + { + console.log(`${format} element selected`); + } + } + + /** + * Load the content into the element. + * + * @param {string} content - The content to load. + */ + load(content) { + this.element.load(content); + } + } + + /** + * Loader class responsible for handling the loading of Bible references. + */ + class Loader { + /** + * Constructs a Loader instance. + */ + constructor() { + this.api = new Api(); + } + + /** + * Load the Bible references into the specified HTML element. + * + * @param {HTMLElement} element - The element to load Bible references into. + */ + load(element) { + const references = element.innerHTML.split(';'); + if (references) { + this.#init(element); + const translations = (element.dataset.translation || 'kjv').toLowerCase().split(';'); + this.showBookName = element.dataset.showBookName ? parseInt(element.dataset.showBookName, 10) : 1; + this.showTranslation = element.dataset.showTranslation ? parseInt(element.dataset.showTranslation, 10) : 0; + this.showAbbreviation = element.dataset.showAbbreviation ? parseInt(element.dataset.showAbbreviation, 10) : 0; + this.showLanguage = element.dataset.showLanguage ? parseInt(element.dataset.showLanguage, 10) : 0; + + references.forEach(reference => { + translations.forEach(translation => { + this.api.get(reference.trim(), translation.trim()).then(scripture => { + if (scripture) { + this.#load(scripture); + } + }).catch(error => console.error(error)); + }); + }); + } + } + + /** + * Initialize the target format and element for loading the Bible. + * + * @param {HTMLElement} element - The element to be initialized. + * @private + */ + #init(element) { + const format = (element.dataset.format || 'inline').toLowerCase(); + this.element = new Element(element, format); + this.format = new Format(format); + } + + /** + * Load the Bible data in the target format into the initialized element. + * + * @param {Object} data - The data containing verses and their details. + * @private + */ + #load(data) { + this.element.load( + this.format.get( + data, + this.showBookName, + this.showTranslation, + this.showAbbreviation, + this.showLanguage + ) + ); + } + } + + /** + * Entry point to load Bible references. + * Attaches event listener to DOMContentLoaded to find elements with class 'getBible' + * and initializes Loader for each element. + */ + document.addEventListener('DOMContentLoaded', (event) => { + const elements = document.querySelectorAll('.getBible'); + elements.forEach(element => { + const loader = new Loader(); + loader.load(element); + }); }); - } - // Function to generate a unique key for each scripture - generateStorageKey(reference, translation) { - return `getBible-${translation}-${reference}`; - } - - // Function to check local storage - async checkLocalStorage(reference, translation) { - const key = this.generateStorageKey(reference, translation); // Corrected this line - const storedItem = localStorage.getItem(key); - if (storedItem) { - const { data, timestamp } = JSON.parse(storedItem); - const oneMonthAgo = Date.now() - 30 * 24 * 60 * 60 * 1000; - if (timestamp > oneMonthAgo) { - return data; - } - } - return null; - } - - // Function to store data in local storage - storeInLocalStorage(reference, translation, data) { - const key = this.generateStorageKey(reference, translation); // Corrected this line - const item = { - data, - timestamp: Date.now(), - }; - localStorage.setItem(key, JSON.stringify(item)); - } - - // Dynamic fetchScripture function - async fetchScripture(reference, translation) { - try { - const localStorageData = await this.checkLocalStorage(reference, translation); // Corrected this line - if (localStorageData !== null) { - return localStorageData; - } - // Fetch from API if not in local storage - const response = await fetch(`${this.apiEndpoint}${encodeURIComponent(translation)}/${encodeURIComponent(reference)}`); - if (response.ok) { - const data = await response.json(); - this.storeInLocalStorage(reference, translation, data); // Corrected this line - return data; - } else { - const errorData = await response.json(); - const errorMessage = errorData.error || 'Failed to fetch scripture'; - throw new Error(errorMessage); - } - } catch (error) { - // If the response is not JSON or another error occurs, throw the default error message - if (error instanceof SyntaxError) { - // This indicates a problem with JSON parsing, meaning the response was not JSON - throw new Error('Failed to fetch scripture'); - } else { - // Re-throw the error that we constructed from the JSON response - throw error; - } - } - } - - // Format the verses for tooltip display - formatScriptureText(data, showBook, showTrans, showAbbr, showLang) { - let formattedText = ''; - let setBookName = new Set(); - let setTranslation = new Set(); - let setAbbreviation = new Set(); - let setLanguage = new Set(); - - for (const key in data) { - let headerParts = []; - if (showTrans && !setTranslation.has(key)) { - headerParts.push(data[key].translation); - setTranslation.add(key); - } - if (showAbbr && !setAbbreviation.has(key)) { - headerParts.push(data[key].abbreviation); - setAbbreviation.add(key); - } - if (showBook && !setBookName.has(key)) { - headerParts.push(data[key].name); - setBookName.add(key); - } - if (showLang && !setLanguage.has(key)) { - headerParts.push(data[key].language); - setLanguage.add(key); - } - - // Construct the header if there are any parts to include - if (headerParts.length > 0) { - formattedText += '[' + headerParts.join(' - ') + "]\n"; - } - - // Add verses - const verses = data[key].verses.map(verse => `${verse.verse}. ${verse.text}`).join("\n"); - formattedText += verses + "\n\n"; // Add extra newline for separation between entries - } - - return formattedText.trim(); - } - - // Add or append tooltip to the element - addToolTip(element, data, showBook, showTrans, showAbbr, showLang) { - const scriptureText = this.formatScriptureText(data, showBook, showTrans, showAbbr, showLang); - const existingToolTip = element.title; - element.title = existingToolTip ? existingToolTip + "\n" + scriptureText : scriptureText; - } -} -document.addEventListener('DOMContentLoaded', (event) => { - new GetBibleTooltip(); -}); +})); diff --git a/dist/js/getBible.min.js b/dist/js/getBible.min.js index a91f5ec..838dbea 100644 --- a/dist/js/getBible.min.js +++ b/dist/js/getBible.min.js @@ -1 +1,2 @@ -/*! getBible Loader v2.0.2 | https://getbible.net | (c) 2023 Llewellyn van der Merwe | MIT License */ class GetBibleTooltip{constructor(){this.apiEndpoint="https://query.getbible.net/v2/",this.findAndFetchScriptureReferences()}findAndFetchScriptureReferences(){let t=document.querySelectorAll(".getBible");t.forEach(t=>{let e=t.innerHTML.split(";"),a=(t.dataset.translation||"kjv").toLowerCase().split(";"),r=t.dataset.showBookName?parseInt(t.dataset.showBookName,10):1,i=t.dataset.showTranslation?parseInt(t.dataset.showTranslation,10):0,n=t.dataset.showAbbreviation?parseInt(t.dataset.showAbbreviation,10):0,o=t.dataset.showLanguage?parseInt(t.dataset.showLanguage,10):0;e&&e.forEach(e=>{a.forEach(a=>{this.fetchScripture(e.trim(),a.trim()).then(e=>{e&&this.addToolTip(t,e,r,i,n,o)}).catch(t=>console.error(t))})})})}generateStorageKey(t,e){return`getBible-${e}-${t}`}async checkLocalStorage(t,e){let a=this.generateStorageKey(t,e),r=localStorage.getItem(a);if(r){let{data:i,timestamp:n}=JSON.parse(r),o=Date.now()-2592e6;if(n>o)return i}return null}storeInLocalStorage(t,e,a){let r=this.generateStorageKey(t,e),i={data:a,timestamp:Date.now()};localStorage.setItem(r,JSON.stringify(i))}async fetchScripture(t,e){try{let a=await this.checkLocalStorage(t,e);if(null!==a)return a;let r=await fetch(`${this.apiEndpoint}${encodeURIComponent(e)}/${encodeURIComponent(t)}`);if(r.ok){let i=await r.json();return this.storeInLocalStorage(t,e,i),i}{let n=await r.json(),o=n.error||"Failed to fetch scripture";throw Error(o)}}catch(s){if(s instanceof SyntaxError)throw Error("Failed to fetch scripture");throw s}}formatScriptureText(t,e,a,r,i){let n="",o=new Set,s=new Set,l=new Set,h=new Set;for(let c in t){let d=[];a&&!s.has(c)&&(d.push(t[c].translation),s.add(c)),r&&!l.has(c)&&(d.push(t[c].abbreviation),l.add(c)),e&&!o.has(c)&&(d.push(t[c].name),o.add(c)),i&&!h.has(c)&&(d.push(t[c].language),h.add(c)),d.length>0&&(n+="["+d.join(" - ")+"]\n");let p=t[c].verses.map(t=>`${t.verse}. ${t.text}`).join("\n");n+=p+"\n\n"}return n.trim()}addToolTip(t,e,a,r,i,n){let o=this.formatScriptureText(e,a,r,i,n),s=t.title;t.title=s?s+"\n"+o:o}}document.addEventListener("DOMContentLoaded",t=>{new GetBibleTooltip}); +/*! getBible Loader v3.0.0 | https://getbible.net | (c) 2014 - 2023 Llewellyn van der Merwe | MIT License */ +!function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){"use strict";function t(){t=function(){return n};var e,n={},r=Object.prototype,o=r.hasOwnProperty,i=Object.defineProperty||function(t,e,n){t[e]=n.value},a="function"==typeof Symbol?Symbol:{},l=a.iterator||"@@iterator",c=a.asyncIterator||"@@asyncIterator",s=a.toStringTag||"@@toStringTag";function u(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{u({},"")}catch(e){u=function(t,e,n){return t[e]=n}}function d(t,e,n,r){var o=e&&e.prototype instanceof y?e:y,a=Object.create(o.prototype),l=new A(r||[]);return i(a,"_invoke",{value:T(t,n,l)}),a}function h(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}n.wrap=d;var f="suspendedStart",p="suspendedYield",v="executing",m="completed",g={};function y(){}function b(){}function w(){}var E={};u(E,l,(function(){return this}));var k=Object.getPrototypeOf,I=k&&k(k(P([])));I&&I!==r&&o.call(I,l)&&(E=I);var L=w.prototype=y.prototype=Object.create(E);function O(t){["next","throw","return"].forEach((function(e){u(t,e,(function(t){return this._invoke(e,t)}))}))}function x(t,e){function n(r,i,a,l){var c=h(t[r],t,i);if("throw"!==c.type){var s=c.arg,u=s.value;return u&&"object"==typeof u&&o.call(u,"__await")?e.resolve(u.__await).then((function(t){n("next",t,a,l)}),(function(t){n("throw",t,a,l)})):e.resolve(u).then((function(t){s.value=t,a(s)}),(function(t){return n("throw",t,a,l)}))}l(c.arg)}var r;i(this,"_invoke",{value:function(t,o){function i(){return new e((function(e,r){n(t,o,e,r)}))}return r=r?r.then(i,i):i()}})}function T(t,n,r){var o=f;return function(i,a){if(o===v)throw new Error("Generator is already running");if(o===m){if("throw"===i)throw a;return{value:e,done:!0}}for(r.method=i,r.arg=a;;){var l=r.delegate;if(l){var c=j(l,r);if(c){if(c===g)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===f)throw o=m,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=v;var s=h(t,n,r);if("normal"===s.type){if(o=r.done?m:p,s.arg===g)continue;return{value:s.arg,done:r.done}}"throw"===s.type&&(o=m,r.method="throw",r.arg=s.arg)}}}function j(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,j(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var i=h(o,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,g;var a=i.arg;return a?a.done?(n[t.resultName]=a.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):a:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function S(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function _(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function A(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(S,this),this.reset(!0)}function P(t){if(t||""===t){var n=t[l];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,i=function n(){for(;++r=0;--i){var a=this.tryEntries[i],l=a.completion;if("root"===a.tryLoc)return r("end");if(a.tryLoc<=this.prev){var c=o.call(a,"catchLoc"),s=o.call(a,"finallyLoc");if(c&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&o.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),_(n),g}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var o=r.arg;_(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:P(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},n}function e(t,e,n,r,o,i,a){try{var l=t[i](a),c=l.value}catch(t){return void n(t)}l.done?e(c):Promise.resolve(c).then(r,o)}function n(t){return function(){var n=this,r=arguments;return new Promise((function(o,i){var a=t.apply(n,r);function l(t){e(a,o,i,l,c,"next",t)}function c(t){e(a,o,i,l,c,"throw",t)}l(void 0)}))}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=new Array(e);nDate.now()-y.ONE_MONTH_IN_MILLISECONDS)return i}return null}catch(t){throw console.error("Error parsing or retrieving data from local storage:",t),t}}function L(t,e){return"getBible-".concat(e,"-").concat(t)}y=k,b=k,E=2592e6,(w=p(w="ONE_MONTH_IN_MILLISECONDS"))in b?Object.defineProperty(b,w,{value:E,enumerable:!0,configurable:!0,writable:!0}):b[w]=E;var O=new WeakSet,x=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"https://query.getbible.net/v2/";r(this,e),g(this,O),this.apiEndpoint=t}return i(e,[{key:"get",value:function(){var e=n(t().mark((function e(n,r){var o,i,a;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,k.get(n,r);case 3:if(null===(o=t.sent)){t.next=6;break}return t.abrupt("return",o);case 6:return t.next=8,fetch(m(this,O,T).call(this,n,r));case 8:if((i=t.sent).ok){t.next=11;break}throw new Error("".concat(i.status," - ").concat(i.statusText||"Failed to fetch scripture"));case 11:return t.next=13,i.json();case 13:return a=t.sent,t.next=16,k.set(n,r,a);case 16:return t.abrupt("return",a);case 19:throw t.prev=19,t.t0=t.catch(0),console.error("Error fetching data:",t.t0),new Error(t.t0.message||"Error fetching scripture");case 23:case"end":return t.stop()}}),e,this,[[0,19]])})));return function(t,n){return e.apply(this,arguments)}}()}]),e}();function T(t,e){return"".concat(this.apiEndpoint).concat(encodeURIComponent(e),"/").concat(encodeURIComponent(t))}var j=function(){function t(){r(this,t)}return i(t,[{key:"get",value:function(t,e,n,r,o){throw new Error("The 'get' method must be implemented in BaseFormat subclass.")}}]),t}(),S=function(t){a(n,t);var e=u(n);function n(){return r(this,n),e.apply(this,arguments)}return i(n,[{key:"get",value:function(t,e,n,r,o){var i="",a=new Set,l=new Set,c=new Set,s=new Set;for(var u in t)if(t.hasOwnProperty(u)){var d=[];n&&!l.has(u)&&(d.push(''.concat(t[u].translation,"")),l.add(u)),r&&!c.has(u)&&(d.push(''.concat(t[u].abbreviation,"")),c.add(u)),e&&!a.has(u)&&(d.push(''.concat(t[u].name,"")),a.add(u)),o&&!s.has(u)&&(d.push(''.concat(t[u].language,"")),s.add(u)),d.length>0&&(i+='
['.concat(d.join(" - "),"]
\n"));var h=t[u].verses.map((function(t){return''.concat(t.verse,". ").concat(t.text,"")})).join("
");i+='
'.concat(h,"

")}return'
'.concat(i,"
")}}]),n}(j),_=function(t){a(n,t);var e=u(n);function n(){return r(this,n),e.apply(this,arguments)}return i(n,[{key:"get",value:function(t,e,n,r,o){var i="",a=new Set,l=new Set,c=new Set,s=new Set;for(var u in t)if(t.hasOwnProperty(u)){var d=[];n&&!l.has(u)&&(d.push(''.concat(t[u].translation,"")),l.add(u)),r&&!c.has(u)&&(d.push(''.concat(t[u].abbreviation,"")),c.add(u)),e&&!a.has(u)&&(d.push(''.concat(t[u].name,"")),a.add(u)),o&&!s.has(u)&&(d.push(''.concat(t[u].language,"")),s.add(u));var h=t[u].verses.map((function(t){return''.concat(t.verse,". ").concat(t.text,"")})).join("\n");i+=''.concat(h,"\n"),d.length>0&&(i+='['.concat(d.join(" - "),"]\n"))}return''.concat(i,"")}}]),n}(j),A=function(t){a(n,t);var e=u(n);function n(){return r(this,n),e.apply(this,arguments)}return i(n,[{key:"get",value:function(t,e,n,r,o){var i="",a=new Set,l=new Set,c=new Set,s=new Set;for(var u in t)if(t.hasOwnProperty(u)){var d=[];n&&!l.has(u)&&(d.push(t[u].translation),l.add(u)),r&&!c.has(u)&&(d.push(t[u].abbreviation),c.add(u)),e&&!a.has(u)&&(d.push(t[u].name),a.add(u)),o&&!s.has(u)&&(d.push(t[u].language),s.add(u)),d.length>0&&(i+="["+d.join(" - ")+"]\n"),i+=t[u].verses.map((function(t){return"".concat(t.verse,". ").concat(t.text)})).join("\n")+"\n\n"}return i.trim()}}]),n}(j),P=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"tooltip";r(this,t);var n={modal:S,inline:_,tooltip:A}[e]||A;this.format=new n}return i(t,[{key:"get",value:function(t,e,n,r,o){return this.format.get(t,e,n,r,o)}}]),t}(),M=function(){function t(e){r(this,t),this.modalId="modal-".concat(Math.random().toString(36).slice(2,11)),this.triggerElement=e,this.triggerElement.style.cursor="pointer",this.initializeTrigger()}return i(t,[{key:"load",value:function(t){if(document.getElementById(this.modalId)){var e=document.getElementById("".concat(this.modalId,"-content"));e&&(e.innerHTML+=t)}else this.create(t)}},{key:"insertIntoDOM",value:function(t){document.body.insertAdjacentHTML("beforeend",t)}},{key:"create",value:function(t){var e='\n ");this.insertIntoDOM(e);var n=document.getElementById(this.modalId);n.addEventListener("click",(function(t){t.target===n&&(n.style.display="none")}))}},{key:"initializeTrigger",value:function(){var t=this;this.triggerElement.addEventListener("click",(function(){document.getElementById(t.modalId).style.display="flex"}))}}]),t}(),N=function(t){a(n,t);var e=u(n);function n(t){return r(this,n),e.call(this,t)}return i(n,[{key:"show",value:function(){UIkit.modal("#".concat(this.modalId)).show()}},{key:"hide",value:function(){UIkit.modal("#".concat(this.modalId)).hide()}},{key:"create",value:function(t){var e='\n
\n
\n \n
\n ').concat(t,"\n
\n
\n
");this.insertIntoDOM(e)}},{key:"initializeTrigger",value:function(){this.triggerElement.setAttribute("uk-toggle","target: #".concat(this.modalId))}}]),n}(M),B=function(t){a(n,t);var e=u(n);function n(t){return r(this,n),e.call(this,t)}return i(n,[{key:"show",value:function(){new bootstrap.Modal(document.getElementById(this.modalId)).show()}},{key:"hide",value:function(){var t=bootstrap.Modal.getInstance(document.getElementById(this.modalId));t&&t.hide()}},{key:"create",value:function(t){var e='\n ");this.insertIntoDOM(e)}},{key:"initializeTrigger",value:function(){this.triggerElement.setAttribute("data-bs-toggle","modal"),this.triggerElement.setAttribute("data-bs-target","#".concat(this.modalId))}}]),n}(M),C=function(t){a(n,t);var e=u(n);function n(t){var o;return r(this,n),(o=e.call(this,t)).modalElement=null,o}return i(n,[{key:"show",value:function(){this.modalElement&&this.modalElement.open()}},{key:"hide",value:function(){this.modalElement&&this.modalElement.close()}},{key:"create",value:function(t){var e='\n
\n
\n ').concat(t,'\n
\n \n
');this.insertIntoDOM(e),this.modalElement=new Foundation.Reveal(document.getElementById(this.modalId))}},{key:"initializeTrigger",value:function(){this.triggerElement.setAttribute("data-open",this.modalId)}}]),n}(M),D=function(t){a(n,t);var e=u(n);function n(t){return r(this,n),e.call(this,t)}return i(n,[{key:"show",value:function(){document.getElementById(this.modalId).classList.remove("hidden")}},{key:"hide",value:function(){document.getElementById(this.modalId).classList.add("hidden")}},{key:"create",value:function(t){var e='\n ");this.insertIntoDOM(e)}},{key:"initializeTrigger",value:function(t){var e=this;this.triggerElement.addEventListener("click",(function(){document.getElementById(e.modalId).classList.remove("hidden")}))}}]),n}(M),H=function(){function t(e){r(this,t),this.modal=t.framework(e)}return i(t,[{key:"load",value:function(t){this.modal.load(t)}}],[{key:"framework",value:function(t){for(var e={UIkit:N,bootstrap:B,Foundation:C,tailwind:D},n=0,r=Object.entries(e);n1&&void 0!==arguments[1]?arguments[1]:"tooltip";if(r(this,t),!(e instanceof HTMLElement))throw new Error("triggerElement must be an instance of HTMLElement.");var o={modal:H,inline:R,tooltip:W}[n]||W;this.element=new o(e)}return i(t,[{key:"load",value:function(t){this.element.load(t)}}]),t}(),J=new WeakSet,X=new WeakSet,$=function(){function t(){r(this,t),g(this,X),g(this,J),this.api=new x}return i(t,[{key:"load",value:function(t){var e=this,n=t.innerHTML.split(";");if(n){m(this,J,K).call(this,t);var r=(t.dataset.translation||"kjv").toLowerCase().split(";");this.showBookName=t.dataset.showBookName?parseInt(t.dataset.showBookName,10):1,this.showTranslation=t.dataset.showTranslation?parseInt(t.dataset.showTranslation,10):0,this.showAbbreviation=t.dataset.showAbbreviation?parseInt(t.dataset.showAbbreviation,10):0,this.showLanguage=t.dataset.showLanguage?parseInt(t.dataset.showLanguage,10):0,n.forEach((function(t){r.forEach((function(n){e.api.get(t.trim(),n.trim()).then((function(t){t&&m(e,X,Q).call(e,t)})).catch((function(t){return console.error(t)}))}))}))}}}]),t}();function K(t){var e=(t.dataset.format||"inline").toLowerCase();this.element=new Y(t,e),this.format=new P(e)}function Q(t){this.element.load(this.format.get(t,this.showBookName,this.showTranslation,this.showAbbreviation,this.showLanguage))}document.addEventListener("DOMContentLoaded",(function(t){document.querySelectorAll(".getBible").forEach((function(t){(new $).load(t)}))}))})); diff --git a/example/basic.html b/example/basic.html deleted file mode 100644 index deaa584..0000000 --- a/example/basic.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -GetBible Tooltips (2.0.2) Example - - - - - - - -

Scripture References

- -

Hover over the references to see the scripture text:

- -
    -
  • John 3:16,19
  • -
  • John 3:16-17; 1 John 3:16-19,22
  • -
  • Genesis 1:1
  • -
  • Psalms 23:1-4
  • -
  • Romans 8:28,31-39
  • -
- - - diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..20b9419 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2987 @@ +{ + "name": "getbible.loader", + "version": "3.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "getbible.loader", + "version": "3.0.0", + "license": "MIT", + "devDependencies": { + "@babel/core": "^7.15.0", + "@babel/preset-env": "^7.15.0", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.0", + "@rollup/plugin-replace": "^5.0.5", + "rollup": "^2.60.0", + "rollup-plugin-license": "^2.3.0", + "rollup-plugin-terser": "^7.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz", + "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz", + "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz", + "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz", + "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz", + "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz", + "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz", + "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz", + "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz", + "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz", + "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz", + "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz", + "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz", + "integrity": "sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^2.38.3" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^2.42.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", + "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "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 + }, + "node_modules/@types/node": { + "version": "20.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", + "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001563", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", + "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "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 + }, + "node_modules/commenting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.1.0.tgz", + "integrity": "sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", + "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.588", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.588.tgz", + "integrity": "sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/package-name-regex": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/package-name-regex/-/package-name-regex-2.0.6.tgz", + "integrity": "sha512-gFL35q7kbE/zBaPA3UKhp2vSzcPYx2ecbYuwv1ucE9Il6IIgBDweBlH8D68UFGZic2MkllKa2KHCfC1IQBQUYA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/dword-design" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-license": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-license/-/rollup-plugin-license-2.9.1.tgz", + "integrity": "sha512-C26f/bFXR52tzpBMllDnf5m2ETqRuyrrj3m8i3YY4imDwbXtunop+Lj1mO9mn/sZF8gKknOycN1Sm+kMGBd6RA==", + "dev": true, + "dependencies": { + "commenting": "~1.1.0", + "glob": "~7.2.0", + "lodash": "~4.17.21", + "magic-string": "~0.26.2", + "mkdirp": "~1.0.4", + "moment": "~2.29.3", + "package-name-regex": "~2.0.6", + "spdx-expression-validate": "~2.0.0", + "spdx-satisfies": "~5.0.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "rollup": "^1.0.0 || ^2.0.0" + } + }, + "node_modules/rollup-plugin-license/node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/spdx-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", + "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.2", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-expression-validate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-validate/-/spdx-expression-validate-2.0.0.tgz", + "integrity": "sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/spdx-ranges": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", + "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", + "dev": true + }, + "node_modules/spdx-satisfies": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz", + "integrity": "sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==", + "dev": true, + "dependencies": { + "spdx-compare": "^1.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terser": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "dev": 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/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..413634b --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "getbible.loader", + "title": "getBible", + "description": "GetBible is an intuitive and lightweight JavaScript solution for embedding Bible scripture into your website.", + "version": "3.0.0", + "main": "dist/js/getBible.min.js", + "scripts": { + "build": "rollup -c" + }, + "repository": { + "type": "git", + "url": "git+https://git.vdm.dev/getBible/loader.git" + }, + "license": "MIT", + "bugs": { + "url": "https://git.vdm.dev/getBible/support" + }, + "homepage": "https://getbible.net/biblekit", + "dependencies": { + }, + "devDependencies": { + "@babel/core": "^7.15.0", + "@babel/preset-env": "^7.15.0", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-commonjs": "^21.0.0", + "@rollup/plugin-node-resolve": "^13.0.0", + "rollup": "^2.60.0", + "rollup-plugin-terser": "^7.0.0", + "rollup-plugin-license": "^2.3.0", + "@rollup/plugin-replace": "^5.0.5" + } +} diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..dbcbbc3 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,58 @@ +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import { babel } from '@rollup/plugin-babel'; +import { terser } from 'rollup-plugin-terser'; +import license from 'rollup-plugin-license'; +import replace from '@rollup/plugin-replace'; + +const licenseLine = { + banner: `/*! getBible Loader v${require('./package.json').version} | https://getbible.net | (c) 2014 - ${new Date().getFullYear()} Llewellyn van der Merwe | MIT License */` +}; + +const licenseHeader = { + banner: `/** + * getBible Loader v${require('./package.json').version} + * https://getbible.net + * (c) 2014 - ${new Date().getFullYear()} Llewellyn van der Merwe + * MIT License + **/ +`}; + +export default [ + { + input: 'src/js/getBible.js', + plugins: [ + license(licenseHeader), + replace({ + 'process.env.DEBUG': true, + preventAssignment: true, + })], + output: { + file: 'dist/js/getBible.js', + format: 'umd', + name: 'getBible', + }, + }, + { + input: 'src/js/getBible.js', + plugins: [ + resolve(), + commonjs(), + babel({ + babelHelpers: 'bundled', + presets: ['@babel/preset-env'], + }), + terser(), + license(licenseLine), + replace({ + 'process.env.DEBUG': false, + preventAssignment: true, + }) + ], + output: { + file: 'dist/js/getBible.min.js', + format: 'umd', + name: 'getBible', + }, + }, +]; diff --git a/src/js/core/Api.js b/src/js/core/Api.js new file mode 100644 index 0000000..becd180 --- /dev/null +++ b/src/js/core/Api.js @@ -0,0 +1,57 @@ +import { Memory } from './Memory.js'; + +/** + * Class for handling API calls to fetch scripture data. + */ +export class Api { + /** + * Constructs an Api instance with a default or specified API endpoint. + * + * @param {string} apiEndpoint - The endpoint URL for the API. + */ + constructor(apiEndpoint = 'https://query.getbible.net/v2/') { + this.apiEndpoint = apiEndpoint; + } + + /** + * Fetches scripture from the API, using local storage to cache responses. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {Promise} A promise that resolves with the scripture data. + * @throws {Error} If the API request fails. + */ + async get(reference, translation) { + try { + const localStorageData = await Memory.get(reference, translation); + if (localStorageData !== null) { + return localStorageData; + } + + const response = await fetch(this.#url(reference, translation)); + + if (!response.ok) { + throw new Error(`${response.status} - ${response.statusText || 'Failed to fetch scripture'}`); + } + + const data = await response.json(); + await Memory.set(reference, translation, data); + return data; + } catch (error) { + console.error('Error fetching data:', error); + throw new Error(error.message || 'Error fetching scripture'); + } + } + + /** + * Constructs the URL for the API call. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {string} The constructed URL for the API request. + * @private + */ + #url(reference, translation) { + return `${this.apiEndpoint}${encodeURIComponent(translation)}/${encodeURIComponent(reference)}`; + } +} diff --git a/src/js/core/Loader.js b/src/js/core/Loader.js new file mode 100644 index 0000000..b96c72d --- /dev/null +++ b/src/js/core/Loader.js @@ -0,0 +1,72 @@ +import { Api } from './Api.js'; +import { Format } from '../formats/Format.js'; +import { Element } from '../elements/Element.js'; + +/** + * Loader class responsible for handling the loading of Bible references. + */ +export class Loader { + /** + * Constructs a Loader instance. + */ + constructor() { + this.api = new Api(); + } + + /** + * Load the Bible references into the specified HTML element. + * + * @param {HTMLElement} element - The element to load Bible references into. + */ + load(element) { + const references = element.innerHTML.split(';'); + if (references) { + this.#init(element); + const translations = (element.dataset.translation || 'kjv').toLowerCase().split(';'); + this.showBookName = element.dataset.showBookName ? parseInt(element.dataset.showBookName, 10) : 1; + this.showTranslation = element.dataset.showTranslation ? parseInt(element.dataset.showTranslation, 10) : 0; + this.showAbbreviation = element.dataset.showAbbreviation ? parseInt(element.dataset.showAbbreviation, 10) : 0; + this.showLanguage = element.dataset.showLanguage ? parseInt(element.dataset.showLanguage, 10) : 0; + + references.forEach(reference => { + translations.forEach(translation => { + this.api.get(reference.trim(), translation.trim()).then(scripture => { + if (scripture) { + this.#load(scripture); + } + }).catch(error => console.error(error)); + }); + }); + } + } + + /** + * Initialize the target format and element for loading the Bible. + * + * @param {HTMLElement} element - The element to be initialized. + * @private + */ + #init(element) { + const format = (element.dataset.format || 'inline').toLowerCase(); + this.element = new Element(element, format); + this.format = new Format(format); + } + + /** + * Load the Bible data in the target format into the initialized element. + * + * @param {Object} data - The data containing verses and their details. + * @private + */ + #load(data) { + this.element.load( + this.format.get( + data, + this.showBookName, + this.showTranslation, + this.showAbbreviation, + this.showLanguage + ) + ); + } +} diff --git a/src/js/core/Memory.js b/src/js/core/Memory.js new file mode 100644 index 0000000..c8f12f9 --- /dev/null +++ b/src/js/core/Memory.js @@ -0,0 +1,78 @@ +/** + * Class for managing local storage of scripture data. + */ +export class Memory { + // Constant representing one month in milliseconds. + static ONE_MONTH_IN_MILLISECONDS = 30 * 24 * 60 * 60 * 1000; + + /** + * Stores scripture data in local storage. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @param {Object} data - The scripture data to be stored. + * @throws {Error} If storing data fails. + */ + static set(reference, translation, data) { + const key = this.#key(reference, translation); + const item = { + data, + timestamp: Date.now(), + }; + try { + localStorage.setItem(key, JSON.stringify(item)); + } catch (error) { + console.error('Error storing data in local storage:', error); + throw error; + } + } + + /** + * Retrieves scripture data from local storage. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {Promise} The scripture data or null if not found. + */ + static async get(reference, translation) { + return this.#get(reference, translation); + } + + /** + * Internal method to check local storage for scripture data. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {Object|null} The stored data or null if not found. + * @throws {Error} If parsing or retrieval from local storage fails. + * @private + */ + static #get(reference, translation) { + const key = this.#key(reference, translation); + try { + const storedItem = localStorage.getItem(key); + if (storedItem) { + const { data, timestamp } = JSON.parse(storedItem); + if (timestamp > Date.now() - Memory.ONE_MONTH_IN_MILLISECONDS) { + return data; + } + } + return null; + } catch (error) { + console.error('Error parsing or retrieving data from local storage:', error); + throw error; + } + } + + /** + * Generates a key for scripture data storage. + * + * @param {string} reference - The scripture reference. + * @param {string} translation - The translation. + * @returns {string} A unique key for local storage. + * @private + */ + static #key(reference, translation) { + return `getBible-${translation}-${reference}`; + } +} diff --git a/src/js/elements/Element.js b/src/js/elements/Element.js new file mode 100644 index 0000000..a06472a --- /dev/null +++ b/src/js/elements/Element.js @@ -0,0 +1,43 @@ +import { ModalElement } from './ModalElement.js'; +import { InlineElement } from './InlineElement.js'; +import { TooltipElement } from './TooltipElement.js'; + +/** + * Element class responsible for creating and managing different types of elements + * based on the specified format. + */ +export class Element { + /** + * Constructs an Element instance based on the given format. + * + * @param {HTMLElement} triggerElement - The trigger element. + * @param {string} format - The format type. + */ + constructor(triggerElement, format = 'tooltip') { + if (!(triggerElement instanceof HTMLElement)) { + throw new Error("triggerElement must be an instance of HTMLElement."); + } + + const elementTypes = { + 'modal': ModalElement, + 'inline': InlineElement, + 'tooltip': TooltipElement + }; + + const ElementType = elementTypes[format] || TooltipElement; + this.element = new ElementType(triggerElement); + + if (process.env.DEBUG) { + console.log(`${format} element selected`); + } + } + + /** + * Load the content into the element. + * + * @param {string} content - The content to load. + */ + load(content) { + this.element.load(content); + } +} diff --git a/src/js/elements/InlineElement.js b/src/js/elements/InlineElement.js new file mode 100644 index 0000000..472f1eb --- /dev/null +++ b/src/js/elements/InlineElement.js @@ -0,0 +1,28 @@ +/** + * InlineElement class responsible for adding inline elements. + */ +export class InlineElement { + /** + * Creates an instance of InlineElement. + * + * @param {HTMLElement} triggerElement - The element that triggers the inline display. + */ + constructor(triggerElement) { + if (!(triggerElement instanceof HTMLElement)) { + throw new Error("triggerElement must be an instance of HTMLElement."); + } + this.triggerElement = triggerElement; + // Clear initial content + this.triggerElement.innerHTML = ''; + } + + /** + * Loads content into the trigger element. Appends new content if existing content is present. + * + * @param {string} content - The content to load into the trigger element. + */ + load(content) { + const existingContent = this.triggerElement.innerHTML; + this.triggerElement.innerHTML = existingContent ? `${existingContent}\n ${content}` : content; + } +} diff --git a/src/js/elements/ModalElement.js b/src/js/elements/ModalElement.js new file mode 100644 index 0000000..a696de7 --- /dev/null +++ b/src/js/elements/ModalElement.js @@ -0,0 +1,59 @@ +import { BaseModal } from './modals/BaseModal.js'; +import { UikitModal } from './modals/UikitModal.js'; +import { BootstrapModal } from './modals/BootstrapModal.js'; +import { FoundationModal } from './modals/FoundationModal.js'; +import { TailwindModal } from './modals/TailwindModal.js'; + +/** + * ModalElement class responsible for creating and managing modal elements. + * It dynamically selects the appropriate modal style based on the available UI framework. + */ +export class ModalElement { + /** + * Constructs an instance of ModalElement with the appropriate modal type + * based on the detected UI framework. + * + * @param {HTMLElement} triggerElement - The element that triggers the modal. + */ + constructor(triggerElement) { + this.modal = ModalElement.framework(triggerElement); + } + + /** + * Loads content into the modal. + * + * @param {string} content - The content to load into the modal. + */ + load(content) { + this.modal.load(content); + } + + /** + * Determines the appropriate modal implementation based on the available UI framework. + * + * @param {HTMLElement} triggerElement - The element triggering the modal. + * @returns {BaseModal|BootstrapModal|UikitModal|FoundationModal|TailwindModal} The modal instance. + */ + static framework(triggerElement) { + const frameworks = { + 'UIkit': UikitModal, + 'bootstrap': BootstrapModal, + 'Foundation': FoundationModal, + 'tailwind': TailwindModal + }; + + for (const [key, ModalType] of Object.entries(frameworks)) { + if (typeof window[key] !== 'undefined' || (key === 'tailwind' && document.querySelector('.tailwind-class') !== null)) { + if (process.env.DEBUG) { + console.log(`${key} modal selected`); + } + return new ModalType(triggerElement); + } + } + + if (process.env.DEBUG) { + console.log(`base modal selected`); + } + return new BaseModal(triggerElement); + } +} diff --git a/src/js/elements/TooltipElement.js b/src/js/elements/TooltipElement.js new file mode 100644 index 0000000..a112e1b --- /dev/null +++ b/src/js/elements/TooltipElement.js @@ -0,0 +1,60 @@ +import { BaseTooltip } from './tooltip/BaseTooltip.js'; +import { BootstrapTooltip } from './tooltip/BootstrapTooltip.js'; +import { UikitTooltip } from './tooltip/UikitTooltip.js'; +import { FoundationTooltip } from './tooltip/FoundationTooltip.js'; +import { TailwindTooltip } from './tooltip/TailwindTooltip.js'; + +/** + * TooltipElement class responsible for creating and managing tooltip elements. + * It dynamically selects the appropriate tooltip style based on the available UI framework. + */ +export class TooltipElement { + /** + * Constructs an instance of TooltipElement with the appropriate tooltip type + * based on the detected UI framework. + * + * @param {HTMLElement} triggerElement - The element that triggers the tooltip. + */ + constructor(triggerElement) { + this.tooltip = TooltipElement.framework(triggerElement); + } + + /** + * Loads content into the tooltip. + * + * @param {string} content - The content to load into the tooltip. + */ + load(content) { + this.tooltip.load(content); + } + + /** + * Determines the appropriate tooltip implementation based on the available UI framework. + * + * @param {HTMLElement} triggerElement - The element triggering the tooltip. + * @returns {BaseTooltip|BootstrapTooltip|UikitTooltip|FoundationTooltip|TailwindTooltip} The tooltip instance. + * @param debug + */ + static framework(triggerElement) { + const frameworks = { + 'UIkit': UikitTooltip, + 'bootstrap': BootstrapTooltip, + 'Foundation': FoundationTooltip, + 'tailwind': TailwindTooltip + }; + + for (const [key, TooltipType] of Object.entries(frameworks)) { + if (typeof window[key] !== 'undefined' || (key === 'tailwind' && document.querySelector('.tailwind-class') !== null)) { + if (process.env.DEBUG) { + console.log(`${key} tooltip selected`); + } + return new TooltipType(triggerElement); + } + } + + if (process.env.DEBUG) { + console.log(`base tooltip selected`); + } + return new BaseTooltip(triggerElement); + } +} diff --git a/src/js/elements/modals/BaseModal.js b/src/js/elements/modals/BaseModal.js new file mode 100644 index 0000000..623ddb3 --- /dev/null +++ b/src/js/elements/modals/BaseModal.js @@ -0,0 +1,77 @@ +export class BaseModal { + /** + * Creates a new BaseModal instance. + * + * @param {HTMLElement} triggerElement - The elements that triggers the modal. + */ + constructor(triggerElement) { + this.modalId = `modal-${Math.random().toString(36).slice(2, 11)}`; + this.triggerElement = triggerElement; + this.triggerElement.style.cursor = 'pointer'; + this.initializeTrigger(); + } + + /** + * Loads content into the modal. + * + * @param {string} content - The content to load into the modal. + */ + load(content) { + const existingModal = document.getElementById(this.modalId); + // Check if modal already exists + if (existingModal) { + // Update the content of the existing modal + const contentDiv = document.getElementById(`${this.modalId}-content`); + if (contentDiv) { + contentDiv.innerHTML += content; + } + } else { + // If modal doesn't exist, create it with the new content + this.create(content); + } + } + + /** + * Insert HTML into the dom. + * + * @param {string} html - The html to insert. + */ + insertIntoDOM(html) { + document.body.insertAdjacentHTML('beforeend', html); + } + + /** + * Creates the modal. + * + * @param {string} content - The initial content of the modal. + */ + create(content) { + const modalHtml = ` + `; + this.insertIntoDOM(modalHtml); + + const modalElement = document.getElementById(this.modalId); + modalElement.addEventListener('click', (event) => { + if (event.target === modalElement) { + modalElement.style.display = 'none'; + } + }); + } + + /** + * Initializes the modal trigger. + * + */ + initializeTrigger() { + this.triggerElement.addEventListener('click', () => { + document.getElementById(this.modalId).style.display = 'flex'; + }); + } +} diff --git a/src/js/elements/modals/BootstrapModal.js b/src/js/elements/modals/BootstrapModal.js new file mode 100644 index 0000000..535ee95 --- /dev/null +++ b/src/js/elements/modals/BootstrapModal.js @@ -0,0 +1,41 @@ +import { BaseModal } from './BaseModal.js'; + +export class BootstrapModal extends BaseModal { + constructor(triggerElement) { + super(triggerElement); + } + + show() { + const modal = new bootstrap.Modal(document.getElementById(this.modalId)); + modal.show(); + } + + hide() { + const modal = bootstrap.Modal.getInstance(document.getElementById(this.modalId)); + if (modal) { + modal.hide(); + } + } + + create(content) { + const modalHtml = ` + `; + this.insertIntoDOM(modalHtml); + } + + initializeTrigger() { + this.triggerElement.setAttribute('data-bs-toggle', 'modal'); + this.triggerElement.setAttribute('data-bs-target', `#${this.modalId}`); + } +} diff --git a/src/js/elements/modals/FoundationModal.js b/src/js/elements/modals/FoundationModal.js new file mode 100644 index 0000000..e6890b0 --- /dev/null +++ b/src/js/elements/modals/FoundationModal.js @@ -0,0 +1,38 @@ +import { BaseModal } from './BaseModal.js'; + +export class FoundationModal extends BaseModal { + constructor(triggerElement) { + super(triggerElement); + this.modalElement = null; + } + + show() { + if (this.modalElement) { + this.modalElement.open(); + } + } + + hide() { + if (this.modalElement) { + this.modalElement.close(); + } + } + + create(content) { + const modalHtml = ` +
+
+ ${content} +
+ +
`; + this.insertIntoDOM(modalHtml); + this.modalElement = new Foundation.Reveal(document.getElementById(this.modalId)); + } + + initializeTrigger() { + this.triggerElement.setAttribute('data-open', this.modalId); + } +} diff --git a/src/js/elements/modals/TailwindModal.js b/src/js/elements/modals/TailwindModal.js new file mode 100644 index 0000000..f67f80c --- /dev/null +++ b/src/js/elements/modals/TailwindModal.js @@ -0,0 +1,35 @@ +import { BaseModal } from './BaseModal.js'; + +export class TailwindModal extends BaseModal { + constructor(triggerElement) { + super(triggerElement); + } + + show() { + document.getElementById(this.modalId).classList.remove('hidden'); + } + + hide() { + document.getElementById(this.modalId).classList.add('hidden'); + } + + create(content) { + const modalHtml = ` + `; + this.insertIntoDOM(modalHtml); + } + + initializeTrigger(triggerElement) { + this.triggerElement.addEventListener('click', () => { + document.getElementById(this.modalId).classList.remove('hidden'); + }); + } +} + diff --git a/src/js/elements/modals/UikitModal.js b/src/js/elements/modals/UikitModal.js new file mode 100644 index 0000000..2e08caa --- /dev/null +++ b/src/js/elements/modals/UikitModal.js @@ -0,0 +1,33 @@ +import { BaseModal } from './BaseModal.js'; + +export class UikitModal extends BaseModal { + constructor(triggerElement) { + super(triggerElement); + } + + show() { + UIkit.modal(`#${this.modalId}`).show(); + } + + hide() { + UIkit.modal(`#${this.modalId}`).hide(); + } + + create(content) { + const modalHtml = ` +
+
+ +
+ ${content} +
+
+
`; + this.insertIntoDOM(modalHtml); + } + + initializeTrigger() { + this.triggerElement.setAttribute('uk-toggle', `target: #${this.modalId}`); + } +} + diff --git a/src/js/elements/tooltip/BaseTooltip.js b/src/js/elements/tooltip/BaseTooltip.js new file mode 100644 index 0000000..bcd37ae --- /dev/null +++ b/src/js/elements/tooltip/BaseTooltip.js @@ -0,0 +1,24 @@ +export class BaseTooltip { + /** + * Creates a new BaseTooltip instance. + * + * @param {HTMLElement} triggerElement - The elements that triggers the tooltip. + */ + constructor(triggerElement) { + this.triggerElement = triggerElement; + this.triggerElement.style.cursor = 'help'; + } + + /** + * Loads content into the tooltip. If the trigger elements already has a title, + * the new content is appended to it. + * + * @param {string} content - The content to load into the tooltip. + * @throws {Error} Throws an error if the trigger elements is not valid. + */ + load(content) { + const existingTitle = this.triggerElement.getAttribute('title'); + const newTitle = existingTitle ? existingTitle + "\n" + content : content; + this.triggerElement.setAttribute('title', newTitle); + } +} diff --git a/src/js/elements/tooltip/BootstrapTooltip.js b/src/js/elements/tooltip/BootstrapTooltip.js new file mode 100644 index 0000000..a105c85 --- /dev/null +++ b/src/js/elements/tooltip/BootstrapTooltip.js @@ -0,0 +1,19 @@ +import { BaseTooltip } from './BaseTooltip.js'; + +export class BootstrapTooltip extends BaseTooltip { + constructor(triggerElement) { + super(triggerElement); + } + + load(content) { + try { + super.load(content); + const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); + const tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl); + }); + } catch (error) { + console.error('Error loading BootstrapTooltip:', error); + } + } +} diff --git a/src/js/elements/tooltip/FoundationTooltip.js b/src/js/elements/tooltip/FoundationTooltip.js new file mode 100644 index 0000000..4ca803e --- /dev/null +++ b/src/js/elements/tooltip/FoundationTooltip.js @@ -0,0 +1,33 @@ +import { BaseTooltip } from './BaseTooltip.js'; + +export class FoundationTooltip extends BaseTooltip { + constructor(triggerElement) { + super(triggerElement); + } + + load(content) { + try { + this.triggerElement.setAttribute('data-tooltip', ''); + super.load(content); + this.triggerElement.classList.add('has-tip'); + + new Foundation.Tooltip(this.triggerElement, { + // Default options + disableHover: false, // Allows tooltip to be hoverable + fadeOutDuration: 150, // Duration of fade out animation in milliseconds + fadeInDuration: 150, // Duration of fade in animation in milliseconds + showOn: 'all', // Can be 'all', 'large', 'medium', 'small' + templateClasses: '', // Custom class(es) to be added to the tooltip template + tipText: () => this.triggerElement.getAttribute('title'), // Function to define tooltip text + triggerClass: 'has-tip', // Class to be added on the trigger elements + touchCloseText: 'tap to close', // Text for close button on touch devices + positionClass: 'top', // Position of tooltip, can be 'top', 'bottom', 'left', 'right', etc. + vOffset: 10, // Vertical offset + hOffset: 12, // Horizontal offset + allowHtml: false // Allow HTML in tooltip content + }); + } catch (error) { + console.error('Error loading FoundationTooltip:', error); + } + } +} diff --git a/src/js/elements/tooltip/TailwindTooltip.js b/src/js/elements/tooltip/TailwindTooltip.js new file mode 100644 index 0000000..c1ad0d3 --- /dev/null +++ b/src/js/elements/tooltip/TailwindTooltip.js @@ -0,0 +1,44 @@ +import { BaseTooltip } from './BaseTooltip.js'; + +export class TailwindTooltip extends BaseTooltip { + constructor(triggerElement) { + super(triggerElement); + } + + load(content) { + try { + super.load(content); + this._createTooltipElement(); + this._initializeEvents(); + } catch (error) { + console.error('Error loading TailwindTooltip:', error); + } + } + + _createTooltipElement() { + this.tooltipElement = document.createElement('div'); + this.tooltipElement.id = this.tooltipId; + this.tooltipElement.className = 'absolute invisible bg-gray-800 text-white text-xs px-2 py-1 rounded-md'; + this.tooltipElement.style.transition = 'visibility 0.3s linear, opacity 0.3s linear'; + this.tooltipElement.textContent = this.triggerElement.getAttribute('title'); + document.body.appendChild(this.tooltipElement); + } + + _initializeEvents() { + this.triggerElement.addEventListener('mouseenter', () => { + const rect = this.triggerElement.getBoundingClientRect(); + this._title = this.triggerElement.getAttribute('title'); + this.tooltipElement.style.left = `${rect.left + window.scrollX}px`; + this.tooltipElement.style.top = `${rect.bottom + 5 + window.scrollY}px`; + this.tooltipElement.classList.remove('invisible'); + this.tooltipElement.classList.add('opacity-100'); + this.triggerElement.setAttribute('title', ''); + }); + + this.triggerElement.addEventListener('mouseleave', () => { + this.tooltipElement.classList.add('invisible'); + this.tooltipElement.classList.remove('opacity-100'); + this.triggerElement.setAttribute('title', this._title); + }); + } +} diff --git a/src/js/elements/tooltip/UikitTooltip.js b/src/js/elements/tooltip/UikitTooltip.js new file mode 100644 index 0000000..741b107 --- /dev/null +++ b/src/js/elements/tooltip/UikitTooltip.js @@ -0,0 +1,16 @@ +import { BaseTooltip } from './BaseTooltip.js'; + +export class UikitTooltip extends BaseTooltip { + constructor(triggerElement) { + super(triggerElement); + } + + load(content) { + try { + super.load(content); + UIkit.tooltip(this.triggerElement); + } catch (error) { + console.error('Error loading UikitTooltip:', error); + } + } +} diff --git a/src/js/formats/BaseFormat.js b/src/js/formats/BaseFormat.js new file mode 100644 index 0000000..5aeece4 --- /dev/null +++ b/src/js/formats/BaseFormat.js @@ -0,0 +1,16 @@ +export class BaseFormat { + /** + * Get formats the verses. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted verses. + * @abstract + */ + get(data, showBook, showTrans, showAbbr, showLang) { + throw new Error("The 'get' method must be implemented in BaseFormat subclass."); + } +} diff --git a/src/js/formats/BlockFormat.js b/src/js/formats/BlockFormat.js new file mode 100644 index 0000000..ed66551 --- /dev/null +++ b/src/js/formats/BlockFormat.js @@ -0,0 +1,56 @@ +import { BaseFormat } from './BaseFormat.js'; + +export class BlockFormat extends BaseFormat { + /** + * Formats the verses for HTML block elements. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted HTML string. + */ + get(data, showBook, showTrans, showAbbr, showLang) { + let formattedHtml = ''; + let setBookName = new Set(); + let setTranslation = new Set(); + let setAbbreviation = new Set(); + let setLanguage = new Set(); + + for (const key in data) { + if (!data.hasOwnProperty(key)) continue; + + let headerParts = []; + if (showTrans && !setTranslation.has(key)) { + headerParts.push(`${data[key].translation}`); + setTranslation.add(key); + } + if (showAbbr && !setAbbreviation.has(key)) { + headerParts.push(`${data[key].abbreviation}`); + setAbbreviation.add(key); + } + if (showBook && !setBookName.has(key)) { + headerParts.push(`${data[key].name}`); + setBookName.add(key); + } + if (showLang && !setLanguage.has(key)) { + headerParts.push(`${data[key].language}`); + setLanguage.add(key); + } + + // Construct the header + if (headerParts.length > 0) { + formattedHtml += `
[${headerParts.join(' - ')}]
\n`; + } + + // Add verses + const verses = data[key].verses + .map(verse => `${verse.verse}. ${verse.text}`) + .join("
"); + formattedHtml += `
${verses}

`; + } + + return `
${formattedHtml}
`; + } +} diff --git a/src/js/formats/Format.js b/src/js/formats/Format.js new file mode 100644 index 0000000..fb28b5a --- /dev/null +++ b/src/js/formats/Format.js @@ -0,0 +1,39 @@ +import { BlockFormat } from './BlockFormat.js'; +import { InlineFormat } from './InlineFormat.js'; +import { PlainFormat } from './PlainFormat.js'; + +/** + * Format class responsible for creating and managing different types of formats + * based on the specified type. + */ +export class Format { + /** + * Constructs a Format instance based on the given type. + * + * @param {string} formatType - The format type. + */ + constructor(formatType = 'tooltip') { + const formatTypes = { + 'modal': BlockFormat, + 'inline': InlineFormat, + 'tooltip': PlainFormat + }; + + const FormatType = formatTypes[formatType] || PlainFormat; + this.format = new FormatType(); + } + + /** + * Get the formatted verses. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted verses. + */ + get(data, showBook, showTrans, showAbbr, showLang) { + return this.format.get(data, showBook, showTrans, showAbbr, showLang); + } +} diff --git a/src/js/formats/InlineFormat.js b/src/js/formats/InlineFormat.js new file mode 100644 index 0000000..4c584ff --- /dev/null +++ b/src/js/formats/InlineFormat.js @@ -0,0 +1,56 @@ +import { BaseFormat } from './BaseFormat.js'; + +export class InlineFormat extends BaseFormat { + /** + * Formats the verses for HTML inline elements. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted HTML string. + */ + get(data, showBook, showTrans, showAbbr, showLang) { + let formattedHtml = ''; + let setBookName = new Set(); + let setTranslation = new Set(); + let setAbbreviation = new Set(); + let setLanguage = new Set(); + + for (const key in data) { + if (!data.hasOwnProperty(key)) continue; + + let footerParts = []; + if (showTrans && !setTranslation.has(key)) { + footerParts.push(`${data[key].translation}`); + setTranslation.add(key); + } + if (showAbbr && !setAbbreviation.has(key)) { + footerParts.push(`${data[key].abbreviation}`); + setAbbreviation.add(key); + } + if (showBook && !setBookName.has(key)) { + footerParts.push(`${data[key].name}`); + setBookName.add(key); + } + if (showLang && !setLanguage.has(key)) { + footerParts.push(`${data[key].language}`); + setLanguage.add(key); + } + + // Add verses + const verses = data[key].verses + .map(verse => `${verse.verse}. ${verse.text}`) + .join("\n"); + formattedHtml += `${verses}\n`; + + // Construct the footer + if (footerParts.length > 0) { + formattedHtml += `[${footerParts.join(' - ')}]\n`; + } + } + + return `${formattedHtml}`; + } +} diff --git a/src/js/formats/PlainFormat.js b/src/js/formats/PlainFormat.js new file mode 100644 index 0000000..c5a6364 --- /dev/null +++ b/src/js/formats/PlainFormat.js @@ -0,0 +1,54 @@ +import { BaseFormat } from './BaseFormat.js'; + +export class PlainFormat extends BaseFormat { + /** + * Formats the verses for plain text display. + * + * @param {Object} data - The data containing verses and their details. + * @param {boolean} showBook - Whether to show book names. + * @param {boolean} showTrans - Whether to show translations. + * @param {boolean} showAbbr - Whether to show abbreviations. + * @param {boolean} showLang - Whether to show languages. + * @returns {string} The formatted text. + */ + get(data, showBook, showTrans, showAbbr, showLang) { + let formattedText = ''; + let setBookName = new Set(); + let setTranslation = new Set(); + let setAbbreviation = new Set(); + let setLanguage = new Set(); + + for (const key in data) { + if (!data.hasOwnProperty(key)) continue; // Ensure processing only own properties + + let headerParts = []; + if (showTrans && !setTranslation.has(key)) { + headerParts.push(data[key].translation); + setTranslation.add(key); + } + if (showAbbr && !setAbbreviation.has(key)) { + headerParts.push(data[key].abbreviation); + setAbbreviation.add(key); + } + if (showBook && !setBookName.has(key)) { + headerParts.push(data[key].name); + setBookName.add(key); + } + if (showLang && !setLanguage.has(key)) { + headerParts.push(data[key].language); + setLanguage.add(key); + } + + // Construct the header + if (headerParts.length > 0) { + formattedText += '[' + headerParts.join(' - ') + "]\n"; + } + + // Add verses + const verses = data[key].verses.map(verse => `${verse.verse}. ${verse.text}`).join("\n"); + formattedText += verses + "\n\n"; // Add extra newline for separation + } + + return formattedText.trim(); + } +} diff --git a/src/js/getBible.js b/src/js/getBible.js new file mode 100644 index 0000000..4e8f6d2 --- /dev/null +++ b/src/js/getBible.js @@ -0,0 +1,14 @@ +import { Loader } from "./core/Loader.js"; + +/** + * Entry point to load Bible references. + * Attaches event listener to DOMContentLoaded to find elements with class 'getBible' + * and initializes Loader for each element. + */ +document.addEventListener('DOMContentLoaded', (event) => { + const elements = document.querySelectorAll('.getBible'); + elements.forEach(element => { + const loader = new Loader(); + loader.load(element); + }); +}); diff --git a/tests/basic.html b/tests/basic.html new file mode 100644 index 0000000..501111f --- /dev/null +++ b/tests/basic.html @@ -0,0 +1,29 @@ + + + + + + Basic GetBible Test + + + + + + + +

Scripture References

+ +

Hover over the references to see the scripture text:

+ +
    +
  • John 3:16,19 +
  • +
  • John 3:16-17; 1 John 3:16-19,22
  • +
  • Genesis 1:1
  • +
  • Psalms 23:1-4
  • +
  • Romans 8:28,31-39
  • +
+ + + diff --git a/tests/bootstrap.html b/tests/bootstrap.html new file mode 100644 index 0000000..9a46e16 --- /dev/null +++ b/tests/bootstrap.html @@ -0,0 +1,38 @@ + + + + + + Bootstrap Tooltips Test | GetBible + + + + + + + + + + + +

Scripture References

+ +

Hover over the references to see the scripture text:

+ +
    +
  • John 3:16,19 +
  • +
  • John 3:16-17; 1 John 3:16-19,22
  • +
  • Genesis 1:1
  • +
  • Psalms 23:1-4
  • +
  • Romans 8:28,31-39
  • +
+ + + diff --git a/tests/foundation.html b/tests/foundation.html new file mode 100644 index 0000000..197934a --- /dev/null +++ b/tests/foundation.html @@ -0,0 +1,42 @@ + + + + + + + Foundation Tooltips Test | GetBible + + + + + + + + + +

Scripture References

+ +

Hover over the references to see the scripture text:

+ +
    +
  • John 3:16,19 +
  • +
  • John 3:16-17; 1 John 3:16-19,22
  • +
  • Genesis 1:1
  • +
  • Psalms 23:1-4
  • +
  • Romans 8:28,31-39
  • +
+ + + + + + +

Please help us!!! We are not getting this to work, because of jQuery, or so it seems.

+ + diff --git a/tests/tailwind.html b/tests/tailwind.html new file mode 100644 index 0000000..549bf21 --- /dev/null +++ b/tests/tailwind.html @@ -0,0 +1,35 @@ + + + + + + Tailwind Tooltips Test | GetBible + + + + + + + + + +
+
+

Scripture References

+
+
+ +

Hover over the references to see the scripture text:

+ +
    +
  • John 3:16,19 +
  • +
  • John 3:16-17; 1 John 3:16-19,22
  • +
  • Genesis 1:1
  • +
  • Psalms 23:1-4
  • +
  • Romans 8:28,31-39
  • +
+ + + diff --git a/tests/uikit.html b/tests/uikit.html new file mode 100644 index 0000000..b2bb165 --- /dev/null +++ b/tests/uikit.html @@ -0,0 +1,36 @@ + + + + + + Uikit Tooltips Test | GetBible + + + + + + + + + + + + + + +

Scripture References

+ +

Hover over the references to see the scripture text:

+ +
    +
  • John 3:16,19 +
  • +
  • John 3:16-17; 1 John 3:16-19,22
  • +
  • Genesis 1:1
  • +
  • Psalms 23:1-4
  • +
  • Romans 8:28,31-39
  • +
+ + +