diff options
| -rw-r--r-- | .eslintrc.js | 17 | ||||
| -rw-r--r-- | .eslintrc.json | 19 | ||||
| -rw-r--r-- | asset-sources/fietsboek.ts | 408 | ||||
| -rw-r--r-- | doc/developer/js-css.rst | 18 | ||||
| -rw-r--r-- | fietsboek/static/fietsboek.js | 440 | ||||
| -rw-r--r-- | fietsboek/static/fietsboek.js.map | 1 | ||||
| -rw-r--r-- | justfile | 4 | ||||
| -rw-r--r-- | package-lock.json | 2343 | ||||
| -rw-r--r-- | package.json | 8 | ||||
| -rw-r--r-- | tsconfig.json | 109 | 
10 files changed, 3110 insertions, 257 deletions
diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f78dc92 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { +  extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], +  parser: '@typescript-eslint/parser', +  plugins: ['@typescript-eslint'], +  rules: { +      "@typescript-eslint/no-non-null-assertion": "off", +      "@typescript-eslint/no-unused-vars": [1, { +          varsIgnorePattern: "^_", +          argsIgnorePattern: "^_", +      }], +      "@typescript-eslint/no-explicit-any": "off", +      "max-len": [2, 100], +      "semi": [2, "always"], +      "comma-dangle": [2, "always-multiline"], +  }, +  root: true, +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index cbdf52f..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ -    "env": { -        "browser": true, -        "es2021": true -    }, -    "extends": [ -        "google" -    ], -    "parserOptions": { -        "ecmaVersion": "latest", -        "sourceType": "module" -    }, -    "rules": { -        "quotes": "off", -        "max-len": [2, {"code": 100}], -        "valid-jsdoc": [2, {"requireParamType": false, "requireReturnType": false, "requireReturn": false}], -        "indent": [2, 2] -    } -} diff --git a/asset-sources/fietsboek.ts b/asset-sources/fietsboek.ts new file mode 100644 index 0000000..aed2852 --- /dev/null +++ b/asset-sources/fietsboek.ts @@ -0,0 +1,408 @@ +declare const FRIENDS_URL: string; +declare const LOCALE: string; + +/** + * Object that we get back from the friend API. + */ +interface JsonFriend { +    name: string, +    id: number, +} + +interface Window { +    fietsboekImageIndex: number, +    fietsboekCurrentImage: HTMLDivElement | null, +} + +// Make eslint happy about the Window redefinition +(_: Window) => null; + +/** + * Type alias to make it clear what kind of string we are expecting. + */ +type Selector = string; + +/** + * Installs a listener to the given DOM objects. + * + * @param selector - The query selector to find the DOM objects. + * @param event - The event name to listen to. + * @param handler - The handler function. + */ +function addHandler<K extends keyof GlobalEventHandlersEventMap>( +    selector: Selector, +    event: K, +    handler: (ev: GlobalEventHandlersEventMap[K]) => any, +) { +    document.querySelectorAll(selector). +        forEach((obj) => obj.addEventListener(event, handler as EventListener)); +} + +/** + * Handler for when a tag is clicked. Removes the tag from the tag list. + * + * @param event - The triggering event. + */ +function tagClicked(event: MouseEvent) { +    const span = (event.target as HTMLElement).closest('span')!; +    span.parentNode!.removeChild(span); +} + +addHandler(".tag-badge", "click", tagClicked); + +/** + * Handler to add a new tag when the button is pressed. + */ +function addTag() { +    const newTag = document.querySelector("#new-tag") as HTMLInputElement; +    if (newTag.value === "") { +        return; +    } +    const node = document.createElement("span"); +    node.classList.add("tag-badge"); +    node.classList.add("badge"); +    node.classList.add("rounded-pill"); +    node.classList.add("bg-info"); +    node.classList.add("text-dark"); +    node.addEventListener("click", tagClicked); +    const text = document.createTextNode(newTag.value); +    node.appendChild(text); +    const icon = document.createElement("i"); +    icon.classList.add("bi"); +    icon.classList.add("bi-x"); +    node.appendChild(icon); +    const input = document.createElement("input"); +    input.hidden = true; +    input.name = "tag[]"; +    input.value = newTag.value; +    node.appendChild(input); +    document.querySelector("#formTags")?.appendChild(node); +    const space = document.createTextNode(" "); +    document.querySelector("#formTags")?.appendChild(space); +    newTag.value = ""; +} + +addHandler("#add-tag-btn", "click", addTag); +// Also add a tag when enter is pressed +addHandler("#new-tag", "keypress", (event) => { +    if (event.code == "Enter") { +        event.preventDefault(); +        addTag(); +    } +}); + +/** + * Function to check for password validity. + * + * @param main - Selector for the actual entered password input. + * @param repeat - Selector for the repeated password, must match `main`. + */ +function checkPasswordValidity(main: Selector, repeat: Selector) { +    const mainPassword = document.querySelector(main) as HTMLInputElement; +    const repeatPassword = document.querySelector(repeat) as HTMLInputElement; + +    const form = mainPassword.closest('form')!; +    form.classList.remove('was-validated'); + +    // Check password requirements. The validation errors are not actually +    // displayed, as the HTML template contains pre-filled texts for that. +    if (mainPassword.value.length != 0 && mainPassword.value.length < 8) { +        mainPassword.setCustomValidity('Too short'); +    } else { +        mainPassword.setCustomValidity(''); +    } + +    if (mainPassword.value != repeatPassword.value) { +        repeatPassword.setCustomValidity('Needs to match'); +    } else { +        repeatPassword.setCustomValidity(''); +    } +} + +// This function is used via a HTML onchange= handler, so make eslint happy +checkPasswordValidity; + +/** + * Function to check for name validity. + * + * @param name - Selector name that should be checked. + */ +function checkNameValidity(name: Selector) { +    const nameField = document.querySelector(name) as HTMLInputElement; +    if (nameField.value.length == 0) { +        nameField.setCustomValidity('Needs a name'); +    } +} + +// This function is used via a HTML onchange= handler, so make eslint happy +checkNameValidity; + +/** + * Hit the endpoint to search for friends. This populates the friend selector + * when tagging friends. + */ +function searchFriends() { +    const searchPattern = (document.querySelector("#friendSearchQuery") as HTMLInputElement). +        value.toLowerCase(); +    const friendSearch = document.querySelector("#friendSearch")!; +    friendSearch.innerHTML = ""; +    fetch(FRIENDS_URL) +        .then((response) => response.json()) +        .then((response: [JsonFriend]) => { +            const blueprint = document.querySelector("#friendSearchBlueprint") as HTMLLIElement; + +            // Only show friends with a matching name +            const friends = response.filter( +                (obj) => obj.name.toLowerCase().indexOf(searchPattern) != -1 +            ); + +            friends.forEach((friend) => { +                const copy = blueprint.cloneNode(true) as HTMLLIElement; +                copy.removeAttribute("id"); +                (copy.querySelector(".friend-name") as HTMLSpanElement).textContent = friend.name; +                copy.querySelector("button")?.addEventListener("click", (event: MouseEvent) => { +                    const button = (event.target as HTMLElement).closest("button")!; +                    button.parentNode!.parentNode!.removeChild(button.parentNode!); + +                    const added = document.querySelector("#friendAddedBlueprint")!. +                        cloneNode(true) as HTMLLIElement; +                    added.removeAttribute("id"); +                    (added.querySelector(".friend-name") as HTMLSpanElement). +                        textContent = friend.name; +                    added.querySelector("input")!.value = friend.id.toString(); +                    added.querySelector("input")!.removeAttribute("disabled"); +                    added.querySelector("button")!.addEventListener("click", removeFriendClicked); +                    document.querySelector('#taggedFriends')!.appendChild(added); +                }); +                friendSearch.appendChild(copy); +            }); +        }); +} + +addHandler("#add-friend-btn", "click", () => searchFriends()); +// Also trigger the search on Enter keypress +addHandler("#friendSearchQuery", "keypress", (event) => { +    if (event.code == "Enter") { +        event.preventDefault(); +        searchFriends(); +    } +}); + +/** + * Handler for when a "Remove friend" button is clicked. + * + * @param event - The triggering event. + */ +function removeFriendClicked(event: MouseEvent) { +    const button = (event.target as HTMLElement).closest("button")!; +    button.parentNode!.parentNode!.removeChild(button.parentNode!); +} + +addHandler(".remove-friend-button", "click", removeFriendClicked); + +/** + * Handler for when the image input is changed. + * + * This handler splits the multiple images up into single input fields, such + * that each one can be removed individually. It also adds preview images, and + * adds the button to delete and edit the image's description. + * + * @param event - The triggering event. + */ +function imageSelectorChanged(event: Event) { +    console.log(event); +    const target = event.target as HTMLInputElement; +    for (const file of Array.from(target.files ?? [])) { +        window.fietsboekImageIndex++; + +        const input = document.createElement("input"); +        input.type = "file"; +        input.hidden = true; +        input.name = `image[${window.fietsboekImageIndex}]`; + +        const transfer = new DataTransfer(); +        transfer.items.add(file); +        input.files = transfer.files; + +        const preview = document.querySelector("#trackImagePreviewBlueprint")!. +            cloneNode(true) as HTMLDivElement; +        preview.removeAttribute("id"); +        preview.querySelector("img")!.src = URL.createObjectURL(file); +        preview.querySelector("button.delete-image")!. +            addEventListener("click", deleteImageButtonClicked as EventListener); +        preview.querySelector("button.edit-image-description")!. +            addEventListener("click", editImageDescriptionClicked as EventListener); +        (preview.querySelector("input.image-description-input") as HTMLInputElement). +            name = `image-description[${window.fietsboekImageIndex}]`; +        preview.appendChild(input); + +        document.querySelector("#trackImageList")!.appendChild(preview); +    } + +    target.value = ""; +} + +addHandler("#imageSelector", "change", imageSelectorChanged); + +/** + * Handler to remove a picture from a track. + * + * @param event - The triggering event. + */ +function deleteImageButtonClicked(event: MouseEvent) { +    const preview = (event.target as HTMLElement).closest("div.track-image-preview")!; +    /* If this was a image yet to be uploaded, simply remove it */ +    const input = preview.querySelector("input[type=file]"); +    if (input) { +        preview.parentNode!.removeChild(preview); +        return; +    } + +    /* Otherwise, we need to remove it but also insert a "delete-image" input */ +    const deleter = preview.querySelector("input.image-deleter-input")!; +    deleter.removeAttribute("disabled"); +    preview.removeChild(deleter); +    preview.parentNode!.appendChild(deleter); +    preview.parentNode!.removeChild(preview); +} + +addHandler("button.delete-image", "click", deleteImageButtonClicked); + +/** + * Handler to show the image description editor. + * + * @param event - The triggering event. + */ +function editImageDescriptionClicked(event: MouseEvent) { +    window.fietsboekCurrentImage = (event.target as HTMLElement).closest("div")!; + +    const imageInput = ( +        <HTMLInputElement> +        window.fietsboekCurrentImage.querySelector("input.image-description-input") +    ); +    const currentDescription = imageInput.value; +    const modalDom = document.getElementById("imageDescriptionModal")!; +    modalDom.querySelector("textarea")!.value = currentDescription; + +    const modal = bootstrap.Modal.getOrCreateInstance(modalDom, {}); +    modal.show(); +} + +addHandler("button.edit-image-description", "click", editImageDescriptionClicked); + +/** + * Handler to save the image description of the currently edited image. + * + * @param event - The triggering event. + */ +function saveImageDescriptionClicked(_event: MouseEvent) { +    const modalDom = document.getElementById("imageDescriptionModal")!; +    const wantedDescription = modalDom.querySelector("textarea")!.value; +    (window.fietsboekCurrentImage!. +        querySelector("input.image-description-input") as HTMLInputElement). +        value = wantedDescription; +    window.fietsboekCurrentImage!. +        querySelector("img")!.title = wantedDescription; + +    const modal = bootstrap.Modal.getOrCreateInstance(modalDom, {}); +    modal.hide(); + +    window.fietsboekCurrentImage = null; +} + +addHandler("#imageDescriptionModal button.btn-success", "click", saveImageDescriptionClicked); + +/** + * Handler to toggle (collapse/expand) the yearly/monthly summary. + * + * @param event - The triggering event. + */ +function toggleSummary(event: MouseEvent) { +    const chevron = event.target as HTMLElement; +    const containing = chevron.closest("a")!; +    const summary = containing.nextElementSibling!; +    bootstrap.Collapse.getOrCreateInstance(summary).toggle(); +    if (chevron.classList.contains("bi-chevron-down")) { +        chevron.classList.remove("bi-chevron-down"); +        chevron.classList.add("bi-chevron-right"); +    } else { +        chevron.classList.remove("bi-chevron-right"); +        chevron.classList.add("bi-chevron-down"); +    } +} + +addHandler(".summary-toggler", "click", toggleSummary); + +/* + * Handler to enable the "Download archive button" ... + */ +addHandler("#archiveDownloadButton", "click", () => { +    const checked = document.querySelectorAll(".archive-checkbox:checked"); +    const url = new URL("/track/archive", window.location.href); +    checked.forEach((c) => { +        url.searchParams.append("track_id[]", (c as HTMLInputElement).value); +    }); +    window.location.assign(url); +}); +/* + * ... and the listeners on the checkboxes to disable and enable the button. + */ +addHandler(".archive-checkbox", "change", () => { +    const checked = document.querySelectorAll(".archive-checkbox:checked"); +    const downloadButton = document.querySelector("#archiveDownloadButton") as HTMLButtonElement; +    downloadButton.disabled = (checked.length == 0); +}); + +/** + * Handler to clear the input when a .button-clear-input is pressed. + * + * The button must be in an input-group with the input. + * + * @param event - The triggering event. + */ +function clearInputButtonClicked(event: MouseEvent) { +    const target = event.target as HTMLElement; +    target.closest(".input-group")!.querySelectorAll("input").forEach((i) => i.value = ""); +    target.closest(".input-group")!.querySelectorAll("select").forEach((i) => i.value = ""); +} + +addHandler(".button-clear-input", "click", clearInputButtonClicked); + + +document.addEventListener('DOMContentLoaded', function() { +    window.fietsboekImageIndex = 0; + +    /* Enable tooltips */ +    const tooltipTriggerList = [].slice.call( +        document.querySelectorAll('[data-bs-toggle="tooltip"]') +    ); +    tooltipTriggerList.map((tooltipTriggerEl) => { +        return new bootstrap.Tooltip(tooltipTriggerEl, { sanitize: false }); +    }); + +    /* Enable Bootstrap form validation */ +    const forms = document.querySelectorAll('.needs-validation'); +    Array.from(forms).forEach((form) => { +        form.addEventListener('submit', (event) => { +            if (!(form as HTMLFormElement).checkValidity()) { +                event.preventDefault(); +                event.stopPropagation(); +            } + +            form.classList.add('was-validated'); +        }, false); +    }); + +    /* Format all datetimes to the local timezone */ +    document.querySelectorAll(".fietsboek-local-datetime").forEach((obj) => { +        const timestamp = parseFloat(obj.attributes.getNamedItem("data-utc-timestamp")!.value); +        const date = new Date(timestamp * 1000); +        // TypeScript complains about this, but according to MDN it is fine, at +        // least in "somewhat modern" browsers +        const intl = new Intl.DateTimeFormat(LOCALE, { +            dateStyle: "medium", +            timeStyle: "medium", +        } as any); +        obj.innerHTML = intl.format(date); +    }); +}); diff --git a/doc/developer/js-css.rst b/doc/developer/js-css.rst index 016dab1..3193d58 100644 --- a/doc/developer/js-css.rst +++ b/doc/developer/js-css.rst @@ -56,5 +56,19 @@ compile the right SASS files::  Compiling TypeScript  -------------------- -Fietsboek does not *yet* use TypeScript. The JavaScript file -:file:`fietsboek/static/fietsboek.js` can be edited by hand. +The TypeScript source is located in :file:`asset-sources`. The +:file:`tsconfig.json` contains the necessary settings for the TypeScript +compiler, as such you can simply run ``tsc`` to compile the sources: + +.. code-block:: bash + +    npx tsc +    # Alternatively, keep watching for file changes: +    npx tsc -w + +To complement the ``just compile-sass`` command, a ``just compile-typescript`` +command also exists as an alias for ``npx tsc``. + +When changing the TypeScript code, you should also run ``eslint``:: + +    npx eslint asset-sources/fietsboek.ts diff --git a/fietsboek/static/fietsboek.js b/fietsboek/static/fietsboek.js index 60de398..6935ab1 100644 --- a/fietsboek/static/fietsboek.js +++ b/fietsboek/static/fietsboek.js @@ -1,3 +1,6 @@ +"use strict"; +// Make eslint happy about the Window redefinition +(_) => null;  /**   * Installs a listener to the given DOM objects.   * @@ -6,166 +9,155 @@   * @param handler - The handler function.   */  function addHandler(selector, event, handler) { -  document.querySelectorAll(selector).forEach((obj) => obj.addEventListener(event, handler)); +    document.querySelectorAll(selector). +        forEach((obj) => obj.addEventListener(event, handler));  } -  /**   * Handler for when a tag is clicked. Removes the tag from the tag list.   *   * @param event - The triggering event.   */  function tagClicked(event) { -  const span = event.target.closest('span'); -  span.parentNode.removeChild(span); +    const span = event.target.closest('span'); +    span.parentNode.removeChild(span);  } -  addHandler(".tag-badge", "click", tagClicked); -  /**   * Handler to add a new tag when the button is pressed.   */  function addTag() { -  const newTag = document.querySelector("#new-tag"); -  if (newTag.value === "") { -    return; -  } -  const node = document.createElement("span"); -  node.classList.add("tag-badge"); -  node.classList.add("badge"); -  node.classList.add("rounded-pill"); -  node.classList.add("bg-info"); -  node.classList.add("text-dark"); -  node.addEventListener("click", tagClicked); -  const text = document.createTextNode(newTag.value); -  node.appendChild(text); -  const icon = document.createElement("i"); -  icon.classList.add("bi"); -  icon.classList.add("bi-x"); -  node.appendChild(icon); -  const input = document.createElement("input"); -  input.hidden = true; -  input.name = "tag[]"; -  input.value = newTag.value; -  node.appendChild(input); -  document.querySelector("#formTags").appendChild(node); -  const space = document.createTextNode(" "); -  document.querySelector("#formTags").appendChild(space); -  newTag.value = ""; +    var _a, _b; +    const newTag = document.querySelector("#new-tag"); +    if (newTag.value === "") { +        return; +    } +    const node = document.createElement("span"); +    node.classList.add("tag-badge"); +    node.classList.add("badge"); +    node.classList.add("rounded-pill"); +    node.classList.add("bg-info"); +    node.classList.add("text-dark"); +    node.addEventListener("click", tagClicked); +    const text = document.createTextNode(newTag.value); +    node.appendChild(text); +    const icon = document.createElement("i"); +    icon.classList.add("bi"); +    icon.classList.add("bi-x"); +    node.appendChild(icon); +    const input = document.createElement("input"); +    input.hidden = true; +    input.name = "tag[]"; +    input.value = newTag.value; +    node.appendChild(input); +    (_a = document.querySelector("#formTags")) === null || _a === void 0 ? void 0 : _a.appendChild(node); +    const space = document.createTextNode(" "); +    (_b = document.querySelector("#formTags")) === null || _b === void 0 ? void 0 : _b.appendChild(space); +    newTag.value = "";  } -  addHandler("#add-tag-btn", "click", addTag);  // Also add a tag when enter is pressed  addHandler("#new-tag", "keypress", (event) => { -  if (event.keyCode == 13) { -    event.preventDefault(); -    addTag(); -  } +    if (event.code == "Enter") { +        event.preventDefault(); +        addTag(); +    }  }); -  /**   * Function to check for password validity.   * - * @param main - The actual entered password. - * @param repeat - The repeated password, must match `main`. + * @param main - Selector for the actual entered password input. + * @param repeat - Selector for the repeated password, must match `main`.   */  function checkPasswordValidity(main, repeat) { -  const mainPassword = document.querySelector(main); -  const repeatPassword = document.querySelector(repeat); - -  const form = mainPassword.closest('form'); -  form.classList.remove('was-validated'); - -  // Check password requirements. The validation errors are not actually -  // displayed, as the HTML template contains pre-filled texts for that. -  if (mainPassword.value.length != 0 && mainPassword.value.length < 8) { -    mainPassword.setCustomValidity('Too short'); -  } else { -    mainPassword.setCustomValidity(''); -  } - -  if (mainPassword.value != repeatPassword.value) { -    repeatPassword.setCustomValidity('Needs to match'); -  } else { -    repeatPassword.setCustomValidity(''); -  } +    const mainPassword = document.querySelector(main); +    const repeatPassword = document.querySelector(repeat); +    const form = mainPassword.closest('form'); +    form.classList.remove('was-validated'); +    // Check password requirements. The validation errors are not actually +    // displayed, as the HTML template contains pre-filled texts for that. +    if (mainPassword.value.length != 0 && mainPassword.value.length < 8) { +        mainPassword.setCustomValidity('Too short'); +    } +    else { +        mainPassword.setCustomValidity(''); +    } +    if (mainPassword.value != repeatPassword.value) { +        repeatPassword.setCustomValidity('Needs to match'); +    } +    else { +        repeatPassword.setCustomValidity(''); +    }  } -  // This function is used via a HTML onchange= handler, so make eslint happy  checkPasswordValidity; -  /**   * Function to check for name validity.   * - * @param name - The name that should be checked. + * @param name - Selector name that should be checked.   */  function checkNameValidity(name) { -  const nameField = document.querySelector(name); -  if (nameField.value.length == 0) { -    nameField.setCustomValidity('Needs a name'); -  } +    const nameField = document.querySelector(name); +    if (nameField.value.length == 0) { +        nameField.setCustomValidity('Needs a name'); +    }  } -  // This function is used via a HTML onchange= handler, so make eslint happy  checkNameValidity; -  /**   * Hit the endpoint to search for friends. This populates the friend selector   * when tagging friends.   */  function searchFriends() { -  const searchPattern = document.querySelector("#friendSearchQuery").value.toLowerCase(); -  const friendSearch = document.querySelector("#friendSearch"); -  friendSearch.innerHTML = ""; -  fetch(FRIENDS_URL) -    .then((response) => response.json()) -    .then((response) => { -      const blueprint = document.querySelector("#friendSearchBlueprint"); - -      // Only show friends with a matching name -      const friends = response.filter((obj) => obj.name.toLowerCase().indexOf(searchPattern) != -1); - -      friends.forEach((friend) => { -        const copy = blueprint.cloneNode(true); -        copy.removeAttribute("id"); -        copy.querySelector(".friend-name").textContent = friend.name; -        copy.querySelector("button").addEventListener("click", (event) => { -          const button = event.target.closest("button"); -          button.parentNode.parentNode.removeChild(button.parentNode); - -          const added = document.querySelector("#friendAddedBlueprint").cloneNode(true); -          added.removeAttribute("id"); -          added.querySelector(".friend-name").textContent = friend.name; -          added.querySelector("input").value = friend.id; -          added.querySelector("input").removeAttribute("disabled"); -          added.querySelector("button").addEventListener("click", removeFriendClicked); -          document.querySelector('#taggedFriends').appendChild(added); +    const searchPattern = document.querySelector("#friendSearchQuery"). +        value.toLowerCase(); +    const friendSearch = document.querySelector("#friendSearch"); +    friendSearch.innerHTML = ""; +    fetch(FRIENDS_URL) +        .then((response) => response.json()) +        .then((response) => { +        const blueprint = document.querySelector("#friendSearchBlueprint"); +        // Only show friends with a matching name +        const friends = response.filter((obj) => obj.name.toLowerCase().indexOf(searchPattern) != -1); +        friends.forEach((friend) => { +            var _a; +            const copy = blueprint.cloneNode(true); +            copy.removeAttribute("id"); +            copy.querySelector(".friend-name").textContent = friend.name; +            (_a = copy.querySelector("button")) === null || _a === void 0 ? void 0 : _a.addEventListener("click", (event) => { +                const button = event.target.closest("button"); +                button.parentNode.parentNode.removeChild(button.parentNode); +                const added = document.querySelector("#friendAddedBlueprint"). +                    cloneNode(true); +                added.removeAttribute("id"); +                added.querySelector(".friend-name"). +                    textContent = friend.name; +                added.querySelector("input").value = friend.id.toString(); +                added.querySelector("input").removeAttribute("disabled"); +                added.querySelector("button").addEventListener("click", removeFriendClicked); +                document.querySelector('#taggedFriends').appendChild(added); +            }); +            friendSearch.appendChild(copy);          }); -        friendSearch.appendChild(copy); -      });      });  } -  addHandler("#add-friend-btn", "click", () => searchFriends());  // Also trigger the search on Enter keypress  addHandler("#friendSearchQuery", "keypress", (event) => { -  if (event.keyCode == 13) { -    event.preventDefault(); -    searchFriends(); -  } +    if (event.code == "Enter") { +        event.preventDefault(); +        searchFriends(); +    }  }); -  /**   * Handler for when a "Remove friend" button is clicked.   *   * @param event - The triggering event.   */  function removeFriendClicked(event) { -  const button = event.target.closest("button"); -  button.parentNode.parentNode.removeChild(button.parentNode); +    const button = event.target.closest("button"); +    button.parentNode.parentNode.removeChild(button.parentNode);  } -  addHandler(".remove-friend-button", "click", removeFriendClicked); -  /**   * Handler for when the image input is changed.   * @@ -176,141 +168,127 @@ addHandler(".remove-friend-button", "click", removeFriendClicked);   * @param event - The triggering event.   */  function imageSelectorChanged(event) { -  for (const file of event.target.files) { -    window.fietsboekImageIndex++; - -    const input = document.createElement("input"); -    input.type = "file"; -    input.hidden = true; -    input.name = `image[${window.fietsboekImageIndex}]`; - -    const transfer = new DataTransfer(); -    transfer.items.add(file); -    input.files = transfer.files; - -    const preview = document.querySelector("#trackImagePreviewBlueprint").cloneNode(true); -    preview.removeAttribute("id"); -    preview.querySelector("img").src = URL.createObjectURL(file); -    preview.querySelector("button.delete-image"). -      addEventListener("click", deleteImageButtonClicked); -    preview.querySelector("button.edit-image-description"). -      addEventListener("click", editImageDescriptionClicked); -    preview.querySelector("input.image-description-input"). -      name = `image-description[${window.fietsboekImageIndex}]`; -    preview.appendChild(input); - -    document.querySelector("#trackImageList").appendChild(preview); -  } - -  event.target.value = ""; +    var _a; +    console.log(event); +    const target = event.target; +    for (const file of Array.from((_a = target.files) !== null && _a !== void 0 ? _a : [])) { +        window.fietsboekImageIndex++; +        const input = document.createElement("input"); +        input.type = "file"; +        input.hidden = true; +        input.name = `image[${window.fietsboekImageIndex}]`; +        const transfer = new DataTransfer(); +        transfer.items.add(file); +        input.files = transfer.files; +        const preview = document.querySelector("#trackImagePreviewBlueprint"). +            cloneNode(true); +        preview.removeAttribute("id"); +        preview.querySelector("img").src = URL.createObjectURL(file); +        preview.querySelector("button.delete-image"). +            addEventListener("click", deleteImageButtonClicked); +        preview.querySelector("button.edit-image-description"). +            addEventListener("click", editImageDescriptionClicked); +        preview.querySelector("input.image-description-input"). +            name = `image-description[${window.fietsboekImageIndex}]`; +        preview.appendChild(input); +        document.querySelector("#trackImageList").appendChild(preview); +    } +    target.value = "";  } -  addHandler("#imageSelector", "change", imageSelectorChanged); -  /**   * Handler to remove a picture from a track.   *   * @param event - The triggering event.   */  function deleteImageButtonClicked(event) { -  const preview = event.target.closest("div.track-image-preview"); -  /* If this was a image yet to be uploaded, simply remove it */ -  const input = preview.querySelector("input[type=file]"); -  if (input) { +    const preview = event.target.closest("div.track-image-preview"); +    /* If this was a image yet to be uploaded, simply remove it */ +    const input = preview.querySelector("input[type=file]"); +    if (input) { +        preview.parentNode.removeChild(preview); +        return; +    } +    /* Otherwise, we need to remove it but also insert a "delete-image" input */ +    const deleter = preview.querySelector("input.image-deleter-input"); +    deleter.removeAttribute("disabled"); +    preview.removeChild(deleter); +    preview.parentNode.appendChild(deleter);      preview.parentNode.removeChild(preview); -    return; -  } - -  /* Otherwise, we need to remove it but also insert a "delete-image" input */ -  const deleter = preview.querySelector("input.image-deleter-input"); -  deleter.removeAttribute("disabled"); -  preview.removeChild(deleter); -  preview.parentNode.appendChild(deleter); -  preview.parentNode.removeChild(preview);  } -  addHandler("button.delete-image", "click", deleteImageButtonClicked); -  /**   * Handler to show the image description editor.   *   * @param event - The triggering event.   */  function editImageDescriptionClicked(event) { -  window.fietsboekCurrentImage = event.target.closest("div"); - -  const currentDescription = event.target. -    closest("div").querySelector("input.image-description-input").value; -  const modalDom = document.getElementById("imageDescriptionModal"); -  modalDom.querySelector("textarea").value = currentDescription; - -  const modal = bootstrap.Modal.getOrCreateInstance(modalDom, {}); -  modal.show(); +    window.fietsboekCurrentImage = event.target.closest("div"); +    const imageInput = window.fietsboekCurrentImage.querySelector("input.image-description-input"); +    const currentDescription = imageInput.value; +    const modalDom = document.getElementById("imageDescriptionModal"); +    modalDom.querySelector("textarea").value = currentDescription; +    const modal = bootstrap.Modal.getOrCreateInstance(modalDom, {}); +    modal.show();  } -  addHandler("button.edit-image-description", "click", editImageDescriptionClicked); -  /**   * Handler to save the image description of the currently edited image.   *   * @param event - The triggering event.   */ -function saveImageDescriptionClicked(event) { -  const modalDom = document.getElementById("imageDescriptionModal"); -  const wantedDescription = modalDom.querySelector("textarea").value; -  window.fietsboekCurrentImage. -    querySelector("input.image-description-input").value = wantedDescription; -  window.fietsboekCurrentImage. -    querySelector("img").title = wantedDescription; - -  const modal = bootstrap.Modal.getOrCreateInstance(modalDom, {}); -  modal.hide(); - -  window.fietsboekCurrentImage = undefined; +function saveImageDescriptionClicked(_event) { +    const modalDom = document.getElementById("imageDescriptionModal"); +    const wantedDescription = modalDom.querySelector("textarea").value; +    window.fietsboekCurrentImage. +        querySelector("input.image-description-input"). +        value = wantedDescription; +    window.fietsboekCurrentImage. +        querySelector("img").title = wantedDescription; +    const modal = bootstrap.Modal.getOrCreateInstance(modalDom, {}); +    modal.hide(); +    window.fietsboekCurrentImage = null;  } -  addHandler("#imageDescriptionModal button.btn-success", "click", saveImageDescriptionClicked); -  /**   * Handler to toggle (collapse/expand) the yearly/monthly summary.   *   * @param event - The triggering event.   */  function toggleSummary(event) { -  const chevron = event.target; -  const containing = chevron.closest("a"); -  const summary = containing.nextElementSibling; -  bootstrap.Collapse.getOrCreateInstance(summary).toggle(); -  if (chevron.classList.contains("bi-chevron-down")) { -    chevron.classList.remove("bi-chevron-down"); -    chevron.classList.add("bi-chevron-right"); -  } else { -    chevron.classList.remove("bi-chevron-right"); -    chevron.classList.add("bi-chevron-down"); -  } +    const chevron = event.target; +    const containing = chevron.closest("a"); +    const summary = containing.nextElementSibling; +    bootstrap.Collapse.getOrCreateInstance(summary).toggle(); +    if (chevron.classList.contains("bi-chevron-down")) { +        chevron.classList.remove("bi-chevron-down"); +        chevron.classList.add("bi-chevron-right"); +    } +    else { +        chevron.classList.remove("bi-chevron-right"); +        chevron.classList.add("bi-chevron-down"); +    }  } -  addHandler(".summary-toggler", "click", toggleSummary); -  /*   * Handler to enable the "Download archive button" ...   */  addHandler("#archiveDownloadButton", "click", () => { -  const checked = document.querySelectorAll(".archive-checkbox:checked"); -  const url = new URL("/track/archive", window.location); -  checked.forEach((c) => { -    url.searchParams.append("track_id[]", c.value); -  }); -  window.location.assign(url); +    const checked = document.querySelectorAll(".archive-checkbox:checked"); +    const url = new URL("/track/archive", window.location.href); +    checked.forEach((c) => { +        url.searchParams.append("track_id[]", c.value); +    }); +    window.location.assign(url);  });  /*   * ... and the listeners on the checkboxes to disable and enable the button.   */  addHandler(".archive-checkbox", "change", () => { -  const checked = document.querySelectorAll(".archive-checkbox:checked"); -  document.querySelector("#archiveDownloadButton").disabled = (checked.length == 0); +    const checked = document.querySelectorAll(".archive-checkbox:checked"); +    const downloadButton = document.querySelector("#archiveDownloadButton"); +    downloadButton.disabled = (checked.length == 0);  }); -  /**   * Handler to clear the input when a .button-clear-input is pressed.   * @@ -319,40 +297,40 @@ addHandler(".archive-checkbox", "change", () => {   * @param event - The triggering event.   */  function clearInputButtonClicked(event) { -  event.target.closest(".input-group").querySelectorAll("input").forEach((i) => i.value = ""); -  event.target.closest(".input-group").querySelectorAll("select").forEach((i) => i.value = ""); +    const target = event.target; +    target.closest(".input-group").querySelectorAll("input").forEach((i) => i.value = ""); +    target.closest(".input-group").querySelectorAll("select").forEach((i) => i.value = "");  } -  addHandler(".button-clear-input", "click", clearInputButtonClicked); - - -document.addEventListener('DOMContentLoaded', function() { -  window.fietsboekImageIndex = 0; - -  /* Enable tooltips */ -  const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); -  tooltipTriggerList.map((tooltipTriggerEl) => { -    return new bootstrap.Tooltip(tooltipTriggerEl, {sanitize: false}); -  }); - -  /* Enable Bootstrap form validation */ -  const forms = document.querySelectorAll('.needs-validation'); -  Array.from(forms).forEach((form) => { -    form.addEventListener('submit', (event) => { -      if (!form.checkValidity()) { -        event.preventDefault(); -        event.stopPropagation(); -      } - -      form.classList.add('was-validated'); -    }, false); -  }); - -  /* Format all datetimes to the local timezone */ -  document.querySelectorAll(".fietsboek-local-datetime").forEach((obj) => { -    const timestamp = obj.attributes["data-utc-timestamp"].value; -    const date = new Date(timestamp * 1000); -    const intl = new Intl.DateTimeFormat(LOCALE, {dateStyle: "medium", timeStyle: "medium"}); -    obj.innerHTML = intl.format(date); -  }); +document.addEventListener('DOMContentLoaded', function () { +    window.fietsboekImageIndex = 0; +    /* Enable tooltips */ +    const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); +    tooltipTriggerList.map((tooltipTriggerEl) => { +        return new bootstrap.Tooltip(tooltipTriggerEl, { sanitize: false }); +    }); +    /* Enable Bootstrap form validation */ +    const forms = document.querySelectorAll('.needs-validation'); +    Array.from(forms).forEach((form) => { +        form.addEventListener('submit', (event) => { +            if (!form.checkValidity()) { +                event.preventDefault(); +                event.stopPropagation(); +            } +            form.classList.add('was-validated'); +        }, false); +    }); +    /* Format all datetimes to the local timezone */ +    document.querySelectorAll(".fietsboek-local-datetime").forEach((obj) => { +        const timestamp = parseFloat(obj.attributes.getNamedItem("data-utc-timestamp").value); +        const date = new Date(timestamp * 1000); +        // TypeScript complains about this, but according to MDN it is fine, at +        // least in "somewhat modern" browsers +        const intl = new Intl.DateTimeFormat(LOCALE, { +            dateStyle: "medium", +            timeStyle: "medium", +        }); +        obj.innerHTML = intl.format(date); +    });  }); +//# sourceMappingURL=fietsboek.js.map
\ No newline at end of file diff --git a/fietsboek/static/fietsboek.js.map b/fietsboek/static/fietsboek.js.map new file mode 100644 index 0000000..c9fd5b5 --- /dev/null +++ b/fietsboek/static/fietsboek.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fietsboek.js","sourceRoot":"","sources":["../../asset-sources/fietsboek.ts"],"names":[],"mappings":"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"}
\ No newline at end of file @@ -72,3 +72,7 @@ copy-npm-assets:  # Compile the sass assets  compile-sass:      npx sass asset-sources/theme.scss fietsboek/static/theme.css + +# Compile the TypeScript files +compile-typescript: +    npx tsc diff --git a/package-lock.json b/package-lock.json index 1118db1..f8fe7d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,21 +5,407 @@    "packages": {      "": {        "dependencies": { +        "@types/bootstrap": "^5.2.6", +        "@types/leaflet": "^1.9.3", +        "@typescript-eslint/eslint-plugin": "^5.56.0", +        "@typescript-eslint/parser": "^5.56.0",          "bootstrap": "^5.2.3",          "bootstrap-icons": "^1.10.3", -        "sass": "^1.59.3" +        "eslint": "^8.36.0", +        "sass": "^1.59.3", +        "typescript": "^5.0.2" +      } +    }, +    "node_modules/@eslint-community/eslint-utils": { +      "version": "4.4.0", +      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", +      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", +      "dependencies": { +        "eslint-visitor-keys": "^3.3.0" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "peerDependencies": { +        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" +      } +    }, +    "node_modules/@eslint-community/regexpp": { +      "version": "4.4.1", +      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", +      "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", +      "engines": { +        "node": "^12.0.0 || ^14.0.0 || >=16.0.0" +      } +    }, +    "node_modules/@eslint/eslintrc": { +      "version": "2.0.1", +      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", +      "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", +      "dependencies": { +        "ajv": "^6.12.4", +        "debug": "^4.3.2", +        "espree": "^9.5.0", +        "globals": "^13.19.0", +        "ignore": "^5.2.0", +        "import-fresh": "^3.2.1", +        "js-yaml": "^4.1.0", +        "minimatch": "^3.1.2", +        "strip-json-comments": "^3.1.1" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "url": "https://opencollective.com/eslint" +      } +    }, +    "node_modules/@eslint/js": { +      "version": "8.36.0", +      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", +      "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      } +    }, +    "node_modules/@humanwhocodes/config-array": { +      "version": "0.11.8", +      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", +      "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", +      "dependencies": { +        "@humanwhocodes/object-schema": "^1.2.1", +        "debug": "^4.1.1", +        "minimatch": "^3.0.5" +      }, +      "engines": { +        "node": ">=10.10.0" +      } +    }, +    "node_modules/@humanwhocodes/module-importer": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", +      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", +      "engines": { +        "node": ">=12.22" +      }, +      "funding": { +        "type": "github", +        "url": "https://github.com/sponsors/nzakas" +      } +    }, +    "node_modules/@humanwhocodes/object-schema": { +      "version": "1.2.1", +      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", +      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" +    }, +    "node_modules/@nodelib/fs.scandir": { +      "version": "2.1.5", +      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", +      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", +      "dependencies": { +        "@nodelib/fs.stat": "2.0.5", +        "run-parallel": "^1.1.9" +      }, +      "engines": { +        "node": ">= 8" +      } +    }, +    "node_modules/@nodelib/fs.stat": { +      "version": "2.0.5", +      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", +      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", +      "engines": { +        "node": ">= 8" +      } +    }, +    "node_modules/@nodelib/fs.walk": { +      "version": "1.2.8", +      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", +      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", +      "dependencies": { +        "@nodelib/fs.scandir": "2.1.5", +        "fastq": "^1.6.0" +      }, +      "engines": { +        "node": ">= 8"        }      },      "node_modules/@popperjs/core": {        "version": "2.11.6",        "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",        "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", -      "peer": true,        "funding": {          "type": "opencollective",          "url": "https://opencollective.com/popperjs"        }      }, +    "node_modules/@types/bootstrap": { +      "version": "5.2.6", +      "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.6.tgz", +      "integrity": "sha512-BlAc3YATdasbHoxMoBWODrSF6qwQO/E9X8wVxCCSa6rWjnaZfpkr2N6pUMCY6jj2+wf0muUtLySbvU9etX6YqA==", +      "dependencies": { +        "@popperjs/core": "^2.9.2" +      } +    }, +    "node_modules/@types/geojson": { +      "version": "7946.0.10", +      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", +      "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" +    }, +    "node_modules/@types/json-schema": { +      "version": "7.0.11", +      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", +      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" +    }, +    "node_modules/@types/leaflet": { +      "version": "1.9.3", +      "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.3.tgz", +      "integrity": "sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==", +      "dependencies": { +        "@types/geojson": "*" +      } +    }, +    "node_modules/@types/semver": { +      "version": "7.3.13", +      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", +      "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" +    }, +    "node_modules/@typescript-eslint/eslint-plugin": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", +      "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", +      "dependencies": { +        "@eslint-community/regexpp": "^4.4.0", +        "@typescript-eslint/scope-manager": "5.56.0", +        "@typescript-eslint/type-utils": "5.56.0", +        "@typescript-eslint/utils": "5.56.0", +        "debug": "^4.3.4", +        "grapheme-splitter": "^1.0.4", +        "ignore": "^5.2.0", +        "natural-compare-lite": "^1.4.0", +        "semver": "^7.3.7", +        "tsutils": "^3.21.0" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/typescript-eslint" +      }, +      "peerDependencies": { +        "@typescript-eslint/parser": "^5.0.0", +        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" +      }, +      "peerDependenciesMeta": { +        "typescript": { +          "optional": true +        } +      } +    }, +    "node_modules/@typescript-eslint/parser": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", +      "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", +      "dependencies": { +        "@typescript-eslint/scope-manager": "5.56.0", +        "@typescript-eslint/types": "5.56.0", +        "@typescript-eslint/typescript-estree": "5.56.0", +        "debug": "^4.3.4" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/typescript-eslint" +      }, +      "peerDependencies": { +        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" +      }, +      "peerDependenciesMeta": { +        "typescript": { +          "optional": true +        } +      } +    }, +    "node_modules/@typescript-eslint/scope-manager": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", +      "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", +      "dependencies": { +        "@typescript-eslint/types": "5.56.0", +        "@typescript-eslint/visitor-keys": "5.56.0" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/typescript-eslint" +      } +    }, +    "node_modules/@typescript-eslint/type-utils": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", +      "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", +      "dependencies": { +        "@typescript-eslint/typescript-estree": "5.56.0", +        "@typescript-eslint/utils": "5.56.0", +        "debug": "^4.3.4", +        "tsutils": "^3.21.0" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/typescript-eslint" +      }, +      "peerDependencies": { +        "eslint": "*" +      }, +      "peerDependenciesMeta": { +        "typescript": { +          "optional": true +        } +      } +    }, +    "node_modules/@typescript-eslint/types": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", +      "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/typescript-eslint" +      } +    }, +    "node_modules/@typescript-eslint/typescript-estree": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", +      "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", +      "dependencies": { +        "@typescript-eslint/types": "5.56.0", +        "@typescript-eslint/visitor-keys": "5.56.0", +        "debug": "^4.3.4", +        "globby": "^11.1.0", +        "is-glob": "^4.0.3", +        "semver": "^7.3.7", +        "tsutils": "^3.21.0" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/typescript-eslint" +      }, +      "peerDependenciesMeta": { +        "typescript": { +          "optional": true +        } +      } +    }, +    "node_modules/@typescript-eslint/utils": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", +      "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", +      "dependencies": { +        "@eslint-community/eslint-utils": "^4.2.0", +        "@types/json-schema": "^7.0.9", +        "@types/semver": "^7.3.12", +        "@typescript-eslint/scope-manager": "5.56.0", +        "@typescript-eslint/types": "5.56.0", +        "@typescript-eslint/typescript-estree": "5.56.0", +        "eslint-scope": "^5.1.1", +        "semver": "^7.3.7" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/typescript-eslint" +      }, +      "peerDependencies": { +        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" +      } +    }, +    "node_modules/@typescript-eslint/visitor-keys": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", +      "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", +      "dependencies": { +        "@typescript-eslint/types": "5.56.0", +        "eslint-visitor-keys": "^3.3.0" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/typescript-eslint" +      } +    }, +    "node_modules/acorn": { +      "version": "8.8.2", +      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", +      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", +      "bin": { +        "acorn": "bin/acorn" +      }, +      "engines": { +        "node": ">=0.4.0" +      } +    }, +    "node_modules/acorn-jsx": { +      "version": "5.3.2", +      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", +      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", +      "peerDependencies": { +        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" +      } +    }, +    "node_modules/ajv": { +      "version": "6.12.6", +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", +      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", +      "dependencies": { +        "fast-deep-equal": "^3.1.1", +        "fast-json-stable-stringify": "^2.0.0", +        "json-schema-traverse": "^0.4.1", +        "uri-js": "^4.2.2" +      }, +      "funding": { +        "type": "github", +        "url": "https://github.com/sponsors/epoberezkin" +      } +    }, +    "node_modules/ansi-regex": { +      "version": "5.0.1", +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", +      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/ansi-styles": { +      "version": "4.3.0", +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", +      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", +      "dependencies": { +        "color-convert": "^2.0.1" +      }, +      "engines": { +        "node": ">=8" +      }, +      "funding": { +        "url": "https://github.com/chalk/ansi-styles?sponsor=1" +      } +    },      "node_modules/anymatch": {        "version": "3.1.3",        "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -32,6 +418,24 @@          "node": ">= 8"        }      }, +    "node_modules/argparse": { +      "version": "2.0.1", +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", +      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" +    }, +    "node_modules/array-union": { +      "version": "2.1.0", +      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", +      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", +      "engines": { +        "node": ">=8" +      } +    }, +    "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==" +    },      "node_modules/binary-extensions": {        "version": "2.2.0",        "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -63,6 +467,15 @@        "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz",        "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw=="      }, +    "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==", +      "dependencies": { +        "balanced-match": "^1.0.0", +        "concat-map": "0.0.1" +      } +    },      "node_modules/braces": {        "version": "3.0.2",        "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -74,6 +487,29 @@          "node": ">=8"        }      }, +    "node_modules/callsites": { +      "version": "3.1.0", +      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", +      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", +      "engines": { +        "node": ">=6" +      } +    }, +    "node_modules/chalk": { +      "version": "4.1.2", +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", +      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", +      "dependencies": { +        "ansi-styles": "^4.1.0", +        "supports-color": "^7.1.0" +      }, +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/chalk/chalk?sponsor=1" +      } +    },      "node_modules/chokidar": {        "version": "3.5.3",        "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -100,6 +536,320 @@          "fsevents": "~2.3.2"        }      }, +    "node_modules/color-convert": { +      "version": "2.0.1", +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", +      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", +      "dependencies": { +        "color-name": "~1.1.4" +      }, +      "engines": { +        "node": ">=7.0.0" +      } +    }, +    "node_modules/color-name": { +      "version": "1.1.4", +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", +      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" +    }, +    "node_modules/concat-map": { +      "version": "0.0.1", +      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", +      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" +    }, +    "node_modules/cross-spawn": { +      "version": "7.0.3", +      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", +      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", +      "dependencies": { +        "path-key": "^3.1.0", +        "shebang-command": "^2.0.0", +        "which": "^2.0.1" +      }, +      "engines": { +        "node": ">= 8" +      } +    }, +    "node_modules/debug": { +      "version": "4.3.4", +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", +      "dependencies": { +        "ms": "2.1.2" +      }, +      "engines": { +        "node": ">=6.0" +      }, +      "peerDependenciesMeta": { +        "supports-color": { +          "optional": true +        } +      } +    }, +    "node_modules/deep-is": { +      "version": "0.1.4", +      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", +      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" +    }, +    "node_modules/dir-glob": { +      "version": "3.0.1", +      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", +      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", +      "dependencies": { +        "path-type": "^4.0.0" +      }, +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/doctrine": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", +      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", +      "dependencies": { +        "esutils": "^2.0.2" +      }, +      "engines": { +        "node": ">=6.0.0" +      } +    }, +    "node_modules/escape-string-regexp": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", +      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/eslint": { +      "version": "8.36.0", +      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", +      "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", +      "dependencies": { +        "@eslint-community/eslint-utils": "^4.2.0", +        "@eslint-community/regexpp": "^4.4.0", +        "@eslint/eslintrc": "^2.0.1", +        "@eslint/js": "8.36.0", +        "@humanwhocodes/config-array": "^0.11.8", +        "@humanwhocodes/module-importer": "^1.0.1", +        "@nodelib/fs.walk": "^1.2.8", +        "ajv": "^6.10.0", +        "chalk": "^4.0.0", +        "cross-spawn": "^7.0.2", +        "debug": "^4.3.2", +        "doctrine": "^3.0.0", +        "escape-string-regexp": "^4.0.0", +        "eslint-scope": "^7.1.1", +        "eslint-visitor-keys": "^3.3.0", +        "espree": "^9.5.0", +        "esquery": "^1.4.2", +        "esutils": "^2.0.2", +        "fast-deep-equal": "^3.1.3", +        "file-entry-cache": "^6.0.1", +        "find-up": "^5.0.0", +        "glob-parent": "^6.0.2", +        "globals": "^13.19.0", +        "grapheme-splitter": "^1.0.4", +        "ignore": "^5.2.0", +        "import-fresh": "^3.0.0", +        "imurmurhash": "^0.1.4", +        "is-glob": "^4.0.0", +        "is-path-inside": "^3.0.3", +        "js-sdsl": "^4.1.4", +        "js-yaml": "^4.1.0", +        "json-stable-stringify-without-jsonify": "^1.0.1", +        "levn": "^0.4.1", +        "lodash.merge": "^4.6.2", +        "minimatch": "^3.1.2", +        "natural-compare": "^1.4.0", +        "optionator": "^0.9.1", +        "strip-ansi": "^6.0.1", +        "strip-json-comments": "^3.1.0", +        "text-table": "^0.2.0" +      }, +      "bin": { +        "eslint": "bin/eslint.js" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "url": "https://opencollective.com/eslint" +      } +    }, +    "node_modules/eslint-scope": { +      "version": "5.1.1", +      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", +      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", +      "dependencies": { +        "esrecurse": "^4.3.0", +        "estraverse": "^4.1.1" +      }, +      "engines": { +        "node": ">=8.0.0" +      } +    }, +    "node_modules/eslint-visitor-keys": { +      "version": "3.3.0", +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", +      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      } +    }, +    "node_modules/eslint/node_modules/eslint-scope": { +      "version": "7.1.1", +      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", +      "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", +      "dependencies": { +        "esrecurse": "^4.3.0", +        "estraverse": "^5.2.0" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      } +    }, +    "node_modules/eslint/node_modules/estraverse": { +      "version": "5.3.0", +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", +      "engines": { +        "node": ">=4.0" +      } +    }, +    "node_modules/eslint/node_modules/glob-parent": { +      "version": "6.0.2", +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", +      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", +      "dependencies": { +        "is-glob": "^4.0.3" +      }, +      "engines": { +        "node": ">=10.13.0" +      } +    }, +    "node_modules/espree": { +      "version": "9.5.0", +      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", +      "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", +      "dependencies": { +        "acorn": "^8.8.0", +        "acorn-jsx": "^5.3.2", +        "eslint-visitor-keys": "^3.3.0" +      }, +      "engines": { +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0" +      }, +      "funding": { +        "url": "https://opencollective.com/eslint" +      } +    }, +    "node_modules/esquery": { +      "version": "1.5.0", +      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", +      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", +      "dependencies": { +        "estraverse": "^5.1.0" +      }, +      "engines": { +        "node": ">=0.10" +      } +    }, +    "node_modules/esquery/node_modules/estraverse": { +      "version": "5.3.0", +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", +      "engines": { +        "node": ">=4.0" +      } +    }, +    "node_modules/esrecurse": { +      "version": "4.3.0", +      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", +      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", +      "dependencies": { +        "estraverse": "^5.2.0" +      }, +      "engines": { +        "node": ">=4.0" +      } +    }, +    "node_modules/esrecurse/node_modules/estraverse": { +      "version": "5.3.0", +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", +      "engines": { +        "node": ">=4.0" +      } +    }, +    "node_modules/estraverse": { +      "version": "4.3.0", +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", +      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", +      "engines": { +        "node": ">=4.0" +      } +    }, +    "node_modules/esutils": { +      "version": "2.0.3", +      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", +      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/fast-deep-equal": { +      "version": "3.1.3", +      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", +      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" +    }, +    "node_modules/fast-glob": { +      "version": "3.2.12", +      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", +      "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", +      "dependencies": { +        "@nodelib/fs.stat": "^2.0.2", +        "@nodelib/fs.walk": "^1.2.3", +        "glob-parent": "^5.1.2", +        "merge2": "^1.3.0", +        "micromatch": "^4.0.4" +      }, +      "engines": { +        "node": ">=8.6.0" +      } +    }, +    "node_modules/fast-json-stable-stringify": { +      "version": "2.1.0", +      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", +      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" +    }, +    "node_modules/fast-levenshtein": { +      "version": "2.0.6", +      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", +      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" +    }, +    "node_modules/fastq": { +      "version": "1.15.0", +      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", +      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", +      "dependencies": { +        "reusify": "^1.0.4" +      } +    }, +    "node_modules/file-entry-cache": { +      "version": "6.0.1", +      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", +      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", +      "dependencies": { +        "flat-cache": "^3.0.4" +      }, +      "engines": { +        "node": "^10.12.0 || >=12.0.0" +      } +    },      "node_modules/fill-range": {        "version": "7.0.1",        "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -111,6 +861,43 @@          "node": ">=8"        }      }, +    "node_modules/find-up": { +      "version": "5.0.0", +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", +      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", +      "dependencies": { +        "locate-path": "^6.0.0", +        "path-exists": "^4.0.0" +      }, +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/flat-cache": { +      "version": "3.0.4", +      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", +      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", +      "dependencies": { +        "flatted": "^3.1.0", +        "rimraf": "^3.0.2" +      }, +      "engines": { +        "node": "^10.12.0 || >=12.0.0" +      } +    }, +    "node_modules/flatted": { +      "version": "3.2.7", +      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", +      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" +    }, +    "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==" +    },      "node_modules/fsevents": {        "version": "2.3.2",        "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -124,6 +911,25 @@          "node": "^8.16.0 || ^10.6.0 || >=11.0.0"        }      }, +    "node_modules/glob": { +      "version": "7.2.3", +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", +      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", +      "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/glob-parent": {        "version": "5.1.2",        "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -135,11 +941,102 @@          "node": ">= 6"        }      }, +    "node_modules/globals": { +      "version": "13.20.0", +      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", +      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", +      "dependencies": { +        "type-fest": "^0.20.2" +      }, +      "engines": { +        "node": ">=8" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/globby": { +      "version": "11.1.0", +      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", +      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", +      "dependencies": { +        "array-union": "^2.1.0", +        "dir-glob": "^3.0.1", +        "fast-glob": "^3.2.9", +        "ignore": "^5.2.0", +        "merge2": "^1.4.1", +        "slash": "^3.0.0" +      }, +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/grapheme-splitter": { +      "version": "1.0.4", +      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", +      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" +    }, +    "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==", +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/ignore": { +      "version": "5.2.4", +      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", +      "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", +      "engines": { +        "node": ">= 4" +      } +    },      "node_modules/immutable": {        "version": "4.3.0",        "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz",        "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg=="      }, +    "node_modules/import-fresh": { +      "version": "3.3.0", +      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", +      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", +      "dependencies": { +        "parent-module": "^1.0.0", +        "resolve-from": "^4.0.0" +      }, +      "engines": { +        "node": ">=6" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/imurmurhash": { +      "version": "0.1.4", +      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", +      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", +      "engines": { +        "node": ">=0.8.19" +      } +    }, +    "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==", +      "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==" +    },      "node_modules/is-binary-path": {        "version": "2.1.0",        "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -178,6 +1075,137 @@          "node": ">=0.12.0"        }      }, +    "node_modules/is-path-inside": { +      "version": "3.0.3", +      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", +      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/isexe": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", +      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" +    }, +    "node_modules/js-sdsl": { +      "version": "4.4.0", +      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", +      "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/js-sdsl" +      } +    }, +    "node_modules/js-yaml": { +      "version": "4.1.0", +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", +      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", +      "dependencies": { +        "argparse": "^2.0.1" +      }, +      "bin": { +        "js-yaml": "bin/js-yaml.js" +      } +    }, +    "node_modules/json-schema-traverse": { +      "version": "0.4.1", +      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", +      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" +    }, +    "node_modules/json-stable-stringify-without-jsonify": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", +      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" +    }, +    "node_modules/levn": { +      "version": "0.4.1", +      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", +      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", +      "dependencies": { +        "prelude-ls": "^1.2.1", +        "type-check": "~0.4.0" +      }, +      "engines": { +        "node": ">= 0.8.0" +      } +    }, +    "node_modules/locate-path": { +      "version": "6.0.0", +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", +      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", +      "dependencies": { +        "p-locate": "^5.0.0" +      }, +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/lodash.merge": { +      "version": "4.6.2", +      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", +      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" +    }, +    "node_modules/lru-cache": { +      "version": "6.0.0", +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", +      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", +      "dependencies": { +        "yallist": "^4.0.0" +      }, +      "engines": { +        "node": ">=10" +      } +    }, +    "node_modules/merge2": { +      "version": "1.4.1", +      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", +      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", +      "engines": { +        "node": ">= 8" +      } +    }, +    "node_modules/micromatch": { +      "version": "4.0.5", +      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", +      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", +      "dependencies": { +        "braces": "^3.0.2", +        "picomatch": "^2.3.1" +      }, +      "engines": { +        "node": ">=8.6" +      } +    }, +    "node_modules/minimatch": { +      "version": "3.1.2", +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", +      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", +      "dependencies": { +        "brace-expansion": "^1.1.7" +      }, +      "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==" +    }, +    "node_modules/natural-compare": { +      "version": "1.4.0", +      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", +      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" +    }, +    "node_modules/natural-compare-lite": { +      "version": "1.4.0", +      "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", +      "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" +    },      "node_modules/normalize-path": {        "version": "3.0.0",        "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -186,6 +1214,101 @@          "node": ">=0.10.0"        }      }, +    "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==", +      "dependencies": { +        "wrappy": "1" +      } +    }, +    "node_modules/optionator": { +      "version": "0.9.1", +      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", +      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", +      "dependencies": { +        "deep-is": "^0.1.3", +        "fast-levenshtein": "^2.0.6", +        "levn": "^0.4.1", +        "prelude-ls": "^1.2.1", +        "type-check": "^0.4.0", +        "word-wrap": "^1.2.3" +      }, +      "engines": { +        "node": ">= 0.8.0" +      } +    }, +    "node_modules/p-limit": { +      "version": "3.1.0", +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", +      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", +      "dependencies": { +        "yocto-queue": "^0.1.0" +      }, +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/p-locate": { +      "version": "5.0.0", +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", +      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", +      "dependencies": { +        "p-limit": "^3.0.2" +      }, +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/parent-module": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", +      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", +      "dependencies": { +        "callsites": "^3.0.0" +      }, +      "engines": { +        "node": ">=6" +      } +    }, +    "node_modules/path-exists": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", +      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", +      "engines": { +        "node": ">=8" +      } +    }, +    "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==", +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/path-key": { +      "version": "3.1.1", +      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", +      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/path-type": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", +      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", +      "engines": { +        "node": ">=8" +      } +    },      "node_modules/picomatch": {        "version": "2.3.1",        "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -197,6 +1320,41 @@          "url": "https://github.com/sponsors/jonschlinkert"        }      }, +    "node_modules/prelude-ls": { +      "version": "1.2.1", +      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", +      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", +      "engines": { +        "node": ">= 0.8.0" +      } +    }, +    "node_modules/punycode": { +      "version": "2.3.0", +      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", +      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", +      "engines": { +        "node": ">=6" +      } +    }, +    "node_modules/queue-microtask": { +      "version": "1.2.3", +      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", +      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", +      "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/readdirp": {        "version": "3.6.0",        "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -208,6 +1366,59 @@          "node": ">=8.10.0"        }      }, +    "node_modules/resolve-from": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", +      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", +      "engines": { +        "node": ">=4" +      } +    }, +    "node_modules/reusify": { +      "version": "1.0.4", +      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", +      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", +      "engines": { +        "iojs": ">=1.0.0", +        "node": ">=0.10.0" +      } +    }, +    "node_modules/rimraf": { +      "version": "3.0.2", +      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", +      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", +      "dependencies": { +        "glob": "^7.1.3" +      }, +      "bin": { +        "rimraf": "bin.js" +      }, +      "funding": { +        "url": "https://github.com/sponsors/isaacs" +      } +    }, +    "node_modules/run-parallel": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", +      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", +      "funding": [ +        { +          "type": "github", +          "url": "https://github.com/sponsors/feross" +        }, +        { +          "type": "patreon", +          "url": "https://www.patreon.com/feross" +        }, +        { +          "type": "consulting", +          "url": "https://feross.org/support" +        } +      ], +      "dependencies": { +        "queue-microtask": "^1.2.2" +      } +    },      "node_modules/sass": {        "version": "1.59.3",        "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.3.tgz", @@ -224,6 +1435,47 @@          "node": ">=12.0.0"        }      }, +    "node_modules/semver": { +      "version": "7.3.8", +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", +      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", +      "dependencies": { +        "lru-cache": "^6.0.0" +      }, +      "bin": { +        "semver": "bin/semver.js" +      }, +      "engines": { +        "node": ">=10" +      } +    }, +    "node_modules/shebang-command": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", +      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", +      "dependencies": { +        "shebang-regex": "^3.0.0" +      }, +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/shebang-regex": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", +      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/slash": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", +      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", +      "engines": { +        "node": ">=8" +      } +    },      "node_modules/source-map-js": {        "version": "1.0.2",        "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -232,6 +1484,44 @@          "node": ">=0.10.0"        }      }, +    "node_modules/strip-ansi": { +      "version": "6.0.1", +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", +      "dependencies": { +        "ansi-regex": "^5.0.1" +      }, +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/strip-json-comments": { +      "version": "3.1.1", +      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", +      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", +      "engines": { +        "node": ">=8" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "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==", +      "dependencies": { +        "has-flag": "^4.0.0" +      }, +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/text-table": { +      "version": "0.2.0", +      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", +      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" +    },      "node_modules/to-regex-range": {        "version": "5.0.1",        "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -242,14 +1532,351 @@        "engines": {          "node": ">=8.0"        } +    }, +    "node_modules/tslib": { +      "version": "1.14.1", +      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", +      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" +    }, +    "node_modules/tsutils": { +      "version": "3.21.0", +      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", +      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", +      "dependencies": { +        "tslib": "^1.8.1" +      }, +      "engines": { +        "node": ">= 6" +      }, +      "peerDependencies": { +        "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" +      } +    }, +    "node_modules/type-check": { +      "version": "0.4.0", +      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", +      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", +      "dependencies": { +        "prelude-ls": "^1.2.1" +      }, +      "engines": { +        "node": ">= 0.8.0" +      } +    }, +    "node_modules/type-fest": { +      "version": "0.20.2", +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", +      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      } +    }, +    "node_modules/typescript": { +      "version": "5.0.2", +      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", +      "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", +      "bin": { +        "tsc": "bin/tsc", +        "tsserver": "bin/tsserver" +      }, +      "engines": { +        "node": ">=12.20" +      } +    }, +    "node_modules/uri-js": { +      "version": "4.4.1", +      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", +      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", +      "dependencies": { +        "punycode": "^2.1.0" +      } +    }, +    "node_modules/which": { +      "version": "2.0.2", +      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", +      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", +      "dependencies": { +        "isexe": "^2.0.0" +      }, +      "bin": { +        "node-which": "bin/node-which" +      }, +      "engines": { +        "node": ">= 8" +      } +    }, +    "node_modules/word-wrap": { +      "version": "1.2.3", +      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", +      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", +      "engines": { +        "node": ">=0.10.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==" +    }, +    "node_modules/yallist": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", +      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" +    }, +    "node_modules/yocto-queue": { +      "version": "0.1.0", +      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", +      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", +      "engines": { +        "node": ">=10" +      }, +      "funding": { +        "url": "https://github.com/sponsors/sindresorhus" +      }      }    },    "dependencies": { +    "@eslint-community/eslint-utils": { +      "version": "4.4.0", +      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", +      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", +      "requires": { +        "eslint-visitor-keys": "^3.3.0" +      } +    }, +    "@eslint-community/regexpp": { +      "version": "4.4.1", +      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", +      "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==" +    }, +    "@eslint/eslintrc": { +      "version": "2.0.1", +      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", +      "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", +      "requires": { +        "ajv": "^6.12.4", +        "debug": "^4.3.2", +        "espree": "^9.5.0", +        "globals": "^13.19.0", +        "ignore": "^5.2.0", +        "import-fresh": "^3.2.1", +        "js-yaml": "^4.1.0", +        "minimatch": "^3.1.2", +        "strip-json-comments": "^3.1.1" +      } +    }, +    "@eslint/js": { +      "version": "8.36.0", +      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", +      "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==" +    }, +    "@humanwhocodes/config-array": { +      "version": "0.11.8", +      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", +      "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", +      "requires": { +        "@humanwhocodes/object-schema": "^1.2.1", +        "debug": "^4.1.1", +        "minimatch": "^3.0.5" +      } +    }, +    "@humanwhocodes/module-importer": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", +      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" +    }, +    "@humanwhocodes/object-schema": { +      "version": "1.2.1", +      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", +      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" +    }, +    "@nodelib/fs.scandir": { +      "version": "2.1.5", +      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", +      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", +      "requires": { +        "@nodelib/fs.stat": "2.0.5", +        "run-parallel": "^1.1.9" +      } +    }, +    "@nodelib/fs.stat": { +      "version": "2.0.5", +      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", +      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" +    }, +    "@nodelib/fs.walk": { +      "version": "1.2.8", +      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", +      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", +      "requires": { +        "@nodelib/fs.scandir": "2.1.5", +        "fastq": "^1.6.0" +      } +    },      "@popperjs/core": {        "version": "2.11.6",        "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", -      "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", -      "peer": true +      "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" +    }, +    "@types/bootstrap": { +      "version": "5.2.6", +      "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.6.tgz", +      "integrity": "sha512-BlAc3YATdasbHoxMoBWODrSF6qwQO/E9X8wVxCCSa6rWjnaZfpkr2N6pUMCY6jj2+wf0muUtLySbvU9etX6YqA==", +      "requires": { +        "@popperjs/core": "^2.9.2" +      } +    }, +    "@types/geojson": { +      "version": "7946.0.10", +      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", +      "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" +    }, +    "@types/json-schema": { +      "version": "7.0.11", +      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", +      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" +    }, +    "@types/leaflet": { +      "version": "1.9.3", +      "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.3.tgz", +      "integrity": "sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==", +      "requires": { +        "@types/geojson": "*" +      } +    }, +    "@types/semver": { +      "version": "7.3.13", +      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", +      "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" +    }, +    "@typescript-eslint/eslint-plugin": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", +      "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", +      "requires": { +        "@eslint-community/regexpp": "^4.4.0", +        "@typescript-eslint/scope-manager": "5.56.0", +        "@typescript-eslint/type-utils": "5.56.0", +        "@typescript-eslint/utils": "5.56.0", +        "debug": "^4.3.4", +        "grapheme-splitter": "^1.0.4", +        "ignore": "^5.2.0", +        "natural-compare-lite": "^1.4.0", +        "semver": "^7.3.7", +        "tsutils": "^3.21.0" +      } +    }, +    "@typescript-eslint/parser": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", +      "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", +      "requires": { +        "@typescript-eslint/scope-manager": "5.56.0", +        "@typescript-eslint/types": "5.56.0", +        "@typescript-eslint/typescript-estree": "5.56.0", +        "debug": "^4.3.4" +      } +    }, +    "@typescript-eslint/scope-manager": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", +      "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", +      "requires": { +        "@typescript-eslint/types": "5.56.0", +        "@typescript-eslint/visitor-keys": "5.56.0" +      } +    }, +    "@typescript-eslint/type-utils": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", +      "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", +      "requires": { +        "@typescript-eslint/typescript-estree": "5.56.0", +        "@typescript-eslint/utils": "5.56.0", +        "debug": "^4.3.4", +        "tsutils": "^3.21.0" +      } +    }, +    "@typescript-eslint/types": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", +      "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==" +    }, +    "@typescript-eslint/typescript-estree": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", +      "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", +      "requires": { +        "@typescript-eslint/types": "5.56.0", +        "@typescript-eslint/visitor-keys": "5.56.0", +        "debug": "^4.3.4", +        "globby": "^11.1.0", +        "is-glob": "^4.0.3", +        "semver": "^7.3.7", +        "tsutils": "^3.21.0" +      } +    }, +    "@typescript-eslint/utils": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", +      "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", +      "requires": { +        "@eslint-community/eslint-utils": "^4.2.0", +        "@types/json-schema": "^7.0.9", +        "@types/semver": "^7.3.12", +        "@typescript-eslint/scope-manager": "5.56.0", +        "@typescript-eslint/types": "5.56.0", +        "@typescript-eslint/typescript-estree": "5.56.0", +        "eslint-scope": "^5.1.1", +        "semver": "^7.3.7" +      } +    }, +    "@typescript-eslint/visitor-keys": { +      "version": "5.56.0", +      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", +      "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", +      "requires": { +        "@typescript-eslint/types": "5.56.0", +        "eslint-visitor-keys": "^3.3.0" +      } +    }, +    "acorn": { +      "version": "8.8.2", +      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", +      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" +    }, +    "acorn-jsx": { +      "version": "5.3.2", +      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", +      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", +      "requires": {} +    }, +    "ajv": { +      "version": "6.12.6", +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", +      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", +      "requires": { +        "fast-deep-equal": "^3.1.1", +        "fast-json-stable-stringify": "^2.0.0", +        "json-schema-traverse": "^0.4.1", +        "uri-js": "^4.2.2" +      } +    }, +    "ansi-regex": { +      "version": "5.0.1", +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", +      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" +    }, +    "ansi-styles": { +      "version": "4.3.0", +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", +      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", +      "requires": { +        "color-convert": "^2.0.1" +      }      },      "anymatch": {        "version": "3.1.3", @@ -260,6 +1887,21 @@          "picomatch": "^2.0.4"        }      }, +    "argparse": { +      "version": "2.0.1", +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", +      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" +    }, +    "array-union": { +      "version": "2.1.0", +      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", +      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" +    }, +    "balanced-match": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", +      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" +    },      "binary-extensions": {        "version": "2.2.0",        "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -276,6 +1918,15 @@        "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz",        "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw=="      }, +    "brace-expansion": { +      "version": "1.1.11", +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", +      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", +      "requires": { +        "balanced-match": "^1.0.0", +        "concat-map": "0.0.1" +      } +    },      "braces": {        "version": "3.0.2",        "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -284,6 +1935,20 @@          "fill-range": "^7.0.1"        }      }, +    "callsites": { +      "version": "3.1.0", +      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", +      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" +    }, +    "chalk": { +      "version": "4.1.2", +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", +      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", +      "requires": { +        "ansi-styles": "^4.1.0", +        "supports-color": "^7.1.0" +      } +    },      "chokidar": {        "version": "3.5.3",        "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -299,6 +1964,246 @@          "readdirp": "~3.6.0"        }      }, +    "color-convert": { +      "version": "2.0.1", +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", +      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", +      "requires": { +        "color-name": "~1.1.4" +      } +    }, +    "color-name": { +      "version": "1.1.4", +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", +      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" +    }, +    "concat-map": { +      "version": "0.0.1", +      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", +      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" +    }, +    "cross-spawn": { +      "version": "7.0.3", +      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", +      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", +      "requires": { +        "path-key": "^3.1.0", +        "shebang-command": "^2.0.0", +        "which": "^2.0.1" +      } +    }, +    "debug": { +      "version": "4.3.4", +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", +      "requires": { +        "ms": "2.1.2" +      } +    }, +    "deep-is": { +      "version": "0.1.4", +      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", +      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" +    }, +    "dir-glob": { +      "version": "3.0.1", +      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", +      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", +      "requires": { +        "path-type": "^4.0.0" +      } +    }, +    "doctrine": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", +      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", +      "requires": { +        "esutils": "^2.0.2" +      } +    }, +    "escape-string-regexp": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", +      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" +    }, +    "eslint": { +      "version": "8.36.0", +      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", +      "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", +      "requires": { +        "@eslint-community/eslint-utils": "^4.2.0", +        "@eslint-community/regexpp": "^4.4.0", +        "@eslint/eslintrc": "^2.0.1", +        "@eslint/js": "8.36.0", +        "@humanwhocodes/config-array": "^0.11.8", +        "@humanwhocodes/module-importer": "^1.0.1", +        "@nodelib/fs.walk": "^1.2.8", +        "ajv": "^6.10.0", +        "chalk": "^4.0.0", +        "cross-spawn": "^7.0.2", +        "debug": "^4.3.2", +        "doctrine": "^3.0.0", +        "escape-string-regexp": "^4.0.0", +        "eslint-scope": "^7.1.1", +        "eslint-visitor-keys": "^3.3.0", +        "espree": "^9.5.0", +        "esquery": "^1.4.2", +        "esutils": "^2.0.2", +        "fast-deep-equal": "^3.1.3", +        "file-entry-cache": "^6.0.1", +        "find-up": "^5.0.0", +        "glob-parent": "^6.0.2", +        "globals": "^13.19.0", +        "grapheme-splitter": "^1.0.4", +        "ignore": "^5.2.0", +        "import-fresh": "^3.0.0", +        "imurmurhash": "^0.1.4", +        "is-glob": "^4.0.0", +        "is-path-inside": "^3.0.3", +        "js-sdsl": "^4.1.4", +        "js-yaml": "^4.1.0", +        "json-stable-stringify-without-jsonify": "^1.0.1", +        "levn": "^0.4.1", +        "lodash.merge": "^4.6.2", +        "minimatch": "^3.1.2", +        "natural-compare": "^1.4.0", +        "optionator": "^0.9.1", +        "strip-ansi": "^6.0.1", +        "strip-json-comments": "^3.1.0", +        "text-table": "^0.2.0" +      }, +      "dependencies": { +        "eslint-scope": { +          "version": "7.1.1", +          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", +          "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", +          "requires": { +            "esrecurse": "^4.3.0", +            "estraverse": "^5.2.0" +          } +        }, +        "estraverse": { +          "version": "5.3.0", +          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", +          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" +        }, +        "glob-parent": { +          "version": "6.0.2", +          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", +          "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", +          "requires": { +            "is-glob": "^4.0.3" +          } +        } +      } +    }, +    "eslint-scope": { +      "version": "5.1.1", +      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", +      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", +      "requires": { +        "esrecurse": "^4.3.0", +        "estraverse": "^4.1.1" +      } +    }, +    "eslint-visitor-keys": { +      "version": "3.3.0", +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", +      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" +    }, +    "espree": { +      "version": "9.5.0", +      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", +      "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", +      "requires": { +        "acorn": "^8.8.0", +        "acorn-jsx": "^5.3.2", +        "eslint-visitor-keys": "^3.3.0" +      } +    }, +    "esquery": { +      "version": "1.5.0", +      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", +      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", +      "requires": { +        "estraverse": "^5.1.0" +      }, +      "dependencies": { +        "estraverse": { +          "version": "5.3.0", +          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", +          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" +        } +      } +    }, +    "esrecurse": { +      "version": "4.3.0", +      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", +      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", +      "requires": { +        "estraverse": "^5.2.0" +      }, +      "dependencies": { +        "estraverse": { +          "version": "5.3.0", +          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", +          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" +        } +      } +    }, +    "estraverse": { +      "version": "4.3.0", +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", +      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" +    }, +    "esutils": { +      "version": "2.0.3", +      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", +      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" +    }, +    "fast-deep-equal": { +      "version": "3.1.3", +      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", +      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" +    }, +    "fast-glob": { +      "version": "3.2.12", +      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", +      "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", +      "requires": { +        "@nodelib/fs.stat": "^2.0.2", +        "@nodelib/fs.walk": "^1.2.3", +        "glob-parent": "^5.1.2", +        "merge2": "^1.3.0", +        "micromatch": "^4.0.4" +      } +    }, +    "fast-json-stable-stringify": { +      "version": "2.1.0", +      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", +      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" +    }, +    "fast-levenshtein": { +      "version": "2.0.6", +      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", +      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" +    }, +    "fastq": { +      "version": "1.15.0", +      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", +      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", +      "requires": { +        "reusify": "^1.0.4" +      } +    }, +    "file-entry-cache": { +      "version": "6.0.1", +      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", +      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", +      "requires": { +        "flat-cache": "^3.0.4" +      } +    },      "fill-range": {        "version": "7.0.1",        "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -307,12 +2212,53 @@          "to-regex-range": "^5.0.1"        }      }, +    "find-up": { +      "version": "5.0.0", +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", +      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", +      "requires": { +        "locate-path": "^6.0.0", +        "path-exists": "^4.0.0" +      } +    }, +    "flat-cache": { +      "version": "3.0.4", +      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", +      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", +      "requires": { +        "flatted": "^3.1.0", +        "rimraf": "^3.0.2" +      } +    }, +    "flatted": { +      "version": "3.2.7", +      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", +      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" +    }, +    "fs.realpath": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", +      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" +    },      "fsevents": {        "version": "2.3.2",        "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",        "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",        "optional": true      }, +    "glob": { +      "version": "7.2.3", +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", +      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", +      "requires": { +        "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" +      } +    },      "glob-parent": {        "version": "5.1.2",        "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -321,11 +2267,75 @@          "is-glob": "^4.0.1"        }      }, +    "globals": { +      "version": "13.20.0", +      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", +      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", +      "requires": { +        "type-fest": "^0.20.2" +      } +    }, +    "globby": { +      "version": "11.1.0", +      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", +      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", +      "requires": { +        "array-union": "^2.1.0", +        "dir-glob": "^3.0.1", +        "fast-glob": "^3.2.9", +        "ignore": "^5.2.0", +        "merge2": "^1.4.1", +        "slash": "^3.0.0" +      } +    }, +    "grapheme-splitter": { +      "version": "1.0.4", +      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", +      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" +    }, +    "has-flag": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", +      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" +    }, +    "ignore": { +      "version": "5.2.4", +      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", +      "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" +    },      "immutable": {        "version": "4.3.0",        "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz",        "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg=="      }, +    "import-fresh": { +      "version": "3.3.0", +      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", +      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", +      "requires": { +        "parent-module": "^1.0.0", +        "resolve-from": "^4.0.0" +      } +    }, +    "imurmurhash": { +      "version": "0.1.4", +      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", +      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" +    }, +    "inflight": { +      "version": "1.0.6", +      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", +      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", +      "requires": { +        "once": "^1.3.0", +        "wrappy": "1" +      } +    }, +    "inherits": { +      "version": "2.0.4", +      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", +      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" +    },      "is-binary-path": {        "version": "2.1.0",        "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -352,16 +2362,196 @@        "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",        "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="      }, +    "is-path-inside": { +      "version": "3.0.3", +      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", +      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" +    }, +    "isexe": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", +      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" +    }, +    "js-sdsl": { +      "version": "4.4.0", +      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", +      "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==" +    }, +    "js-yaml": { +      "version": "4.1.0", +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", +      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", +      "requires": { +        "argparse": "^2.0.1" +      } +    }, +    "json-schema-traverse": { +      "version": "0.4.1", +      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", +      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" +    }, +    "json-stable-stringify-without-jsonify": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", +      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" +    }, +    "levn": { +      "version": "0.4.1", +      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", +      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", +      "requires": { +        "prelude-ls": "^1.2.1", +        "type-check": "~0.4.0" +      } +    }, +    "locate-path": { +      "version": "6.0.0", +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", +      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", +      "requires": { +        "p-locate": "^5.0.0" +      } +    }, +    "lodash.merge": { +      "version": "4.6.2", +      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", +      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" +    }, +    "lru-cache": { +      "version": "6.0.0", +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", +      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", +      "requires": { +        "yallist": "^4.0.0" +      } +    }, +    "merge2": { +      "version": "1.4.1", +      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", +      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" +    }, +    "micromatch": { +      "version": "4.0.5", +      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", +      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", +      "requires": { +        "braces": "^3.0.2", +        "picomatch": "^2.3.1" +      } +    }, +    "minimatch": { +      "version": "3.1.2", +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", +      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", +      "requires": { +        "brace-expansion": "^1.1.7" +      } +    }, +    "ms": { +      "version": "2.1.2", +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" +    }, +    "natural-compare": { +      "version": "1.4.0", +      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", +      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" +    }, +    "natural-compare-lite": { +      "version": "1.4.0", +      "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", +      "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" +    },      "normalize-path": {        "version": "3.0.0",        "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",        "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="      }, +    "once": { +      "version": "1.4.0", +      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", +      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", +      "requires": { +        "wrappy": "1" +      } +    }, +    "optionator": { +      "version": "0.9.1", +      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", +      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", +      "requires": { +        "deep-is": "^0.1.3", +        "fast-levenshtein": "^2.0.6", +        "levn": "^0.4.1", +        "prelude-ls": "^1.2.1", +        "type-check": "^0.4.0", +        "word-wrap": "^1.2.3" +      } +    }, +    "p-limit": { +      "version": "3.1.0", +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", +      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", +      "requires": { +        "yocto-queue": "^0.1.0" +      } +    }, +    "p-locate": { +      "version": "5.0.0", +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", +      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", +      "requires": { +        "p-limit": "^3.0.2" +      } +    }, +    "parent-module": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", +      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", +      "requires": { +        "callsites": "^3.0.0" +      } +    }, +    "path-exists": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", +      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" +    }, +    "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==" +    }, +    "path-key": { +      "version": "3.1.1", +      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", +      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" +    }, +    "path-type": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", +      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" +    },      "picomatch": {        "version": "2.3.1",        "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",        "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="      }, +    "prelude-ls": { +      "version": "1.2.1", +      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", +      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" +    }, +    "punycode": { +      "version": "2.3.0", +      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", +      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" +    }, +    "queue-microtask": { +      "version": "1.2.3", +      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", +      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" +    },      "readdirp": {        "version": "3.6.0",        "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -370,6 +2560,32 @@          "picomatch": "^2.2.1"        }      }, +    "resolve-from": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", +      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" +    }, +    "reusify": { +      "version": "1.0.4", +      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", +      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" +    }, +    "rimraf": { +      "version": "3.0.2", +      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", +      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", +      "requires": { +        "glob": "^7.1.3" +      } +    }, +    "run-parallel": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", +      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", +      "requires": { +        "queue-microtask": "^1.2.2" +      } +    },      "sass": {        "version": "1.59.3",        "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.3.tgz", @@ -380,11 +2596,63 @@          "source-map-js": ">=0.6.2 <2.0.0"        }      }, +    "semver": { +      "version": "7.3.8", +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", +      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", +      "requires": { +        "lru-cache": "^6.0.0" +      } +    }, +    "shebang-command": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", +      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", +      "requires": { +        "shebang-regex": "^3.0.0" +      } +    }, +    "shebang-regex": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", +      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" +    }, +    "slash": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", +      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" +    },      "source-map-js": {        "version": "1.0.2",        "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",        "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="      }, +    "strip-ansi": { +      "version": "6.0.1", +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", +      "requires": { +        "ansi-regex": "^5.0.1" +      } +    }, +    "strip-json-comments": { +      "version": "3.1.1", +      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", +      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" +    }, +    "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==", +      "requires": { +        "has-flag": "^4.0.0" +      } +    }, +    "text-table": { +      "version": "0.2.0", +      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", +      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" +    },      "to-regex-range": {        "version": "5.0.1",        "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -392,6 +2660,73 @@        "requires": {          "is-number": "^7.0.0"        } +    }, +    "tslib": { +      "version": "1.14.1", +      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", +      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" +    }, +    "tsutils": { +      "version": "3.21.0", +      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", +      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", +      "requires": { +        "tslib": "^1.8.1" +      } +    }, +    "type-check": { +      "version": "0.4.0", +      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", +      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", +      "requires": { +        "prelude-ls": "^1.2.1" +      } +    }, +    "type-fest": { +      "version": "0.20.2", +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", +      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" +    }, +    "typescript": { +      "version": "5.0.2", +      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", +      "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==" +    }, +    "uri-js": { +      "version": "4.4.1", +      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", +      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", +      "requires": { +        "punycode": "^2.1.0" +      } +    }, +    "which": { +      "version": "2.0.2", +      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", +      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", +      "requires": { +        "isexe": "^2.0.0" +      } +    }, +    "word-wrap": { +      "version": "1.2.3", +      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", +      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" +    }, +    "wrappy": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", +      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" +    }, +    "yallist": { +      "version": "4.0.0", +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", +      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" +    }, +    "yocto-queue": { +      "version": "0.1.0", +      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", +      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="      }    }  } diff --git a/package.json b/package.json index bfa24d6..2ac0005 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,13 @@  {    "dependencies": { +    "@types/bootstrap": "^5.2.6", +    "@types/leaflet": "^1.9.3", +    "@typescript-eslint/eslint-plugin": "^5.56.0", +    "@typescript-eslint/parser": "^5.56.0",      "bootstrap": "^5.2.3",      "bootstrap-icons": "^1.10.3", -    "sass": "^1.59.3" +    "eslint": "^8.36.0", +    "sass": "^1.59.3", +    "typescript": "^5.0.2"    }  } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d274abb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,109 @@ +{ +  "compilerOptions": { +    /* Visit https://aka.ms/tsconfig to read more about this file */ + +    /* Projects */ +    // "incremental": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ +    // "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */ +    // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path to .tsbuildinfo incremental compilation file. */ +    // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */ +    // "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */ +    // "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */ + +    /* Language and Environment */ +    "target": "es2016",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ +    // "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */ +    // "jsx": "preserve",                                /* Specify what JSX code is generated. */ +    // "experimentalDecorators": true,                   /* Enable experimental support for legacy experimental decorators. */ +    // "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */ +    // "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ +    // "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ +    // "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ +    // "reactNamespace": "",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ +    // "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */ +    // "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */ +    // "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */ + +    /* Modules */ +    "module": "es6",                                     /* Specify what module code is generated. */ +    "rootDir": "./asset-sources",                        /* Specify the root folder within your source files. */ +    // "moduleResolution": "node10",                     /* Specify how TypeScript looks up a file from a given module specifier. */ +    // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */ +    // "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */ +    // "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */ +    // "typeRoots": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */ +    // "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */ +    // "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */ +    // "moduleSuffixes": [],                             /* List of file name suffixes to search when resolving a module. */ +    // "allowImportingTsExtensions": true,               /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ +    // "resolvePackageJsonExports": true,                /* Use the package.json 'exports' field when resolving package imports. */ +    // "resolvePackageJsonImports": true,                /* Use the package.json 'imports' field when resolving imports. */ +    // "customConditions": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ +    // "resolveJsonModule": true,                        /* Enable importing .json files. */ +    // "allowArbitraryExtensions": true,                 /* Enable importing files with any extension, provided a declaration file is present. */ +    // "noResolve": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */ + +    /* JavaScript Support */ +    // "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ +    // "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */ +    // "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + +    /* Emit */ +    // "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ +    // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */ +    // "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */ +    "sourceMap": true,                                   /* Create source map files for emitted JavaScript files. */ +    // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */ +    // "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ +    "outDir": "./fietsboek/static/",                     /* Specify an output folder for all emitted files. */ +    // "removeComments": true,                           /* Disable emitting comments. */ +    // "noEmit": true,                                   /* Disable emitting files from a compilation. */ +    // "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ +    // "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types. */ +    // "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ +    // "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */ +    // "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */ +    // "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */ +    // "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ +    // "newLine": "crlf",                                /* Set the newline character for emitting files. */ +    // "stripInternal": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ +    // "noEmitHelpers": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */ +    // "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */ +    // "preserveConstEnums": true,                       /* Disable erasing 'const enum' declarations in generated code. */ +    // "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */ +    // "preserveValueImports": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + +    /* Interop Constraints */ +    // "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */ +    // "verbatimModuleSyntax": true,                     /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ +    // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */ +    "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ +    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ +    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */ + +    /* Type Checking */ +    "strict": true,                                      /* Enable all strict type-checking options. */ +    // "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */ +    // "strictNullChecks": true,                         /* When type checking, take into account 'null' and 'undefined'. */ +    // "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ +    // "strictBindCallApply": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ +    // "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */ +    // "noImplicitThis": true,                           /* Enable error reporting when 'this' is given the type 'any'. */ +    // "useUnknownInCatchVariables": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */ +    // "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */ +    // "noUnusedLocals": true,                           /* Enable error reporting when local variables aren't read. */ +    // "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read. */ +    // "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */ +    // "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */ +    // "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */ +    // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to a type when accessed using an index. */ +    // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */ +    // "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */ +    // "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */ +    // "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */ + +    /* Completeness */ +    // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */ +    "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */ +  } +}  | 
