From 4c9151c12d5c362f813aed0666001e5e35dbce82 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 13 Dec 2019 10:00:04 +1100 Subject: [PATCH 001/635] #98 close list when item is already selected --- src/List.svelte | 13 ++++++++++--- src/Select.svelte | 6 +++++- test/src/index.js | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index 311183cd..4c6ea34e 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -103,7 +103,7 @@ const { item, i, event } = args; event.stopPropagation(); - if (selectedValue && !isMulti && selectedValue[optionIdentifier] === item[optionIdentifier]) return; + if (selectedValue && !isMulti && selectedValue[optionIdentifier] === item[optionIdentifier]) return closeList(); if (item.isCreator) { dispatch('itemCreated', filterText); @@ -114,6 +114,10 @@ } } + function closeList() { + dispatch('closeList'); + } + async function updateHoverItem(increment) { if (isVirtualList) return; @@ -152,7 +156,10 @@ e.preventDefault(); if (items.length === 0) break; const hoverItem = items[hoverItemIndex]; - if (selectedValue && !isMulti && selectedValue[optionIdentifier] === hoverItem[optionIdentifier]) break; + if (selectedValue && !isMulti && selectedValue[optionIdentifier] === hoverItem[optionIdentifier]) { + closeList(); + break; + } if (hoverItem.isCreator) { dispatch('itemCreated', filterText); @@ -164,7 +171,7 @@ case 'Tab': e.preventDefault(); if (items.length === 0) break; - if (selectedValue && selectedValue[optionIdentifier] === items[hoverItemIndex][optionIdentifier]) return; + if (selectedValue && selectedValue[optionIdentifier] === items[hoverItemIndex][optionIdentifier]) return closeList(); activeItemIndex = hoverItemIndex; handleSelect(items[hoverItemIndex]); break; diff --git a/src/Select.svelte b/src/Select.svelte index c639ccde..7f2ab68d 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -528,7 +528,11 @@ activeSelectedValue = undefined; resetFilter(); }); - + + list.$on('closeList', () => { + listOpen = false; + }); + list = list, target = target; getPosition(); diff --git a/test/src/index.js b/test/src/index.js index 6313941e..31a69394 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -2559,6 +2559,23 @@ test('When listAutoWidth is set to false list container should have style of wid }); +test('When item is already active and is selected from list then close list', async (t) => { + const select = new Select({ + target, + props: { + items, + listOpen: true, + selectedValue: 'pizza' + } + }); + + await wait(0); + await querySelectorClick('.listContainer > .listItem > .item.active'); + await wait(0); + t.ok(select.selectedValue.value === 'pizza'); + select.$destroy(); +}); + function focus(element, setFocus) { return new Promise(fulfil => { element.addEventListener('focus', function handler() { From d30908e4693b8cefe3c7a5fddb31eae01c2aeda6 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sat, 14 Dec 2019 07:37:40 +1100 Subject: [PATCH 002/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b875739a..da60f36f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.2.0 + +* List will now close if active item gets selected + ## 3.1.2 * Thanks to @dimfeld for these updates... From c1f118a70f0ef048102455111a89ea3596fe631f Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sat, 14 Dec 2019 07:38:12 +1100 Subject: [PATCH 003/635] 3.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5d34f070..d28a109d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.1.2", + "version": "3.2.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From ce2b938c68efa6c4f33674287a697bc51967e8a2 Mon Sep 17 00:00:00 2001 From: Gleb Zagura Date: Tue, 24 Dec 2019 17:42:09 +0200 Subject: [PATCH 007/635] replace menuPlacement with listPlacement in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8f0a25c3..a9537fe7 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ yarn add svelte-select | loadOptions | Promise | - | Method that returns a Promise that updates items | noOptionsMessage | String | 'No options' | Message to display when there are no items | hideEmptyState | Boolean | false | Hide list when no options -| menuPlacement | String | 'auto' | When 'auto' displays either 'top' or 'bottom' depending on viewport +| listPlacement | String | 'auto' | When 'auto' displays either 'top' or 'bottom' depending on viewport | hasError | Boolean | false | Show error styles around select input (red border) | inputAttributes | Object | - | Pass in attributes like 'id' to the Select input, for example {id: 'Food Selection', foo: 'something'} | listAutoWidth | Boolean | true | List width will grow wider than the Select container (depending on list item content length) From ce92c13d1ba3345030dbb35d0491090f31d3072a Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 6 Jan 2020 14:53:56 +1100 Subject: [PATCH 008/635] IE11 disable input fix --- src/Select.svelte | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index afece1bc..342a91ca 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -582,15 +582,27 @@ /> {/if} - + {#if isDisabled} + + {:else} + + {/if} + {#if !isMulti && showSelectedItem }
From 51a5f075c22c6d233d05a7c846053c673972e169 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 6 Jan 2020 14:55:33 +1100 Subject: [PATCH 009/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 080a4a1a..91fb9393 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.3.1 + +* IE11 disable input fix + ## 3.3.0 * Thanks to @jackc for this update... Added itemFilter method From 52a73d0acd1ab89e1c9a115cca20a3534f554615 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 6 Jan 2020 14:58:10 +1100 Subject: [PATCH 010/635] 3.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a7cc79ff..c444cb3d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.3.0", + "version": "3.3.1", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A - {:else} - - {/if} - + {#if !isMulti && showSelectedItem }
From 4a3ac299294a0997b37bf465e51ac3b3d96c5d69 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 7 Jan 2020 07:43:24 +1100 Subject: [PATCH 012/635] 3.3.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c444cb3d..9a04fe76 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.3.1", + "version": "3.3.2", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From 20ecc98609ad5e833cfec692dfe868b207f51134 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 7 Jan 2020 09:54:51 +1100 Subject: [PATCH 017/635] IE11 attempt #3 --- src/Select.svelte | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index cde84f2b..4f62f432 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -584,15 +584,27 @@ /> {/if} - + + {#if isDisabled} + + {:else} + + {/if} {#if !isMulti && showSelectedItem }
From ced5879934d1dd59bdebce3a259b1a51d17fe052 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 7 Jan 2020 09:56:05 +1100 Subject: [PATCH 018/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68277309..787c98e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.3.4 + +* Fix for fix for a fix for IE11 disable input fix 😿 + ## 3.3.3 * Fix for a fix for IE11 disable input fix (don't code tired!) From 2abab7f7b8211d1c2b2d7f6d849866e0fbf385c2 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 7 Jan 2020 09:56:18 +1100 Subject: [PATCH 019/635] 3.3.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f76da0b3..6cd80204 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.3.3", + "version": "3.3.4", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From cf64226302d90cadae3ab9720c056c95b953a6e0 Mon Sep 17 00:00:00 2001 From: Jason Zavaglia Date: Tue, 21 Jan 2020 04:58:00 +1100 Subject: [PATCH 023/635] Fix input blurring issue when within shadow DOM As per #105 --- src/Select.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Select.svelte b/src/Select.svelte index 20993266..e3daa49d 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -435,7 +435,8 @@ function handleWindowClick(event) { if (!container) return; - if (container.contains(event.target)) return; + const eventTarget = event.path && (event.path.length > 0) ? event.path[0] : event.target + if (container.contains(eventTarget)) return; isFocused = false; listOpen = false; activeSelectedValue = undefined; From 0a8ab66b48b2677f2c43b768f83c7b7c1123d378 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 21 Jan 2020 10:04:44 +1100 Subject: [PATCH 024/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e44959af..7c9f09b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.3.6 + +* Thanks for @jpz for this update... Fix input blurring issue when within shadow DOM + ## 3.3.5 * MS Edge fix: Replaced object literal spreading From 3f5c3852ee90e1ba49112badcd8819a8f5a71b18 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 21 Jan 2020 10:04:58 +1100 Subject: [PATCH 025/635] 3.3.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87df1fc0..dc562077 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.3.5", + "version": "3.3.6", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From 7d25aff598c45865a608380826183a8db98e523f Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 23 Jan 2020 21:58:28 +1100 Subject: [PATCH 028/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c9f09b1..77932988 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.3.7 + +* Virtual list height fix + ## 3.3.6 * Thanks for @jpz for this update... Fix input blurring issue when within shadow DOM From 4bedbcfdf7332af7d1d21afb4f0ae6d2e7450ef1 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 27 Feb 2020 08:12:09 +1100 Subject: [PATCH 029/635] Bumping Svelte version and fixing up tests --- package.json | 2 +- test/src/index.js | 66 +++++++++++++++++++++++------------------------ yarn.lock | 8 +++--- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index dc562077..de524423 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "rollup-plugin-node-resolve": "^4.0.0", "rollup-plugin-svelte": "^5.1.0", "sirv": "^0.2.2", - "svelte": "^3.6.7", + "svelte": "^3.19.1", "tap-diff": "^0.1.1", "tap-dot": "^2.0.0", "tape-modern": "^1.1.1" diff --git a/test/src/index.js b/test/src/index.js index fe4e7127..3a83c593 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -100,7 +100,7 @@ test('when isFocused changes to true input should focus', async (t) => { select.$set({isFocused: true}); }; - const hasFocused = await focus(select.$$.ctx.input, setFocus); + const hasFocused = await focus(select.input, setFocus); t.ok(hasFocused); select.$destroy(); }); @@ -493,7 +493,7 @@ test('focus on Select input updates focus state', async (t) => { }); document.querySelector('.selectContainer input').focus(); - t.ok(select.$$.ctx.isFocused); + t.ok(select.isFocused); select.$destroy(); }); @@ -507,7 +507,7 @@ test('key up and down when Select focused opens list', async (t) => { document.querySelector('.selectContainer input').focus(); await wait(0); - t.ok(select.$$.ctx.isFocused); + t.ok(select.isFocused); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); await wait(0); t.ok(document.querySelector('.listContainer')); @@ -737,9 +737,9 @@ test('Select filter text filters list', async (t) => { }); await wait(0); - t.ok(select.$$.ctx.filteredItems.length === 5); + t.ok(select.filteredItems.length === 5); await handleSet(select, {filterText: 'Ice'}) - t.ok(select.$$.ctx.filteredItems.length === 1); + t.ok(select.filteredItems.length === 1); select.$destroy(); }); @@ -754,9 +754,9 @@ test('Select filter text filters list with itemFilter', async (t) => { }); await wait(0); - t.ok(select.$$.ctx.filteredItems.length === 5); + t.ok(select.filteredItems.length === 5); await handleSet(select, {filterText: 'cream ice'}) - t.ok(select.$$.ctx.filteredItems.length === 1); + t.ok(select.filteredItems.length === 1); select.$destroy(); }); @@ -949,10 +949,10 @@ test('clicking between Selects should close and blur other Select', async (t) => }); await querySelectorClick('.selectContainer'); - t.ok(select.$$.ctx.list); + t.ok(select.list); await querySelectorClick('#extra .selectContainer'); - t.ok(!select.$$.ctx.list); - t.ok(other.$$.ctx.list); + t.ok(!select.list); + t.ok(other.list); select.$destroy(); other.$destroy(); @@ -1002,7 +1002,7 @@ test(`data shouldn't be stripped from item - currently only saves name`, async ( await querySelectorClick('.selectContainer'); await querySelectorClick('.listItem'); - t.equal(JSON.stringify(select.$$.ctx.selectedValue), JSON.stringify({value: 'chocolate', label: 'Chocolate'})); + t.equal(JSON.stringify(select.selectedValue), JSON.stringify({value: 'chocolate', label: 'Chocolate'})); select.$destroy(); }); @@ -1288,7 +1288,7 @@ test('when isMulti is true clicking item in List will populate selectedValue', a await querySelectorClick('.selectContainer'); await querySelectorClick('.listItem'); - t.equal(JSON.stringify(select.$$.ctx.selectedValue), JSON.stringify([{value: 'chocolate', label: 'Chocolate'}])); + t.equal(JSON.stringify(select.selectedValue), JSON.stringify([{value: 'chocolate', label: 'Chocolate'}])); select.$destroy(); }); @@ -1303,7 +1303,7 @@ test('when isMulti is true items in selectedValue will not appear in List', asyn } }); - t.equal(JSON.stringify(select.$$.ctx.filteredItems), JSON.stringify([ + t.equal(JSON.stringify(select.filteredItems), JSON.stringify([ {value: 'pizza', label: 'Pizza'}, {value: 'cake', label: 'Cake'}, {value: 'chips', label: 'Chips'}, @@ -1325,7 +1325,7 @@ test('when isMulti is true both selectedValue and filterText filters List', asyn } }); - t.equal(JSON.stringify(select.$$.ctx.filteredItems), JSON.stringify([ + t.equal(JSON.stringify(select.filteredItems), JSON.stringify([ {value: 'pizza', label: 'Pizza'} ])); @@ -1343,7 +1343,7 @@ test('when isMulti is true clicking X on a selected item will remove it from sel }); document.querySelector('.multiSelectItem_clear').click(); - t.equal(JSON.stringify(select.$$.ctx.selectedValue), JSON.stringify([{value: 'pizza', label: 'Pizza'}])); + t.equal(JSON.stringify(select.selectedValue), JSON.stringify([{value: 'pizza', label: 'Pizza'}])); select.$destroy(); }); @@ -1374,7 +1374,7 @@ test('when isMulti is true and items are selected then clear all should wipe all }); document.querySelector('.clearSelect').click(); - t.equal(select.$$.ctx.selectedValue, undefined); + t.equal(select.selectedValue, undefined); select.$destroy(); }); @@ -1427,7 +1427,7 @@ test('when isMulti and selectedValue is populated then navigating with LeftArrow target.style.maxWidth = '100%'; window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - t.ok(select.$$.ctx.activeSelectedValue === 1) + t.ok(select.$capture_state().activeSelectedValue === 1); select.$destroy(); }); @@ -1447,7 +1447,7 @@ test('when isMulti and selectedValue is populated then navigating with ArrowRigh window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowRight'})); - t.ok(select.$$.ctx.activeSelectedValue === 1); + t.ok(select.$capture_state().activeSelectedValue === 1); select.$destroy(); }); @@ -1497,11 +1497,11 @@ test('when getValue method is set should use that key to update selectedValue', } }); - t.ok(select.$$.ctx.selectedValue.id === 0); + t.ok(select.selectedValue.id === 0); await querySelectorClick('.selectContainer'); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.$$.ctx.selectedValue.id === 1); + t.ok(select.selectedValue.id === 1); select.$destroy(); }); @@ -1895,8 +1895,8 @@ test('when isFocused turns to false then check Select is no longer in focus', as await wait(0); - t.ok(selectSecond.$$.ctx.isFocused); - t.ok(!select.$$.ctx.isFocused); + t.ok(selectSecond.isFocused); + t.ok(!select.isFocused); selectSecond.$destroy(); select.$destroy(); @@ -2067,7 +2067,7 @@ test('when isMulti and selectedValue has items then check each item is unique', } }); - t.ok(select.$$.ctx.selectedValue.length === 2); + t.ok(select.selectedValue.length === 2); select.$destroy(); }); @@ -2086,7 +2086,7 @@ test('when isMulti and textFilter has length then enter should select item', asy await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.$$.ctx.selectedValue[0].value === 'pizza'); + t.ok(select.selectedValue[0].value === 'pizza'); select.$destroy(); }); @@ -2104,7 +2104,7 @@ test('when isMulti and textFilter has length and no items in list then enter sho }); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.$$.ctx.selectedValue === undefined); + t.ok(select.selectedValue === undefined); select.$destroy(); }); @@ -2122,7 +2122,7 @@ test('When isMulti and no selected item then delete should do nothing', async (t await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Backspace'})); - t.ok(select.$$.ctx.listOpen === true); + t.ok(select.listOpen === true); select.$destroy(); }); @@ -2141,7 +2141,7 @@ test('When list is open, filterText applied and Enter/Tab key pressed should sel await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(select.$$.ctx.selectedValue.value, 'A5'); + t.equal(select.selectedValue.value, 'A5'); await wait(0); t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'A5'); @@ -2313,7 +2313,7 @@ test('When creator selected, selected item is set to created item', async (t) => await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - const { selectedValue } = select.$$.ctx; + const { selectedValue } = select; t.ok(selectedValue.value === 'abc'); t.ok(selectedValue.label === 'abc'); @@ -2339,7 +2339,7 @@ test('When creator is selected, created item it added to multi selection', async await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - const { selectedValue } = select.$$.ctx; + const { selectedValue } = select; t.ok(selectedValue[0].value === 'abc'); t.ok(selectedValue[0].label === 'abc'); @@ -2365,13 +2365,13 @@ test('When creator is selected multiple times, items are all added to multi sele await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); await wait(0); - t.ok(select.$$.ctx.selectedValue[0].value === 'abc'); + t.ok(select.selectedValue[0].value === 'abc'); select.$set({ filterText: filterTextForItem2 }); await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); await wait(0); - t.ok(select.$$.ctx.selectedValue[1].value === 'def'); + t.ok(select.selectedValue[1].value === 'def'); select.$destroy(); }); @@ -2391,9 +2391,9 @@ test('When isMulti and an items remove icon is clicked then item should be remov }); await querySelectorClick('.multiSelectItem_clear'); - t.ok(select.$$.ctx.selectedValue[0].value === 'cake') + t.ok(select.selectedValue[0].value === 'cake') await querySelectorClick('.multiSelectItem_clear'); - t.ok(select.$$.ctx.selectedValue === undefined); + t.ok(select.selectedValue === undefined); select.$destroy(); }); diff --git a/yarn.lock b/yarn.lock index 351b8a53..085e2b5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -918,10 +918,10 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -svelte@^3.6.7: - version "3.6.7" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.6.7.tgz#20e814b79aac4009d4bc1ecf0c9287a6bf7e96fb" - integrity sha512-9HzhPxWNLi+ZBhxL3HJ8jwwu+u+XfHtVF3uEJ2m8/JOdnaTC9D2qiEwOncgI7z/pN+VumgKQtZoHtvYCW6fHqg== +svelte@^3.19.1: + version "3.19.1" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.19.1.tgz#2455e443f8ca67b98f3b7eb58285eaeb8af0c4b9" + integrity sha512-MGBh6LiWwwOfzlH9epQ8mP5DNWsuc6fWsZpLy47beqNG8wSkrQ/ez7TxaV+8VZ5KOwJJnfesj5gqgGjM2NcWVw== tap-diff@^0.1.1: version "0.1.1" From d0a89e819ba58cdc491fa8cbef4373c863fdff34 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 27 Feb 2020 08:14:58 +1100 Subject: [PATCH 030/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77932988..0d97e052 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.4.0 + +* Bumped version of Svelte to 3.19.1 and fixed up some tests + ## 3.3.7 * Virtual list height fix From f56c7215803a5bbd47f8744b57646ed18f882c29 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 27 Feb 2020 08:15:03 +1100 Subject: [PATCH 031/635] 3.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 84c4e180..44bd19ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.3.7", + "version": "3.4.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A - {:else} - - {/if} - - {#if !isMulti && showSelectedItem } -
- -
- {/if} - - {#if showSelectedItem && isClearable && !isDisabled && !isWaiting} -
- - - -
- {/if} - - {#if !isSearchable && !isDisabled && !isWaiting && (showSelectedItem && !isClearable || !showSelectedItem)} -
- - - -
- {/if} - - {#if isWaiting} -
- - - -
- {/if} -
- + + + +
+ + {#if isMulti && selectedValue && selectedValue.length > 0} + + {/if} + + {#if isDisabled} + + {:else} + + {/if} + + {#if !isMulti && showSelectedItem} +
+ +
+ {/if} + + {#if showSelectedItem && isClearable && !isDisabled && !isWaiting} +
+ + + +
+ {/if} + + {#if !isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem)} +
+ + + +
+ {/if} + + {#if isWaiting} +
+ + + +
+ {/if} +
From dd720cf9964348532e12944872ef791d341f8234 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 26 Mar 2020 15:11:26 +1100 Subject: [PATCH 033/635] #114 added Icon support and new showChevron prop --- src/Select.svelte | 9 ++++++++- test/src/TestIcon.svelte | 15 +++++++++++++++ test/src/index.js | 30 ++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 test/src/TestIcon.svelte diff --git a/src/Select.svelte b/src/Select.svelte index c11e8867..b77239e7 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -75,6 +75,8 @@ export let inputAttributes = {}; export let listAutoWidth = true; export let itemHeight = 40; + export let Icon = undefined; + export let showChevron = false; let target; let activeSelectedValue; @@ -620,6 +622,7 @@ height: var(--height, 42px); position: relative; display: flex; + align-items: center; padding: var(--padding, 0 16px); background: var(--background, #fff); } @@ -780,6 +783,10 @@ on:click={handleClick} bind:this={container}> + {#if Icon} + + {/if} + {#if isMulti && selectedValue && selectedValue.length > 0} {/if} - {#if !isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem)} + {#if showChevron && !selectedValue || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem))}
+ + diff --git a/test/src/index.js b/test/src/index.js index 3a83c593..bfce38c2 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -4,6 +4,7 @@ import normalizeHtml from '../utils/normalizeHtml'; import CustomItem from './CustomItem.svelte'; import Select from '../../src/Select.svelte'; import List from '../../src/List.svelte'; +import TestIcon from './TestIcon.svelte'; import SelectDefault from './Select/Select--default.html' import SelectMultiSelected from './Select/Select--multiSelected.html' import ListDefault from './List/List--default.html' @@ -2593,6 +2594,35 @@ test('When item is already active and is selected from list then close list', as select.$destroy(); }); + +test('When Icon prop is supplied then render on Select', async (t) => { + const select = new Select({ + target, + props: { + items, + Icon: TestIcon + } + }); + + t.ok(document.querySelectorAll('#testIcon')[0]); + + select.$destroy(); +}); + +test('When showChevron prop is true always show chevron on Select', async (t) => { + const select = new Select({ + target, + props: { + items, + showChevron: true + } + }); + + t.ok(document.querySelectorAll('.indicator')[0]); + + select.$destroy(); +}); + function focus(element, setFocus) { return new Promise(fulfil => { element.addEventListener('focus', function handler() { From 94251038e72d536cce356334b121871c3181d35e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 26 Mar 2020 15:24:28 +1100 Subject: [PATCH 034/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d97e052..49ecc9a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.5.0 + +* Added Icon and showChevron props + ## 3.4.0 * Bumped version of Svelte to 3.19.1 and fixed up some tests From b3bfcf23e45b3fa262516b2ad9252abc09f5205c Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 26 Mar 2020 15:24:36 +1100 Subject: [PATCH 035/635] 3.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 44bd19ab..ece174ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.4.0", + "version": "3.5.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From 1b481d9d5c2195ac993807ac8741029ff6be6ff3 Mon Sep 17 00:00:00 2001 From: Rob B <2623102+rob-balfre@users.noreply.github.com> Date: Thu, 26 Mar 2020 15:40:54 +1100 Subject: [PATCH 039/635] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9537fe7..9fa58a8b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A select/autocomplete component for Svelte apps. With support for grouping, fil [🌱 Simple demo](https://svelte.dev/repl/a859c2ba7d1744af9c95037c48989193?version=3.12.1) -[🌻 Advanced demo](https://svelte.dev/repl/f3bc0fd6b6f74ea499e5ecb26911bf28?version=3.12.1) +[🌻 Advanced demo](https://svelte.dev/repl/3e032a58c3974d07b7818c0f817a06a3?version=3.20.1) ## Installation From 3ca81b533e2168cb923e3196afa17c8887f10bab Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 26 Mar 2020 15:44:52 +1100 Subject: [PATCH 040/635] css var typo --- src/Select.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Select.svelte b/src/Select.svelte index 379f871a..ff446b07 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -633,7 +633,7 @@ color: var(--inputColor, #3f4f5f); height: var(--height, 42px); line-height: var(--height, 42px); - padding: var(--inputPadding, --padding); + padding: var(--inputPadding, var(--padding)); width: 100%; background: transparent; font-size: var(--inputFontSize, 14px); From 0d6f945c6d9c01c2eac30cfe1479ef162df78976 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 26 Mar 2020 15:45:35 +1100 Subject: [PATCH 041/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8ad9450..5414c226 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.6.1 + +* CSS vars typo fix + ## 3.6.0 * Added CSS vars for input padding and left From 276f9b1e4349937b043894865421a2dbf4906dcd Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 26 Mar 2020 15:45:38 +1100 Subject: [PATCH 042/635] 3.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index da5b9169..f0f80ae8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.6.0", + "version": "3.6.1", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From f785e81e23026d5cbfe39f4168799ec8af598109 Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:20:59 +1000 Subject: [PATCH 046/635] remove padding-left group items for center align --- src/Item.svelte | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Item.svelte b/src/Item.svelte index 0b553b75..51fefd54 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -34,9 +34,11 @@ text-transform: var(--groupTitleTextTransform, uppercase); } - .groupItem { +/* remove this for centre alignment */ + + /* .groupItem { padding-left: 40px; - } + } */ .item:active { background: var(--itemActiveBackground, #b9daff); From bc2b840c8c6f9b01d97c590680700cc5ae3d72c2 Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:32:58 +1000 Subject: [PATCH 047/635] change group header default --- package-lock.json | 971 ++++++++++++++++++++++++++++++++++++++++++++++ src/Item.svelte | 5 +- 2 files changed, 975 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..7fbb0aac --- /dev/null +++ b/package-lock.json @@ -0,0 +1,971 @@ +{ + "name": "svelte-select", + "version": "3.6.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/polyfill": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", + "integrity": "sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==", + "dev": true, + "requires": { + "core-js": "^2.5.7", + "regenerator-runtime": "^0.11.1" + } + }, + "@polka/url": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", + "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/node": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.0.tgz", + "integrity": "sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A==", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diff": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", + "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "find": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", + "integrity": "sha1-yGyHrxqxjyIrvjjeyGy8dg0Wpvs=", + "dev": true, + "requires": { + "traverse-chain": "~0.1.0" + } + }, + "find-in-files": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/find-in-files/-/find-in-files-0.5.0.tgz", + "integrity": "sha512-VraTc6HdtdSHmAp0yJpAy20yPttGKzyBWc7b7FPnnsX9TOgmKx0g9xajizpF/iuu4IvNK4TP0SpyBT9zAlwG+g==", + "dev": true, + "requires": { + "find": "^0.1.5", + "q": "^1.0.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "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==", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "namey-mcnameface": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/namey-mcnameface/-/namey-mcnameface-1.0.3.tgz", + "integrity": "sha1-hoWXOOPnDZWKIZaijglTDJS6iNA=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-ms": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", + "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "plur": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", + "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", + "dev": true + }, + "port-authority": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/port-authority/-/port-authority-1.0.5.tgz", + "integrity": "sha512-3nhtaK54aIJrL+D08Lt8AoE10Yz8BOi0gxFlGHCCYFFJ3/oeVdca4AGw5Bzw9Vr1Ntil0fU4ZiG8I3fLhQEnjg==", + "dev": true + }, + "pretty-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", + "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", + "dev": true, + "requires": { + "is-finite": "^1.0.1", + "parse-ms": "^1.0.0", + "plur": "^1.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "re-emitter": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.4.tgz", + "integrity": "sha512-C0SIXdXDSus2yqqvV7qifnb4NoWP7mEBXJq3axci301mXHCZb8Djwm4hrEZo4UeXRaEnfjH98uQ8EBppk2oNWA==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "require-nocache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/require-nocache/-/require-nocache-1.0.0.tgz", + "integrity": "sha1-pmXQtgoH6CSYdXkKTTUCGdPIX6M=", + "dev": true + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "resolve": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", + "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "0.66.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.66.6.tgz", + "integrity": "sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "*" + } + }, + "rollup-plugin-commonjs": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", + "integrity": "sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w==", + "dev": true, + "requires": { + "estree-walker": "^0.6.0", + "magic-string": "^0.25.2", + "resolve": "^1.10.0", + "rollup-pluginutils": "^2.6.0" + } + }, + "rollup-plugin-html": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-html/-/rollup-plugin-html-0.2.1.tgz", + "integrity": "sha1-oYYuyoeuVLZ3aJ0NQTORHoImRj0=", + "dev": true, + "requires": { + "html-minifier": "^3.0.2", + "rollup-pluginutils": "^1.5.0" + }, + "dependencies": { + "estree-walker": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", + "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", + "dev": true + }, + "rollup-pluginutils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", + "dev": true, + "requires": { + "estree-walker": "^0.2.1", + "minimatch": "^3.0.2" + } + } + } + }, + "rollup-plugin-node-resolve": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz", + "integrity": "sha512-t/64I6l7fZ9BxqD3XlX4ZeO6+5RLKyfpwE2CiPNUKa+GocPlQhf/C208ou8y3AwtNsc6bjSk/8/6y/YAyxCIvw==", + "dev": true, + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.10.0" + } + }, + "rollup-plugin-svelte": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.1.tgz", + "integrity": "sha512-wc93cN66sRpX6uFljVFqvWT6NU3V5ab/uLXKt2UiARuexFU/ctolzkmdXM7WM5iKdTX9scToS9sabJTJV4DUMA==", + "dev": true, + "requires": { + "require-relative": "^0.8.7", + "rollup-pluginutils": "^2.8.2", + "sourcemap-codec": "^1.4.8" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "sirv": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.2.5.tgz", + "integrity": "sha512-q7F1VElkj/WPrXwWsdHK9gqi2rd94oaMQc3VtN8N1TNHrKxlsd7hGsPFiOIodRxre8eHCV1XK1iqC1BDaZ+IKA==", + "dev": true, + "requires": { + "@polka/url": "^0.5.0", + "mime": "^2.3.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "svelte": { + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.20.1.tgz", + "integrity": "sha512-m/dw52BZf+p6KYnyKLErIcGalu4pwJrQbUM7VZriRw6ZlJj1qMAZsLcIWzEB3I0hhdJwkKb7LrrvUIeqmbO92Q==", + "dev": true + }, + "tap-diff": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/tap-diff/-/tap-diff-0.1.1.tgz", + "integrity": "sha1-j78zM9hWQ/7qG/F1m5CCCwSjfd8=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "diff": "^2.2.1", + "duplexer": "^0.1.1", + "figures": "^1.4.0", + "pretty-ms": "^2.1.0", + "tap-parser": "^1.2.2", + "through2": "^2.0.0" + } + }, + "tap-dot": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tap-dot/-/tap-dot-2.0.0.tgz", + "integrity": "sha512-7N1yPcRDgdfHCUbG6lZ0hXo53NyXhKIjJNhqKBixl9HVEG4QasG16Nlvr8wRnqr2ZRYVWmbmxwF3NOBbTLtQLQ==", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "tap-out": "^1.3.2", + "through2": "^2.0.0" + } + }, + "tap-out": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-1.4.2.tgz", + "integrity": "sha1-yQfsG/lAURHQiCY+kvVgi4jLs3o=", + "dev": true, + "requires": { + "re-emitter": "^1.0.0", + "readable-stream": "^2.0.0", + "split": "^1.0.0", + "trim": "0.0.1" + } + }, + "tap-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-1.3.2.tgz", + "integrity": "sha1-EgxQiciMPIp5PvKIhn3jIeGPjCI=", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "inherits": "~2.0.1", + "js-yaml": "^3.2.7", + "readable-stream": "^2" + } + }, + "tape-modern": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tape-modern/-/tape-modern-1.1.2.tgz", + "integrity": "sha512-0EWihNQ0t1bMR3fxw2ulmei+YMcyXQucg1mRvsz7cB986IorREwpNm/4+CtLtv4pUP7Z9LDywGKThRfngy/Puw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE=", + "dev": true + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/src/Item.svelte b/src/Item.svelte index 51fefd54..0d71e958 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -30,8 +30,11 @@ white-space: nowrap; } + /* Change default groupheaders */ + .groupHeader { - text-transform: var(--groupTitleTextTransform, uppercase); + /* text-transform: var(--groupTitleTextTransform, uppercase); */ + font-weight: 700; } /* remove this for centre alignment */ From 05706120dbfd8bc34ad414e0699f68a843987bd9 Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:36:52 +1000 Subject: [PATCH 048/635] revert text-transform --- src/Item.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Item.svelte b/src/Item.svelte index 0d71e958..1f8d3087 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -33,7 +33,7 @@ /* Change default groupheaders */ .groupHeader { - /* text-transform: var(--groupTitleTextTransform, uppercase); */ + text-transform: var(--groupTitleTextTransform, uppercase); font-weight: 700; } From ae4173be3e9395c7d9eaf316e1fb161ee1e53275 Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:39:36 +1000 Subject: [PATCH 049/635] font weight --- src/List.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/List.svelte b/src/List.svelte index 4c6ea34e..ecd6be58 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -276,6 +276,7 @@ color: var(--groupTitleColor, #8f8f8f); cursor: default; font-size: var(--groupTitleFontSize, 12px); + font-weight: 700; height: var(--height, 42px); line-height: var(--height, 42px); padding: var(--groupTitlePadding, 0 20px); From 2393326fe56eb810aad3ff9230f705e29179fcc1 Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:40:32 +1000 Subject: [PATCH 050/635] smaller font weight smaller font weight --- src/List.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/List.svelte b/src/List.svelte index ecd6be58..b8bf24fb 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -276,7 +276,7 @@ color: var(--groupTitleColor, #8f8f8f); cursor: default; font-size: var(--groupTitleFontSize, 12px); - font-weight: 700; + font-weight: 600; height: var(--height, 42px); line-height: var(--height, 42px); padding: var(--groupTitlePadding, 0 20px); From d245573f493c825fefa851aa46b789389809a356 Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:49:08 +1000 Subject: [PATCH 051/635] add variables --- docs/theming_variables.md | 1 + src/Item.svelte | 9 ++------- src/List.svelte | 2 +- test/public/index.html | 1 + 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 27390660..b63cd9a3 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -24,6 +24,7 @@ You can override the following variables to style a Select component. - `--groupTitleFontSize` - `--groupTitlePadding` - `--groupTitleTextTransform` +- `groupTitleFontWeight` - `--height` - `--indicatorColor` - `--indicatorFill` diff --git a/src/Item.svelte b/src/Item.svelte index 1f8d3087..0b553b75 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -30,18 +30,13 @@ white-space: nowrap; } - /* Change default groupheaders */ - .groupHeader { text-transform: var(--groupTitleTextTransform, uppercase); - font-weight: 700; } -/* remove this for centre alignment */ - - /* .groupItem { + .groupItem { padding-left: 40px; - } */ + } .item:active { background: var(--itemActiveBackground, #b9daff); diff --git a/src/List.svelte b/src/List.svelte index b8bf24fb..fad25a46 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -276,7 +276,7 @@ color: var(--groupTitleColor, #8f8f8f); cursor: default; font-size: var(--groupTitleFontSize, 12px); - font-weight: 600; + font-weight: var(--groupTitleFontWeight, 600); height: var(--height, 42px); line-height: var(--height, 42px); padding: var(--groupTitlePadding, 0 20px); diff --git a/test/public/index.html b/test/public/index.html index c7de76e8..93c631b5 100644 --- a/test/public/index.html +++ b/test/public/index.html @@ -80,6 +80,7 @@ --groupTitleFontSize: 12px; --groupTitlePadding: 0 20px; --groupTitleTextTransform: uppercase; + --groupTitleFontWeight: 600; --listEmptyTextAlign: center; --listEmptyPadding: 20px 0; --listEmptyColor: #78848F; From 632b8406f072157888f670a3bafab2d32f61c7a7 Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:54:06 +1000 Subject: [PATCH 052/635] add group padding left --- docs/theming_variables.md | 3 ++- src/Item.svelte | 2 +- test/public/index.html | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index b63cd9a3..68580d61 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -24,7 +24,8 @@ You can override the following variables to style a Select component. - `--groupTitleFontSize` - `--groupTitlePadding` - `--groupTitleTextTransform` -- `groupTitleFontWeight` +- `--groupTitleFontWeight` +- `--groupItemPaddingLeft` - `--height` - `--indicatorColor` - `--indicatorFill` diff --git a/src/Item.svelte b/src/Item.svelte index 0b553b75..9f4f817e 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -35,7 +35,7 @@ } .groupItem { - padding-left: 40px; + padding-left: var(--groupItemPaddingLeft, 40px); } .item:active { diff --git a/test/public/index.html b/test/public/index.html index 93c631b5..51c973fa 100644 --- a/test/public/index.html +++ b/test/public/index.html @@ -81,6 +81,7 @@ --groupTitlePadding: 0 20px; --groupTitleTextTransform: uppercase; --groupTitleFontWeight: 600; + --groupItemPaddingLeft: 40px; --listEmptyTextAlign: center; --listEmptyPadding: 20px 0; --listEmptyColor: #78848F; From 79114f865c68fa216a92359c1b191753f59143dc Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:58:39 +1000 Subject: [PATCH 053/635] add item font colour --- docs/theming_variables.md | 1 + src/Item.svelte | 1 + test/public/index.html | 1 + 3 files changed, 3 insertions(+) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 68580d61..d8b5514b 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -43,6 +43,7 @@ You can override the following variables to style a Select component. - `--itemIsActiveBG` - `--itemIsActiveColor` - `--itemPadding` +- `--itemColor` - `--listBackground` - `--listBorderRadius` - `--listEmptyColor` diff --git a/src/Item.svelte b/src/Item.svelte index 9f4f817e..a3b59d2a 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -25,6 +25,7 @@ height: var(--height, 42px); line-height: var(--height, 42px); padding: var(--itemPadding, 0 20px); + color: var(--itemColor, #000000) text-overflow: ellipsis; overflow: hidden; white-space: nowrap; diff --git a/test/public/index.html b/test/public/index.html index 51c973fa..c818cccd 100644 --- a/test/public/index.html +++ b/test/public/index.html @@ -86,6 +86,7 @@ --listEmptyPadding: 20px 0; --listEmptyColor: #78848F; --itemPadding: 0 20px; + --itemColor: #000000; --itemActiveBg: #b9daff; --itemIsActiveBG: #007aff; --itemIsActiveColor: #fff; From 2d0786eee7e7d2a37c4a21c6f37a80b48865eb34 Mon Sep 17 00:00:00 2001 From: John Trieu Nguyen Date: Tue, 21 Apr 2020 00:59:14 +1000 Subject: [PATCH 054/635] missing semi colon --- src/Item.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Item.svelte b/src/Item.svelte index a3b59d2a..297f9ca7 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -25,7 +25,7 @@ height: var(--height, 42px); line-height: var(--height, 42px); padding: var(--itemPadding, 0 20px); - color: var(--itemColor, #000000) + color: var(--itemColor, #000000); text-overflow: ellipsis; overflow: hidden; white-space: nowrap; From f0042fe494255826ddc7ad4f64560b4479fbd1f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2020 21:20:09 +0000 Subject: [PATCH 055/635] Bump https-proxy-agent from 2.2.1 to 2.2.4 Bumps [https-proxy-agent](https://github.com/TooTallNate/node-https-proxy-agent) from 2.2.1 to 2.2.4. - [Release notes](https://github.com/TooTallNate/node-https-proxy-agent/releases) - [Commits](https://github.com/TooTallNate/node-https-proxy-agent/compare/2.2.1...2.2.4) Signed-off-by: dependabot[bot] --- yarn.lock | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/yarn.lock b/yarn.lock index 085e2b5a..f7f182d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,10 +25,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" integrity sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A== -agent-base@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: es6-promisify "^5.0.0" @@ -191,9 +191,9 @@ duplexer@^0.1.1: integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= es6-promise@^4.0.3: - version "4.2.5" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" - integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-promisify@^5.0.0: version "5.0.0" @@ -384,11 +384,11 @@ html-minifier@^3.0.2: uglify-js "3.4.x" https-proxy-agent@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" - integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== dependencies: - agent-base "^4.1.0" + agent-base "^4.3.0" debug "^3.1.0" inflight@^1.0.4: @@ -570,9 +570,9 @@ ms@2.0.0: integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== namey-mcnameface@^1.0.3: version "1.0.3" From 8c5b2c81d695803855e7902503dd3cddcb801c92 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 21 Apr 2020 07:25:57 +1000 Subject: [PATCH 056/635] avoid breaking change with inherit for var fallback --- src/Item.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Item.svelte b/src/Item.svelte index 297f9ca7..a31606b9 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -25,7 +25,7 @@ height: var(--height, 42px); line-height: var(--height, 42px); padding: var(--itemPadding, 0 20px); - color: var(--itemColor, #000000); + color: var(--itemColor, inherit); text-overflow: ellipsis; overflow: hidden; white-space: nowrap; From b9e3a90b596a95748973111bb5f522eeced9f4d6 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 21 Apr 2020 07:28:20 +1000 Subject: [PATCH 057/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4793ec4..7f829da0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.7.0 + +* Added new CSS vars for groupTitleFontWeight, groupItemPaddingLeft and itemColor - thanks to @john-trieu-nguyen + ## 3.6.2 * CSS vars padding default fix From d5845b50bf3b8606d180b0bbffb458d23681be56 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 21 Apr 2020 07:28:37 +1000 Subject: [PATCH 058/635] 3.7.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7fbb0aac..8cb2adb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.6.2", + "version": "3.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 07e85d72..405c8477 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.6.2", + "version": "3.7.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A +``` + ## Events | Event Name | Callback | Description | From cc2578380f45e9270f1e80cd433e418fae670fde Mon Sep 17 00:00:00 2001 From: Kevin Heard Date: Thu, 14 May 2020 09:30:05 +1000 Subject: [PATCH 060/635] fixed: hideEmptyState state. '.empty' selector is always null when the asserstion runs --- test/src/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/index.js b/test/src/index.js index bfce38c2..07b9e251 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1721,6 +1721,8 @@ test('when hideEmptyState true then do not show "no options" div ', async (t) => } }); + await wait(0); + t.ok(!document.querySelector('.empty')); select.$destroy(); From 4e95ab5ca5f379fbbdfb27f4977ca5f60ac6c4f2 Mon Sep 17 00:00:00 2001 From: Norbert Hanauer Date: Tue, 19 May 2020 17:12:09 +0200 Subject: [PATCH 061/635] Fix groupHeader selection on enter --- src/Select.svelte | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index 37b6e932..b0225266 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -550,19 +550,22 @@ if (detail) { const item = Object.assign({}, detail); - if (isMulti) { - selectedValue = selectedValue ? selectedValue.concat([item]) : [item]; - } else { - selectedValue = item; - } + if (!item.isGroupHeader || item.isSelectable) { - resetFilter(); - selectedValue = selectedValue; + if (isMulti) { + selectedValue = selectedValue ? selectedValue.concat([item]) : [item]; + } else { + selectedValue = item; + } - setTimeout(() => { - listOpen = false; - activeSelectedValue = undefined; - }); + resetFilter(); + selectedValue = selectedValue; + + setTimeout(() => { + listOpen = false; + activeSelectedValue = undefined; + }); + } } }); @@ -618,7 +621,7 @@
- {@html getSelectionLabel(item)} + {@html getSelectionLabel(item)}
diff --git a/src/VirtualList.svelte b/src/VirtualList.svelte index c1fc9458..21377231 100644 --- a/src/VirtualList.svelte +++ b/src/VirtualList.svelte @@ -161,4 +161,4 @@ {/each} - \ No newline at end of file + diff --git a/src/postcss.config.js b/src/postcss.config.js index da8ddc6a..209b8bf0 100644 --- a/src/postcss.config.js +++ b/src/postcss.config.js @@ -1,2 +1,2 @@ //ignore this file... just a fix for a stupid webpack + yarn link issue -module.exports = {}; \ No newline at end of file +module.exports = {}; diff --git a/src/utils/debounce.js b/src/utils/debounce.js index 3a9916bc..c6e5f009 100644 --- a/src/utils/debounce.js +++ b/src/utils/debounce.js @@ -4,18 +4,18 @@ export default function debounce(func, wait, immediate) { return function executedFunction() { let context = this; let args = arguments; - + let later = function() { timeout = null; if (!immediate) func.apply(context, args); }; let callNow = immediate && !timeout; - + clearTimeout(timeout); timeout = setTimeout(later, wait); - + if (callNow) func.apply(context, args); }; }; diff --git a/src/utils/isOutOfViewport.js b/src/utils/isOutOfViewport.js index aa149c59..d05501cb 100644 --- a/src/utils/isOutOfViewport.js +++ b/src/utils/isOutOfViewport.js @@ -10,4 +10,3 @@ export default function(elem) { return out; }; - diff --git a/test/public/index.html b/test/public/index.html index 914a2553..841bec5b 100644 --- a/test/public/index.html +++ b/test/public/index.html @@ -83,7 +83,7 @@ --groupTitleTextTransform: uppercase; --groupTitleFontWeight: 600; --groupItemPaddingLeft: 40px; - --listEmptyTextAlign: center; + --listEmptyTextAlign: center; --listEmptyPadding: 20px 0; --listEmptyColor: #78848F; --itemPadding: 0 20px; diff --git a/test/src/index.js b/test/src/index.js index 4f09d440..cf77e3d9 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -294,10 +294,10 @@ test('select view updates with selectedValue updates', async (t) => { const select = new Select({ target, }); - + await handleSet(select, {selectedValue: {value: 'chips', label: 'Chips'}}); t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); - + select.$destroy(); }); @@ -338,7 +338,7 @@ test('Select opens List populated with items', async (t) => { await querySelectorClick('.selectContainer'); t.ok(target.querySelector('.listItem')); - + select.$destroy(); }); @@ -1134,7 +1134,7 @@ test('items should be grouped by groupBy expression', async (t) => { t.ok(item.isGroupHeader || prevItemIsHeaderOrInSameGroup); } }); - + select.$destroy(); }); @@ -1148,7 +1148,7 @@ test('clicking group header should not make a selected', async (t) => { groupBy: (item) => item.group } }); - + await wait(0); await querySelectorClick('.listGroupTitle'); @@ -1166,7 +1166,7 @@ test('when groupBy, no active item and keydown enter is fired then list should c groupBy: (item) => item.group } }); - + await wait(0); await querySelectorClick('.selectContainer'); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); @@ -1843,7 +1843,7 @@ test('when items in list filter or update then first item in list should highlig await handleKeyboard('ArrowDown'); await handleKeyboard('ArrowDown'); await handleKeyboard('ArrowDown'); - + t.ok(document.querySelector('.hover').innerHTML === 'Cake'); await handleSet(select, {filterText: 'c'}); t.ok(document.querySelector('.hover').innerHTML === 'Chocolate'); @@ -1895,7 +1895,7 @@ test('when isMulti and item is selected or state changes then check selectedValu t.ok(!item); item = false; await handleSet(select, {selectedValue: [{value: 'pizza', label: 'Pizza'}]}); - + t.ok(item); select.$destroy(); }); @@ -1923,7 +1923,7 @@ test('when isFocused turns to false then check Select is no longer in focus', as isFocused: false, }) }, 0) - + selectSecond.$set({ isFocused: true }) @@ -1935,7 +1935,7 @@ test('when isFocused turns to false then check Select is no longer in focus', as await wait(0); t.ok(selectSecond.isFocused); - t.ok(!select.isFocused); + t.ok(!select.isFocused); selectSecond.$destroy(); select.$destroy(); @@ -1950,7 +1950,7 @@ test('when items and loadOptions method are both supplied then fallback to items getOptionLabel: (option) => option.name, getSelectionLabel: (option) => option.name, loadOptions: getPosts, - optionIdentifier: 'id', + optionIdentifier: 'id', items, isFocused: true, listOpen: true @@ -2083,7 +2083,7 @@ test('when loadOptions method is supplied but filterText is empty then do not ru await wait(500); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); t.ok(document.querySelector('.customItem_name').innerHTML === 'Juniper Wheat Beer'); - select.$set({selectedValue: undefined, filterText: ''}); + select.$set({selectedValue: undefined, filterText: ''}); await wait(0); select.$set({listOpen: true}); await wait(0); @@ -2246,8 +2246,8 @@ test('when isMulti, groupBy and selectedValue are supplied then list should be f items: _items, groupBy: (item) => item.group, optionIdentifier: 'id', - getSelectionLabel: (item) => item.name, - getOptionLabel: (item) => item.name, + getSelectionLabel: (item) => item.name, + getOptionLabel: (item) => item.name, selectedValue: [{ id: 2, name: "Bar", group: "second" }], listOpen: true } @@ -2331,7 +2331,7 @@ test('When isCreatable enabled, creator is not displayed when duplicate item val const listItems = document.querySelectorAll('.listContainer > .listItem'); t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, dupeValueForCheck); - select.$destroy(); + select.$destroy(); }); test('When creator selected, selected item is set to created item', async (t) => { @@ -2399,7 +2399,7 @@ test('When creator is selected multiple times, items are all added to multi sele isMulti: true } }); - + select.$set({ filterText: filterTextForItem1 }); await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); @@ -2429,7 +2429,7 @@ test('When isMulti and an items remove icon is clicked then item should be remov } }); - await querySelectorClick('.multiSelectItem_clear'); + await querySelectorClick('.multiSelectItem_clear'); t.ok(select.selectedValue[0].value === 'cake') await querySelectorClick('.multiSelectItem_clear'); t.ok(select.selectedValue === undefined); @@ -2694,7 +2694,7 @@ test('When showIndicator prop is true always show chevron on Select', async (t) test('When items and loadItems then listOpen should be false', async (t) => { const select = new Select({ target, - props: { + props: { getSelectionLabel: (option) => option.name, getOptionLabel: (option) => option.name, loadOptions: getPosts, @@ -2703,7 +2703,7 @@ test('When items and loadItems then listOpen should be false', async (t) => { id: 1, name: 'Initial Items #1' }] - + } }); @@ -2753,7 +2753,7 @@ test('When noOptionsMessage is changed after List component has been created the select.$set({noOptionsMessage: 'THIRD'}); await wait(0); t.ok(document.querySelector('.empty').innerHTML === 'THIRD'); - + select.$destroy(); }); @@ -2762,10 +2762,10 @@ test('When loadOptions promise is rejected then dispatch error', async (t) => { const select = new Select({ target, props: { - loadOptions: rejectPromise, + loadOptions: rejectPromise, }, }); - + let eventData = undefined; const off = select.$on('error', event => { eventData = event; From f1ea297e97a6c327303a2aa4e07355e4efb3ef8f Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Sat, 31 Oct 2020 13:13:58 +0100 Subject: [PATCH 117/635] remove duplicate handleClear() --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 3966aaa9..6bc85421 100644 --- a/README.md +++ b/README.md @@ -132,15 +132,6 @@ export function handleClear() { } ``` -```js -export function handleClear() { - selectedValue = undefined; - listOpen = false; - dispatch("clear", selectedValue); - handleFocus(); -} -``` - ```js export let loadOptions = undefined; // if used must return a Promise that updates 'items' ``` From 5e155e365c72120f6b6ebe5feafb7a86a929cb76 Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Sat, 31 Oct 2020 12:41:02 +0100 Subject: [PATCH 118/635] dispatch loaded when loadOptions resolves --- README.md | 1 + src/Select.svelte | 1 + test/src/index.js | 61 ++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3966aaa9..bc8872cf 100644 --- a/README.md +++ b/README.md @@ -188,6 +188,7 @@ You can also use the `inputStyles` prop to write in any override styles needed f |------|------|----------| | select | selectedValue | fires when selectedValue changes | clear | - | fires when clear all is invoked +| loaded | { items } | fires when `loadOptions` resolves | error | { type, details } | fires when error is caught ```html diff --git a/src/Select.svelte b/src/Select.svelte index 9365ab70..851eaaa2 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -109,6 +109,7 @@ if (res) { items = [...res]; + dispatch("loaded", { items }); } else { items = []; } diff --git a/test/src/index.js b/test/src/index.js index cf77e3d9..4f48e80f 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -60,6 +60,13 @@ assert.htmlEqual = (a, b) => { assert.equal(normalizeHtml(a), normalizeHtml(b)); }; +assert.arrayEqual = (a, b) => { + assert.ok(Array.isArray(a)); + assert.ok(Array.isArray(b)); + assert.equal(a.length, b.length); + assert.ok(a.every((val, i) => val === b[i])); +}; + // tests test('with no data creates default elements', async (t) => { const testTemplate = new SelectDefault({ @@ -2758,6 +2765,36 @@ test('When noOptionsMessage is changed after List component has been created the }); +test('When loadOptions promise is resolved then dispatch loaded', async (t) => { + const select = new Select({ + target, + props: { + loadOptions: resolvePromise, + }, + }); + + let loadedEventData = undefined; + const loadedOff = select.$on('loaded', event => { + loadedEventData = event; + }); + let errorEventData = undefined; + const errorOff = select.$on('error', event => { + errorEventData = event; + }) + + await wait(0); + select.$set({listOpen: true}); + await wait(0); + select.$set({filterText: 'test'}); + await wait(500); + t.arrayEqual(loadedEventData.detail.items, ['a', 'b', 'c']); + t.equal(errorEventData, undefined); + + loadedOff(); + errorOff(); + select.$destroy(); +}); + test('When loadOptions promise is rejected then dispatch error', async (t) => { const select = new Select({ target, @@ -2766,9 +2803,13 @@ test('When loadOptions promise is rejected then dispatch error', async (t) => { }, }); - let eventData = undefined; - const off = select.$on('error', event => { - eventData = event; + let loadedEventData = undefined; + const loadedOff = select.$on('loaded', event => { + loadedEventData = event; + }); + let errorEventData = undefined; + const errorOff = select.$on('error', event => { + errorEventData = event; }); await wait(0); @@ -2776,10 +2817,12 @@ test('When loadOptions promise is rejected then dispatch error', async (t) => { await wait(0); select.$set({filterText: 'test'}); await wait(500); - t.ok(eventData.detail.type === 'loadOptions'); - t.ok(eventData.detail.details === 'error 123'); + t.equal(loadedEventData, undefined); + t.equal(errorEventData.detail.type, 'loadOptions'); + t.equal(errorEventData.detail.details, 'error 123'); - off() + loadedOff(); + errorOff(); select.$destroy(); }); @@ -2816,6 +2859,12 @@ function getPosts(filterText) { }); } +function resolvePromise() { + return new Promise((resolve, reject) => { + resolve(['a', 'b', 'c']); + }) +} + function rejectPromise() { return new Promise((resolve, reject) => { reject('error 123'); From f97039ed3f1620c7d8c4917d619229430ddf5053 Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Sun, 1 Nov 2020 10:49:34 +0100 Subject: [PATCH 119/635] Remove package-lock.json --- package-lock.json | 971 ---------------------------------------------- 1 file changed, 971 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index afe7335f..00000000 --- a/package-lock.json +++ /dev/null @@ -1,971 +0,0 @@ -{ - "name": "svelte-select", - "version": "3.13.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/polyfill": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", - "integrity": "sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==", - "dev": true, - "requires": { - "core-js": "^2.5.7", - "regenerator-runtime": "^0.11.1" - } - }, - "@polka/url": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", - "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/node": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.0.tgz", - "integrity": "sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A==", - "dev": true - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "diff": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", - "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "find": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", - "integrity": "sha1-yGyHrxqxjyIrvjjeyGy8dg0Wpvs=", - "dev": true, - "requires": { - "traverse-chain": "~0.1.0" - } - }, - "find-in-files": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/find-in-files/-/find-in-files-0.5.0.tgz", - "integrity": "sha512-VraTc6HdtdSHmAp0yJpAy20yPttGKzyBWc7b7FPnnsX9TOgmKx0g9xajizpF/iuu4IvNK4TP0SpyBT9zAlwG+g==", - "dev": true, - "requires": { - "find": "^0.1.5", - "q": "^1.0.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "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==", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "namey-mcnameface": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/namey-mcnameface/-/namey-mcnameface-1.0.3.tgz", - "integrity": "sha1-hoWXOOPnDZWKIZaijglTDJS6iNA=", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "dev": true - }, - "port-authority": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/port-authority/-/port-authority-1.0.5.tgz", - "integrity": "sha512-3nhtaK54aIJrL+D08Lt8AoE10Yz8BOi0gxFlGHCCYFFJ3/oeVdca4AGw5Bzw9Vr1Ntil0fU4ZiG8I3fLhQEnjg==", - "dev": true - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "dev": true, - "requires": { - "is-finite": "^1.0.1", - "parse-ms": "^1.0.0", - "plur": "^1.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "puppeteer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", - "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^2.2.1", - "mime": "^2.0.3", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - } - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "re-emitter": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.4.tgz", - "integrity": "sha512-C0SIXdXDSus2yqqvV7qifnb4NoWP7mEBXJq3axci301mXHCZb8Djwm4hrEZo4UeXRaEnfjH98uQ8EBppk2oNWA==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "require-nocache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/require-nocache/-/require-nocache-1.0.0.tgz", - "integrity": "sha1-pmXQtgoH6CSYdXkKTTUCGdPIX6M=", - "dev": true - }, - "require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true - }, - "resolve": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", - "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "0.66.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.66.6.tgz", - "integrity": "sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "@types/node": "*" - } - }, - "rollup-plugin-commonjs": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", - "integrity": "sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w==", - "dev": true, - "requires": { - "estree-walker": "^0.6.0", - "magic-string": "^0.25.2", - "resolve": "^1.10.0", - "rollup-pluginutils": "^2.6.0" - } - }, - "rollup-plugin-html": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-html/-/rollup-plugin-html-0.2.1.tgz", - "integrity": "sha1-oYYuyoeuVLZ3aJ0NQTORHoImRj0=", - "dev": true, - "requires": { - "html-minifier": "^3.0.2", - "rollup-pluginutils": "^1.5.0" - }, - "dependencies": { - "estree-walker": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", - "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", - "dev": true - }, - "rollup-pluginutils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", - "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", - "dev": true, - "requires": { - "estree-walker": "^0.2.1", - "minimatch": "^3.0.2" - } - } - } - }, - "rollup-plugin-node-resolve": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz", - "integrity": "sha512-t/64I6l7fZ9BxqD3XlX4ZeO6+5RLKyfpwE2CiPNUKa+GocPlQhf/C208ou8y3AwtNsc6bjSk/8/6y/YAyxCIvw==", - "dev": true, - "requires": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.10.0" - } - }, - "rollup-plugin-svelte": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.1.tgz", - "integrity": "sha512-wc93cN66sRpX6uFljVFqvWT6NU3V5ab/uLXKt2UiARuexFU/ctolzkmdXM7WM5iKdTX9scToS9sabJTJV4DUMA==", - "dev": true, - "requires": { - "require-relative": "^0.8.7", - "rollup-pluginutils": "^2.8.2", - "sourcemap-codec": "^1.4.8" - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "sirv": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.2.5.tgz", - "integrity": "sha512-q7F1VElkj/WPrXwWsdHK9gqi2rd94oaMQc3VtN8N1TNHrKxlsd7hGsPFiOIodRxre8eHCV1XK1iqC1BDaZ+IKA==", - "dev": true, - "requires": { - "@polka/url": "^0.5.0", - "mime": "^2.3.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "svelte": { - "version": "3.20.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.20.1.tgz", - "integrity": "sha512-m/dw52BZf+p6KYnyKLErIcGalu4pwJrQbUM7VZriRw6ZlJj1qMAZsLcIWzEB3I0hhdJwkKb7LrrvUIeqmbO92Q==", - "dev": true - }, - "tap-diff": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/tap-diff/-/tap-diff-0.1.1.tgz", - "integrity": "sha1-j78zM9hWQ/7qG/F1m5CCCwSjfd8=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "diff": "^2.2.1", - "duplexer": "^0.1.1", - "figures": "^1.4.0", - "pretty-ms": "^2.1.0", - "tap-parser": "^1.2.2", - "through2": "^2.0.0" - } - }, - "tap-dot": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tap-dot/-/tap-dot-2.0.0.tgz", - "integrity": "sha512-7N1yPcRDgdfHCUbG6lZ0hXo53NyXhKIjJNhqKBixl9HVEG4QasG16Nlvr8wRnqr2ZRYVWmbmxwF3NOBbTLtQLQ==", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "tap-out": "^1.3.2", - "through2": "^2.0.0" - } - }, - "tap-out": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-1.4.2.tgz", - "integrity": "sha1-yQfsG/lAURHQiCY+kvVgi4jLs3o=", - "dev": true, - "requires": { - "re-emitter": "^1.0.0", - "readable-stream": "^2.0.0", - "split": "^1.0.0", - "trim": "0.0.1" - } - }, - "tap-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-1.3.2.tgz", - "integrity": "sha1-EgxQiciMPIp5PvKIhn3jIeGPjCI=", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "inherits": "~2.0.1", - "js-yaml": "^3.2.7", - "readable-stream": "^2" - } - }, - "tape-modern": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/tape-modern/-/tape-modern-1.1.2.tgz", - "integrity": "sha512-0EWihNQ0t1bMR3fxw2ulmei+YMcyXQucg1mRvsz7cB986IorREwpNm/4+CtLtv4pUP7Z9LDywGKThRfngy/Puw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "traverse-chain": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", - "integrity": "sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE=", - "dev": true - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } - } - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} From f05b098c41e0b5d1d1c5657bb106120e1abaaedd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Nov 2020 20:43:34 +0000 Subject: [PATCH 120/635] Bump puppeteer from 1.11.0 to 1.13.0 Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 1.11.0 to 1.13.0. - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/v1.11.0...v1.13.0) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 449f105f..0eef1971 100644 --- a/yarn.lock +++ b/yarn.lock @@ -700,9 +700,9 @@ proxy-from-env@^1.0.0: integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= puppeteer@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.11.0.tgz#63cdbe12b07275cd6e0b94bce41f3fcb20305770" - integrity sha512-iG4iMOHixc2EpzqRV+pv7o3GgmU2dNYEMkvKwSaQO/vMZURakwSOn/EYJ6OIRFYOque1qorzIBvrytPIQB3YzQ== + version "1.13.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.13.0.tgz#187ccf5ed5caf08ed1291b262d033cc364bf88ab" + integrity sha512-LUXgvhjfB/P6IOUDAKxOcbCz9ISwBLL9UpKghYrcBDwrOGx1m60y0iN2M64mdAUbT4+7oZM5DTxOW7equa2fxQ== dependencies: debug "^4.1.0" extract-zip "^1.6.6" From aa3837c018fb53e2105b83074cdb64d58fd35f56 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 2 Nov 2020 07:55:10 +1100 Subject: [PATCH 121/635] 3.14.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2bffec21..dce22632 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.13.0", + "version": "3.14.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From 6cd8e044ed5bc5134f744263792aef6c3585b9ff Mon Sep 17 00:00:00 2001 From: stephenlrandall Date: Wed, 2 Dec 2020 16:15:07 -0800 Subject: [PATCH 126/635] selectedValue updates on items change --- src/Select.svelte | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Select.svelte b/src/Select.svelte index 8cea2167..91682477 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -132,6 +132,14 @@ } } + $: if (selectedValue) { + if (Array.isArray(selectedValue)) { + selectedValue = selectedValue.map(selection => items.find(item => item.value === selection.value)); + } else { + selectedValue = items.find(item => item.value === selectedValue.value); + } + } + $: { if (noOptionsMessage && list) list.$set({ noOptionsMessage }); } From 82ddb9cff9d8bcd2b856fd4676688693c3b39c64 Mon Sep 17 00:00:00 2001 From: stephenlrandall Date: Mon, 7 Dec 2020 19:07:19 -0800 Subject: [PATCH 127/635] edge case handling + new tests --- src/Select.svelte | 21 +++++++++++------- test/src/index.js | 56 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index 91682477..ffd2939a 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -121,6 +121,8 @@ $: disabled = isDisabled; + $: updateSelectedValueDisplay(items); + $: { if (typeof selectedValue === "string") { selectedValue = { @@ -132,14 +134,6 @@ } } - $: if (selectedValue) { - if (Array.isArray(selectedValue)) { - selectedValue = selectedValue.map(selection => items.find(item => item.value === selection.value)); - } else { - selectedValue = items.find(item => item.value === selectedValue.value); - } - } - $: { if (noOptionsMessage && list) list.$set({ noOptionsMessage }); } @@ -371,6 +365,17 @@ return noDuplicates; } + function updateSelectedValueDisplay(items) { + if (!items || items.length === 0 || items.some(item => typeof item !== "object")) return; + if (!selectedValue || (isMulti ? selectedValue.some(selection => !selection || !selection[optionIdentifier]) : !selectedValue[optionIdentifier])) return; + + if (Array.isArray(selectedValue)) { + selectedValue = selectedValue.map(selection => items.find(item => item[optionIdentifier] === selection[optionIdentifier]) || ""); + } else { + selectedValue = items.find(item => item[optionIdentifier] === selectedValue[optionIdentifier]) || ""; + } + } + async function setList(items) { await tick(); if (list) return list.$set({ items }); diff --git a/test/src/index.js b/test/src/index.js index 83e4ce6f..9d22da85 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -2000,7 +2000,7 @@ test('when items is just an array of strings then render list', async (t) => { select.$destroy(); }); -test('when selectedValue just a string then selectedValue should render', async (t) => { +test('when items are just strings then selectedValue should render', async (t) => { const items = ['one', 'two', 'three']; const select = new Select({ @@ -2832,6 +2832,60 @@ test('When loadOptions promise is rejected then dispatch error', async (t) => { select.$destroy(); }); +test('When items change then selectedValue should also update', async (t) => { + const select = new Select({ + target, + props: { + items, + selectedValue: {value: 'chips', label: 'Chips'}, + }, + }); + + await wait(0); + + select.$set({items: [ + {value: 'chocolate', label: 'Chocolate'}, + {value: 'pizza', label: 'Pizza'}, + {value: 'cake', label: 'Cake'}, + {value: 'chips', label: 'Loaded Fries'}, + {value: 'ice-cream', label: 'Ice Cream'}, + ]}); + + await wait(0); + + t.ok(select.selectedValue.label === 'Loaded Fries'); + t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Loaded Fries'); + + select.$destroy(); + + await wait(0); + + const multiSelect = new Select({ + target, + props: { + isMulti: true, + items, + selectedValue: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], + }, + }); + + await wait(0); + + multiSelect.$set({items: [ + {value: 'chocolate', label: 'Chocolate'}, + {value: 'pizza', label: 'Cheese Pizza'}, + {value: 'cake', label: 'Cake'}, + {value: 'chips', label: 'Loaded Fries'}, + {value: 'ice-cream', label: 'Ice Cream'}, + ]}); + + await wait(0); + + t.ok(multiSelect.selectedValue[0].label === 'Loaded Fries'); + t.ok(multiSelect.selectedValue[1].label === 'Cheese Pizza'); + + multiSelect.$destroy(); +}); function focus(element, setFocus) { return new Promise(fulfil => { From 9c5789a63b6139a56536386bbb2eb9752c9b916b Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 11 Dec 2020 08:23:18 +1100 Subject: [PATCH 128/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 646fd25c..864564d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.14.2 + +* Fix so selectedValue updates on items change - thanks to @stephenlrandall + ## 3.14.1 * Fix input attributes so the defaults can be overwritten From b8c939bb1c45f2002771d395ad31792d66603744 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 11 Dec 2020 08:23:40 +1100 Subject: [PATCH 129/635] 3.14.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 63603ba2..8ff4e0e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.14.1", + "version": "3.14.2", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A + ``` @@ -177,7 +182,7 @@ You can also use the `inputStyles` prop to write in any override styles needed f | Event Name | Callback | Description | |------|------|----------| -| select | selectedValue | fires when selectedValue changes +| select | { detail } | fires when selectedValue changes | clear | - | fires when clear all is invoked | loaded | { items } | fires when `loadOptions` resolves | error | { type, details } | fires when error is caught @@ -187,7 +192,8 @@ You can also use the `inputStyles` prop to write in any override styles needed f import Select from 'svelte-select'; let items = [...]; - function handleSelect(selectedVal) { + function handleSelect(event) { + // event.detail will contain the selected value ... } function onClear() { From 7d58ef16ee8005b953c5abac553dadaf6ca42e47 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sun, 13 Dec 2020 14:04:27 +1100 Subject: [PATCH 133/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 864564d6..2765b5c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.14.3 + +* Regression fix for 3.14.2 clearing selectedValue if not found in items - thanks to @frederikhors for reporting + ## 3.14.2 * Fix so selectedValue updates on items change - thanks to @stephenlrandall From d2373b3adcecde199d589053f7eb5bf7b2d7735c Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sun, 13 Dec 2020 14:04:50 +1100 Subject: [PATCH 134/635] 3.14.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ff4e0e0..d969bb81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.14.2", + "version": "3.14.3", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From 09abefa747d4039ca317eea4a0c0cb9ee851bdb4 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 22 Dec 2020 11:40:07 +0200 Subject: [PATCH 138/635] Update rollup-plugin-svelte to 6.1.1 The upgrade resolved build error "Package subpath './compiler.js' is not defined by "exports" This relates to: https://github.com/sveltejs/svelte/issues/5665 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c5a628a..00e4a3d0 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-html": "^0.2.1", "rollup-plugin-node-resolve": "^4.0.0", - "rollup-plugin-svelte": "^5.2.2", + "rollup-plugin-svelte": "^6.1.1", "sirv": "^0.2.2", "svelte": "^3.22.3", "tap-diff": "^0.1.1", From a8bf758460bfb569a6c9dad59a3effd7bfb93e25 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 22 Dec 2020 11:42:18 +0200 Subject: [PATCH 139/635] Add placeholderOpacity and disabledPlaceholderOpacity theming variables Closes: https://github.com/rob-balfre/svelte-select/issues/189 --- docs/theming_variables.md | 2 ++ src/Select.svelte | 2 ++ 2 files changed, 4 insertions(+) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 552ff0b3..1bb8f0a9 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -19,6 +19,7 @@ You can override the following variables to style a Select component. - `--disabledBorderColor` - `--disabledColor` - `--disabledPlaceholderColor` +- `--disabledPlaceholderOpacity` - `--errorBackground` - `--errorBorder` - `--groupItemPaddingLeft` @@ -79,6 +80,7 @@ You can override the following variables to style a Select component. - `--multiSelectPadding` - `--padding` - `--placeholderColor` +- `--placeholderOpacity` - `--selectedItemPadding` - `--spinnerColor` - `--spinnerHeight` diff --git a/src/Select.svelte b/src/Select.svelte index bff1d118..a5ef1050 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -671,6 +671,7 @@ .selectContainer input::placeholder { color: var(--placeholderColor, #78848f); + opacity: var(--placeholderOpacity, 1); } .selectContainer input:focus { @@ -693,6 +694,7 @@ .selectContainer.disabled input::placeholder { color: var(--disabledPlaceholderColor, #c1c6cc); + opacity: var(--disabledPlaceholderOpacity, 1); } .selectedItem { From 7b3f77dd50897631a3af8c9e6f98a77a0f6ead70 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 22 Dec 2020 11:56:32 +0200 Subject: [PATCH 140/635] Update yarn.lock --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0eef1971..9ceae00f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -835,10 +835,10 @@ rollup-plugin-node-resolve@^4.0.0: is-module "^1.0.0" resolve "^1.10.0" -rollup-plugin-svelte@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.2.tgz#709244243c79ae47394a6943a3d899516d4a610d" - integrity sha512-I+TJ2T+VLKGbKQcpeMJ4AR2ciROqTZNjxbiMiH4Cn1yByaB9OEuy3CnrgHHuWatQcPuF3yIViyKX7OlETWDKOQ== +rollup-plugin-svelte@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-6.1.1.tgz#66362cf0500fb7a848283ebcf19d289a60ef0871" + integrity sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow== dependencies: require-relative "^0.8.7" rollup-pluginutils "^2.8.2" From e1d513735f3ad11dcda2729ea24a8741dcf0762f Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 23 Dec 2020 07:54:30 +1100 Subject: [PATCH 141/635] CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7f3ae4a..b6d7d9d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 3.16.0 + +* New CSS custom props '--placeholderOpacity' and 'disabledPlaceholderOpacity' added - thanks to @tiaanduplessis + ## 3.15.0 * Added new prop multiFullItemClearable for easier clearable items when isMulti is true - thanks to @stephenlrandall From 7161aa1491ad684f08245d48afeb7ea3d6f694b4 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 23 Dec 2020 07:54:33 +1100 Subject: [PATCH 142/635] 3.16.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00e4a3d0..00e999b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.15.0", + "version": "3.16.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/Select.svelte", From 264ad6df464f5821a7b3a3c5a13f5d1a9c3fc03e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 18 Feb 2021 14:26:16 +1100 Subject: [PATCH 146/635] ClearIcon prop, filteredItems docs, cancelled res changes #237 #236 --- .gitignore | 3 ++ README.md | 6 ++-- src/ClearIcon.svelte | 14 ++++++++ src/Select.svelte | 38 ++++++++++----------- test/src/TestClearIcon.svelte | 1 + test/src/index.js | 63 +++++++++++++++++++++++++++++++++++ 6 files changed, 101 insertions(+), 24 deletions(-) create mode 100644 src/ClearIcon.svelte create mode 100644 test/src/TestClearIcon.svelte diff --git a/.gitignore b/.gitignore index eded9b91..3bca5549 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ index.js index.mjs test/public/bundle.js !test/src/index.js +.prettierrc +.prettierignore +.nova diff --git a/README.md b/README.md index b154398a..d51711e0 100644 --- a/README.md +++ b/README.md @@ -66,16 +66,15 @@ yarn add svelte-select - `listAutoWidth: Boolean` Default: `true`. List width will grow wider than the Select container (depending on list item content length). - `showIndicator: Boolean` Default: `false`. If true, the chevron indicator is always shown. - `inputAttributes: Object` Default: `{}`. Useful for passing in HTML attributes like `'id'` to the Select input. - - `Item: Component` Default: `Item`. Item component. - `Selection: Component` Default: `Selection`. Selection component. - `MultiSelection: Component` Default: `MultiSelection`. Multi selection component. - `Icon: Component` Default: `Icon`. Icon component. - `iconProps: Object` Default: `{}`. Icon props. - - `indicatorSvg: @html` Default: `undefined`. Override default SVG chevron indicator. - +- `ClearIcon` Default: `ClearIcon`. ClearIcon component. - `isVirtualList: Boolean` Default: `false`. Uses [svelte-virtual-list](https://github.com/sveltejs/svelte-virtual-list) to render list (experimental). +- `filteredItems: Array` Default: `[]`. List of items that are filtered by `filterText` ### Exposed methods If you really want to get your hands dirty these internal functions are exposed as props to override if needed. See the adv demo or look through the test file (test/src/index.js) for examples. @@ -139,6 +138,7 @@ export function handleClear() { ```js export let loadOptions = undefined; // if used must return a Promise that updates 'items' +/* Return an object with { cancelled: true } to keep the loading state as active. */ ``` ## Styling diff --git a/src/ClearIcon.svelte b/src/ClearIcon.svelte new file mode 100644 index 00000000..7243c3cd --- /dev/null +++ b/src/ClearIcon.svelte @@ -0,0 +1,14 @@ + + + + + diff --git a/src/Select.svelte b/src/Select.svelte index 6f40123e..ee4c406a 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -12,6 +12,7 @@ import MultiSelectionComponent from "./MultiSelection.svelte"; import isOutOfViewport from "./utils/isOutOfViewport"; import debounce from "./utils/debounce"; + import DefaultClearIcon from "./ClearIcon.svelte"; const dispatch = createEventDispatcher(); export let container = undefined; @@ -82,6 +83,7 @@ export let showIndicator = false; export let containerClasses = ""; export let indicatorSvg = undefined; + export let ClearIcon = DefaultClearIcon; let target; let activeSelectedValue; @@ -107,17 +109,20 @@ console.warn('svelte-select loadOptions error :>> ', err); dispatch("error", { type: 'loadOptions', details: err }); }); + + if (res && !res.cancelled) { + if (res) { + items = [...res]; + dispatch("loaded", { items }); + } else { + items = []; + } - if (res) { - items = [...res]; - dispatch("loaded", { items }); - } else { - items = []; + isWaiting = false; + isFocused = true; + listOpen = true; } - - isWaiting = false; - isFocused = true; - listOpen = true; + }, loadOptionsInterval); $: disabled = isDisabled; @@ -612,7 +617,8 @@ } else { selectedValue = createItem(detail); } - + + dispatch('itemCreated', detail); filterText = ""; listOpen = false; activeSelectedValue = undefined; @@ -864,17 +870,7 @@ {#if showSelectedItem && isClearable && !isDisabled && !isWaiting}
- - - +
{/if} diff --git a/test/src/TestClearIcon.svelte b/test/src/TestClearIcon.svelte new file mode 100644 index 00000000..5f8125fe --- /dev/null +++ b/test/src/TestClearIcon.svelte @@ -0,0 +1 @@ + diff --git a/test/src/index.js b/test/src/index.js index 262827f7..9a78238d 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -5,6 +5,7 @@ import CustomItem from './CustomItem.svelte'; import Select from '../../src/Select.svelte'; import List from '../../src/List.svelte'; import TestIcon from './TestIcon.svelte'; +import TestClearIcon from './TestClearIcon.svelte'; import SelectDefault from './Select/Select--default.html' import SelectMultiSelected from './Select/Select--multiSelected.html' import ListDefault from './List/List--default.html' @@ -2974,6 +2975,68 @@ test('when loadOptions and items is supplied then list should close on blur', as }); + +test('when isCreatable and item created then event "itemCreated" should dispatch', async (t) => { + const select = new Select({ + target, + props: { + items, + isCreatable: true, + isFocused: true, + listOpen: true, + isMulti: true + } + }); + + let eventDetail; + select.$on('itemCreated', (event) => { + eventDetail = event.detail; + }); + + select.$set({ filterText: 'TestCreate' }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + await wait(0); + t.ok(eventDetail === 'TestCreate'); + + select.$destroy(); +}); + +async function getCancelledRes() { + Promise.resolve({cancelled: true}); +} + +test('when loadOptions response returns cancelled true then dont end loading state', async (t) => { + const select = new Select({ + target, + props: { + loadOptions: getCancelledRes, + } + }); + + select.$set({filterText: 'Juniper'}); + await wait(0); + + + select.$destroy(); +}); + +test('when ClearItem replace clear icon', async (t) => { + const select = new Select({ + target, + props: { + items, + ClearIcon: TestClearIcon, + selectedValue: {value: 'chips', label: 'Chips'} + } + }); + + t.ok(target.querySelector('.testClearIcon')); + + select.$destroy(); +}); + + function getPosts(filterText) { filterText = filterText ? filterText.replace(' ','_') : ''; From 3bd0cf3e447611e14e300da4fe56824db257a5c6 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 18 Feb 2021 14:39:58 +1100 Subject: [PATCH 147/635] changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7d27cae..feb8dcd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # svelte-select changelog +## 3.17.0 + +* Add ClearIcon prop +* Added docs for filteredItems +* loadOptions res now checked for cancelled value + ## 3.16.1 * Bug fix for loadOptions and list causing blur to not close list - thanks to @Ginfone for reporting From a50927a045b18b853b3c5d36712c815d16511189 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 18 Feb 2021 14:40:07 +1100 Subject: [PATCH 148/635] 3.17.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d7554169..7d94236e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.16.1", + "version": "3.17.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A - {:else} - - {/if} - - {#if !isMulti && showSelectedItem} -
- -
- {/if} - - {#if showSelectedItem && isClearable && !isDisabled && !isWaiting} -
- -
- {/if} - - {#if showIndicator || (showChevron && !selectedValue || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem)))} -
- {#if indicatorSvg} - {@html indicatorSvg} - {:else} - - + {#if Icon} + + {/if} + + {#if isMulti && selectedValue && selectedValue.length > 0} + + {/if} + + {#if isDisabled} + + {:else} + + {/if} + + {#if !isMulti && showSelectedItem} +
+ +
+ {/if} + + {#if showSelectedItem && isClearable && !isDisabled && !isWaiting} +
+ +
+ {/if} + + {#if showIndicator || (showChevron && !selectedValue) || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem))} +
+ {#if indicatorSvg} + {@html indicatorSvg} + {:else} + + - - {/if} -
- {/if} - - {#if isWaiting} -
- - - -
- {/if} + 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z" + /> + + {/if} +
+ {/if} + + {#if isWaiting} +
+ + + +
+ {/if}
From fea2711cb32336c707577cc992dcea0d6d773e0b Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 11 Mar 2021 11:58:10 +1100 Subject: [PATCH 151/635] before update clean up --- src/Select.svelte | 52 +++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index 6a8ab420..f95af087 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -234,6 +234,28 @@ filteredItems = sortedGroupedItems; } + function dispatchSelectedItem() { + if (isMulti) { + if ( + JSON.stringify(selectedValue) !== + JSON.stringify(prev_selectedValue) + ) { + if (checkSelectedValueForDuplicates()) { + dispatch('select', selectedValue); + } + } + return; + } + + if ( + !prev_selectedValue || + JSON.stringify(selectedValue[optionIdentifier]) !== + JSON.stringify(prev_selectedValue[optionIdentifier]) + ) { + dispatch('select', selectedValue); + } + } + $: { if (selectedValue) setSelectedValue(); } @@ -262,32 +284,22 @@ } } - $: showSelectedItem = selectedValue && filterText.length === 0; - $: placeholderText = selectedValue ? '' : placeholder; - - beforeUpdate(() => { + $: { if (isMulti && selectedValue && selectedValue.length > 1) { checkSelectedValueForDuplicates(); } + } - if (!isMulti && selectedValue && prev_selectedValue !== selectedValue) { - if ( - !prev_selectedValue || - JSON.stringify(selectedValue[optionIdentifier]) !== - JSON.stringify(prev_selectedValue[optionIdentifier]) - ) { - dispatch('select', selectedValue); - } + $: { + if (selectedValue) { + dispatchSelectedItem(); } + } - if ( - isMulti && - JSON.stringify(selectedValue) !== JSON.stringify(prev_selectedValue) - ) { - if (checkSelectedValueForDuplicates()) { - dispatch('select', selectedValue); - } - } + $: showSelectedItem = selectedValue && filterText.length === 0; + $: placeholderText = selectedValue ? '' : placeholder; + + beforeUpdate(() => { if (container && listOpen !== prev_listOpen) { if (listOpen) { From 56966bac54bb3939b57f529dbfec4790a7b2b6c9 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Mar 2021 08:32:13 +1100 Subject: [PATCH 152/635] cleaning up reactive statements and beforeUpdate --- src/Select.svelte | 200 ++++++++++++++++++++++++---------------------- 1 file changed, 106 insertions(+), 94 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index f95af087..3474452d 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -172,30 +172,26 @@ filteredItems = JSON.parse(originalItemsClone); } + function filterItem(item) { + let keepItem = true; + + if (isMulti && selectedValue) { + keepItem = !selectedValue.some((value) => { + return value[optionIdentifier] === item[optionIdentifier]; + }); + } + + if (!keepItem) return false; + if (filterText.length < 1) return true; + return itemFilter(getOptionLabel(item, filterText), filterText, item); + } + function setupFilteredItems() { filteredItems = loadOptions ? filterText.length === 0 ? [] : items - : items.filter((item) => { - let keepItem = true; - - if (isMulti && selectedValue) { - keepItem = !selectedValue.some((value) => { - return ( - value[optionIdentifier] === item[optionIdentifier] - ); - }); - } - - if (!keepItem) return false; - if (filterText.length < 1) return true; - return itemFilter( - getOptionLabel(item, filterText), - filterText, - item - ); - }); + : items.filter((item) => filterItem(item)); } function filterGroupedItems() { @@ -256,6 +252,41 @@ } } + function setupFilterText() { + if (filterText.length > 0) { + isFocused = true; + listOpen = true; + + if (loadOptions) { + getItems(); + } else { + loadList(); + listOpen = true; + + if (isMulti) { + activeSelectedValue = undefined; + } + } + } else { + setList([]); + } + + if (list) { + list.$set({ + filterText, + }); + } + } + + function setupFocus() { + if (isFocused || listOpen) { + handleFocus(); + } else { + resetFilter(); + if (input) input.blur(); + } + } + $: { if (selectedValue) setSelectedValue(); } @@ -296,101 +327,82 @@ } } - $: showSelectedItem = selectedValue && filterText.length === 0; - $: placeholderText = selectedValue ? '' : placeholder; - - beforeUpdate(() => { - - if (container && listOpen !== prev_listOpen) { + $: { + if (container) { if (listOpen) { loadList(); } else { removeList(); } } + } - if (filterText !== prev_filterText) { - if (filterText.length > 0) { - isFocused = true; - listOpen = true; - - if (loadOptions) { - getItems(); - } else { - loadList(); - listOpen = true; - - if (isMulti) { - activeSelectedValue = undefined; - } - } - } else { - setList([]); - } - - if (list) { - list.$set({ - filterText, - }); - } + $: { + if (isFocused !== prev_isFocused) { + setupFocus(); } + } - if (isFocused !== prev_isFocused) { - if (isFocused || listOpen) { - handleFocus(); - } else { - resetFilter(); - if (input) input.blur(); - } + $: { + if (filterText !== prev_filterText) { + setupFilterText(); } + } - if (prev_filteredItems !== filteredItems) { - let _filteredItems = [...filteredItems]; - - if (isCreatable && filterText) { - const itemToCreate = createItem(filterText); - itemToCreate.isCreator = true; - - const existingItemWithFilterValue = _filteredItems.find( - (item) => { - return ( - item[optionIdentifier] === - itemToCreate[optionIdentifier] - ); - } - ); + function setupFilteredItem() { + let _filteredItems = [...filteredItems]; - let existingSelectionWithFilterValue; + if (isCreatable && filterText) { + const itemToCreate = createItem(filterText); + itemToCreate.isCreator = true; - if (selectedValue) { - if (isMulti) { - existingSelectionWithFilterValue = selectedValue.find( - (selection) => { - return ( - selection[optionIdentifier] === - itemToCreate[optionIdentifier] - ); - } - ); - } else if ( - selectedValue[optionIdentifier] === - itemToCreate[optionIdentifier] - ) { - existingSelectionWithFilterValue = selectedValue; - } - } + const existingItemWithFilterValue = _filteredItems.find((item) => { + return ( + item[optionIdentifier] === itemToCreate[optionIdentifier] + ); + }); - if ( - !existingItemWithFilterValue && - !existingSelectionWithFilterValue + let existingSelectionWithFilterValue; + + if (selectedValue) { + if (isMulti) { + existingSelectionWithFilterValue = selectedValue.find( + (selection) => { + return ( + selection[optionIdentifier] === + itemToCreate[optionIdentifier] + ); + } + ); + } else if ( + selectedValue[optionIdentifier] === + itemToCreate[optionIdentifier] ) { - _filteredItems = [..._filteredItems, itemToCreate]; + existingSelectionWithFilterValue = selectedValue; } } - setList(_filteredItems); + if ( + !existingItemWithFilterValue && + !existingSelectionWithFilterValue + ) { + _filteredItems = [..._filteredItems, itemToCreate]; + } + } + + setList(_filteredItems); + } + + $: { + if (prev_filteredItems !== filteredItems) { + setupFilteredItem(); } + } + $: showSelectedItem = selectedValue && filterText.length === 0; + $: placeholderText = selectedValue ? '' : placeholder; + + beforeUpdate(() => { prev_selectedValue = selectedValue; prev_listOpen = listOpen; prev_filterText = filterText; From 105ea12b2327a3523ff6bc3b6d22827bf9dfa3ee Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Mar 2021 08:52:14 +1100 Subject: [PATCH 153/635] further cleaning up and added prettier config --- .gitignore | 2 - .prettierignore | 2 + .prettierrc | 14 + src/ClearIcon.svelte | 23 +- src/Item.svelte | 104 +++---- src/List.svelte | 530 ++++++++++++++++++----------------- src/MultiSelection.svelte | 170 +++++------ src/Selection.svelte | 16 +- src/VirtualList.svelte | 255 +++++++++-------- src/utils/debounce.js | 28 +- src/utils/isOutOfViewport.js | 24 +- 11 files changed, 623 insertions(+), 545 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc diff --git a/.gitignore b/.gitignore index 3bca5549..053c400e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,4 @@ index.js index.mjs test/public/bundle.js !test/src/index.js -.prettierrc -.prettierignore .nova diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..665f45d4 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +/test/src/index.js +*.md diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..81a9fbf2 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,14 @@ +{ + "useTabs": false, + "singleQuote": true, + "tabWidth": 4, + "overrides": [ + { + "files": ["*.svelte"], + "options": { + "singleQuote": true + } + } + ], + "svelteSortOrder": "scripts-styles-markup" +} diff --git a/src/ClearIcon.svelte b/src/ClearIcon.svelte index 7243c3cd..78a528c1 100644 --- a/src/ClearIcon.svelte +++ b/src/ClearIcon.svelte @@ -1,14 +1,13 @@ - - - + width="100%" + height="100%" + viewBox="-2 -2 50 50" + focusable="false" + role="presentation" +> + diff --git a/src/Item.svelte b/src/Item.svelte index a31606b9..d3676b84 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -1,64 +1,72 @@ - -
- {@html getOptionLabel(item, filterText)} + {@html getOptionLabel(item, filterText)}
diff --git a/src/List.svelte b/src/List.svelte index 3db8a646..16b9c1e8 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -1,294 +1,324 @@ - function isItemActive(item, selectedValue, optionIdentifier) { - return selectedValue && (selectedValue[optionIdentifier] === item[optionIdentifier]); - }; + - + {#if isVirtualList} -
- - - -
- +
+ +
handleHover(i)} + on:click={(event) => handleClick({ item, i, event })} + class="listItem" + > + +
+
- - -
{/if} {#if !isVirtualList} -
- {#each items as item, i} - {#if item.isGroupHeader && !item.isSelectable} -
{getGroupHeaderLabel(item)}
- { :else } -
- +
+ {#each items as item, i} + {#if item.isGroupHeader && !item.isSelectable} +
{getGroupHeaderLabel(item)}
+ {:else} +
handleHover(i)} + on:click={(event) => handleClick({ item, i, event })} + class="listItem" + > + +
+ {/if} + {:else} + {#if !hideEmptyState} +
{noOptionsMessage}
+ {/if} + {/each}
- {/if} - {:else} - {#if !hideEmptyState} -
{noOptionsMessage}
- {/if} - {/each} -
{/if} - - diff --git a/src/MultiSelection.svelte b/src/MultiSelection.svelte index 2a4e7848..d83aa4c3 100644 --- a/src/MultiSelection.svelte +++ b/src/MultiSelection.svelte @@ -1,93 +1,107 @@ -{#each selectedValue as value, i} -
multiFullItemClearable ? handleClear(i, event) : {}}> -
- {@html getSelectionLabel(value)} -
- {#if !isDisabled && !multiFullItemClearable} -
- - - -
- {/if} -
-{/each} - - - + +{#each selectedValue as value, i} +
+ multiFullItemClearable ? handleClear(i, event) : {}} + > +
+ {@html getSelectionLabel(value)} +
+ {#if !isDisabled && !multiFullItemClearable} +
handleClear(i, event)} + > + + + +
+ {/if} +
+{/each} diff --git a/src/Selection.svelte b/src/Selection.svelte index 39111724..c6adf970 100644 --- a/src/Selection.svelte +++ b/src/Selection.svelte @@ -1,16 +1,16 @@
- {@html getSelectionLabel(item)} + {@html getSelectionLabel(item)}
diff --git a/src/VirtualList.svelte b/src/VirtualList.svelte index 21377231..dc1c68e1 100644 --- a/src/VirtualList.svelte +++ b/src/VirtualList.svelte @@ -1,164 +1,173 @@ - - - {#each visible as row (row.index)} - - Missing template - - {/each} - + + + {#each visible as row (row.index)} + + Missing template + + {/each} + diff --git a/src/utils/debounce.js b/src/utils/debounce.js index c6e5f009..5010f7a5 100644 --- a/src/utils/debounce.js +++ b/src/utils/debounce.js @@ -1,21 +1,21 @@ export default function debounce(func, wait, immediate) { - let timeout; + let timeout; - return function executedFunction() { - let context = this; - let args = arguments; + return function executedFunction() { + let context = this; + let args = arguments; - let later = function() { - timeout = null; - if (!immediate) func.apply(context, args); - }; + let later = function () { + timeout = null; + if (!immediate) func.apply(context, args); + }; - let callNow = immediate && !timeout; + let callNow = immediate && !timeout; - clearTimeout(timeout); + clearTimeout(timeout); - timeout = setTimeout(later, wait); + timeout = setTimeout(later, wait); - if (callNow) func.apply(context, args); - }; -}; + if (callNow) func.apply(context, args); + }; +} diff --git a/src/utils/isOutOfViewport.js b/src/utils/isOutOfViewport.js index d05501cb..f116d1c7 100644 --- a/src/utils/isOutOfViewport.js +++ b/src/utils/isOutOfViewport.js @@ -1,12 +1,16 @@ -export default function(elem) { - const bounding = elem.getBoundingClientRect(); - const out = {}; +export default function (elem) { + const bounding = elem.getBoundingClientRect(); + const out = {}; - out.top = bounding.top < 0; - out.left = bounding.left < 0; - out.bottom = bounding.bottom > (window.innerHeight || document.documentElement.clientHeight); - out.right = bounding.right > (window.innerWidth || document.documentElement.clientWidth); - out.any = out.top || out.left || out.bottom || out.right; + out.top = bounding.top < 0; + out.left = bounding.left < 0; + out.bottom = + bounding.bottom > + (window.innerHeight || document.documentElement.clientHeight); + out.right = + bounding.right > + (window.innerWidth || document.documentElement.clientWidth); + out.any = out.top || out.left || out.bottom || out.right; - return out; -}; + return out; +} From eb003166cb2e080d6a60d9412dc3c3e99b012e63 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Mar 2021 10:26:09 +1100 Subject: [PATCH 154/635] Dynamic VirtualList --- src/List.svelte | 41 +++++++++++------------------------------ src/Select.svelte | 15 +++++++++++++-- src/VirtualList.svelte | 17 +++-------------- 3 files changed, 27 insertions(+), 46 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index 16b9c1e8..7ce6d063 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -1,18 +1,11 @@ - - diff --git a/test/public/reset.css b/test/public/reset.css deleted file mode 100644 index e69de29b..00000000 diff --git a/test/src/List/List--default.html b/test/src/List/List--default.svelte similarity index 100% rename from test/src/List/List--default.html rename to test/src/List/List--default.svelte diff --git a/test/src/Select/ParentContainer.html b/test/src/Select/ParentContainer.svelte similarity index 100% rename from test/src/Select/ParentContainer.html rename to test/src/Select/ParentContainer.svelte diff --git a/test/src/Select/Select--default.html b/test/src/Select/Select--default.svelte similarity index 100% rename from test/src/Select/Select--default.html rename to test/src/Select/Select--default.svelte diff --git a/test/src/Select/Select--multiSelected.html b/test/src/Select/Select--multiSelected.svelte similarity index 97% rename from test/src/Select/Select--multiSelected.html rename to test/src/Select/Select--multiSelected.svelte index 5a79a5a3..0c07e434 100644 --- a/test/src/Select/Select--multiSelected.html +++ b/test/src/Select/Select--multiSelected.svelte @@ -82,12 +82,7 @@ display: flex; padding: 0 16px; } - - .multiSelectItems { - display: flex; - padding: 8px 0; - } - + .multiSelectItem { background: #E8EAED; margin-right: 5px; diff --git a/test/src/index.js b/test/src/index.js index 9a78238d..61345713 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1,4 +1,5 @@ -import getName from 'namey-mcnameface'; +import './reset.css' +import getName from '../utils/nameGen'; import normalizeHtml from '../utils/normalizeHtml'; import CustomItem from './CustomItem.svelte'; @@ -6,10 +7,10 @@ import Select from '../../src/Select.svelte'; import List from '../../src/List.svelte'; import TestIcon from './TestIcon.svelte'; import TestClearIcon from './TestClearIcon.svelte'; -import SelectDefault from './Select/Select--default.html' -import SelectMultiSelected from './Select/Select--multiSelected.html' -import ListDefault from './List/List--default.html' -import ParentContainer from './Select/ParentContainer.html' +import SelectDefault from './Select/Select--default.svelte' +import SelectMultiSelected from './Select/Select--multiSelected.svelte' +import ListDefault from './List/List--default.svelte' +import ParentContainer from './Select/ParentContainer.svelte' import {assert, test, done} from 'tape-modern'; function querySelectorClick(selector) { @@ -27,10 +28,31 @@ function handleSet(component, data) { return new Promise(f => setTimeout(f, 0)); } +function focus(element, setFocus) { + return new Promise(fulfil => { + element.addEventListener('focus', function handler() { + element.removeEventListener('focus', handler); + fulfil(true); + }); + + setFocus(); + }); +} + // setup -const target = document.querySelector('main'); -const testTarget = document.getElementById('testTemplate'); -const extraTarget = document.getElementById('extra'); +const target = document.createElement('main'); +document.body.appendChild(target); + +const testTarget = document.createElement("div"); +testTarget.id = 'testTemplate'; +document.body.appendChild(testTarget); + +const extraTarget = document.createElement("div"); +extraTarget.id = 'extra'; +document.body.appendChild(extraTarget) + + + const items = [ {value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, @@ -109,7 +131,7 @@ test('when isFocused changes to true input should focus', async (t) => { select.$set({isFocused: true}); }; - const hasFocused = await focus(select.input, setFocus); + const hasFocused = await focus(target.querySelector('.selectContainer input'), setFocus); t.ok(hasFocused); select.$destroy(); }); @@ -500,8 +522,9 @@ test('focus on Select input updates focus state', async (t) => { items } }); - + document.querySelector('.selectContainer input').focus(); + t.ok(select.isFocused); select.$destroy(); }); @@ -2934,17 +2957,6 @@ test('When isMulti and multiFullItemClearable then clicking anywhere on the item multiSelect.$destroy(); }); -function focus(element, setFocus) { - return new Promise(fulfil => { - element.addEventListener('focus', function handler() { - element.removeEventListener('focus', handler); - fulfil(true); - }); - - setFocus(); - }); -} - test('when loadOptions and items is supplied then list should close on blur', async (t) => { const div = document.createElement('div'); document.body.appendChild(div); @@ -3070,8 +3082,7 @@ function rejectPromise() { }) } - - - // this allows us to close puppeteer once tests have completed window.done = done; + +export default {}; diff --git a/test/src/reset.css b/test/src/reset.css index cd154db1..4f278fed 100644 --- a/test/src/reset.css +++ b/test/src/reset.css @@ -2,7 +2,7 @@ html { width: 100%; height: 100%; padding: 0; - margin: 20px; + margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; } @@ -12,7 +12,7 @@ body { height: 100%; min-height: 100%; min-width: 100%; - padding: 0; + padding: 20px; margin: 0; } diff --git a/test/utils/nameGen.js b/test/utils/nameGen.js new file mode 100644 index 00000000..28bee345 --- /dev/null +++ b/test/utils/nameGen.js @@ -0,0 +1,2284 @@ +// https://github.com/Rich-Harris/namey-mcnameface + +const animals = [ + 'aardvark', + 'aardwolf', + 'albatross', + 'alligator', + 'alpaca', + 'amphibian', + 'anaconda', + 'angelfish', + 'anglerfish', + 'ant', + 'anteater', + 'antelope', + 'antlion', + 'ape', + 'aphid', + 'armadillo', + 'asp', + 'baboon', + 'badger', + 'bandicoot', + 'barnacle', + 'barracuda', + 'basilisk', + 'bass', + 'bat', + 'bear', + 'beaver', + 'bedbug', + 'bee', + 'beetle', + 'bird', + 'bison', + 'blackbird', + 'boa', + 'boar', + 'bobcat', + 'bobolink', + 'bonobo', + 'booby', + 'bovid', + 'bug', + 'butterfly', + 'buzzard', + 'camel', + 'canid', + 'capybara', + 'cardinal', + 'caribou', + 'carp', + 'cat', + 'catshark', + 'caterpillar', + 'catfish', + 'cattle', + 'centipede', + 'cephalopod', + 'chameleon', + 'cheetah', + 'chickadee', + 'chicken', + 'chimpanzee', + 'chinchilla', + 'chipmunk', + 'clam', + 'clownfish', + 'cobra', + 'cockroach', + 'cod', + 'condor', + 'constrictor', + 'coral', + 'cougar', + 'cow', + 'coyote', + 'crab', + 'crane', + 'crawdad', + 'crayfish', + 'cricket', + 'crocodile', + 'crow', + 'cuckoo', + 'cicada', + 'damselfly', + 'deer', + 'dingo', + 'dinosaur', + 'dog', + 'dolphin', + 'donkey', + 'dormouse', + 'dove', + 'dragonfly', + 'dragon', + 'duck', + 'eagle', + 'earthworm', + 'earwig', + 'echidna', + 'eel', + 'egret', + 'elephant', + 'elk', + 'emu', + 'ermine', + 'falcon', + 'ferret', + 'finch', + 'firefly', + 'fish', + 'flamingo', + 'flea', + 'fly', + 'flyingfish', + 'fowl', + 'fox', + 'frog', + 'gamefowl', + 'galliform', + 'gazelle', + 'gecko', + 'gerbil', + 'gibbon', + 'giraffe', + 'goat', + 'goldfish', + 'goose', + 'gopher', + 'gorilla', + 'grasshopper', + 'grouse', + 'guan', + 'guanaco', + 'guineafowl', + 'gull', + 'guppy', + 'haddock', + 'halibut', + 'hamster', + 'hare', + 'harrier', + 'hawk', + 'hedgehog', + 'heron', + 'herring', + 'hippopotamus', + 'hookworm', + 'hornet', + 'horse', + 'hoverfly', + 'hummingbird', + 'hyena', + 'iguana', + 'impala', + 'jackal', + 'jaguar', + 'jay', + 'jellyfish', + 'junglefowl', + 'kangaroo', + 'kingfisher', + 'kite', + 'kiwi', + 'koala', + 'koi', + 'krill', + 'ladybug', + 'lamprey', + 'landfowl', + 'lark', + 'leech', + 'lemming', + 'lemur', + 'leopard', + 'leopon', + 'limpet', + 'lion', + 'lizard', + 'llama', + 'lobster', + 'locust', + 'loon', + 'louse', + 'lungfish', + 'lynx', + 'macaw', + 'mackerel', + 'magpie', + 'mammal', + 'manatee', + 'mandrill', + 'marlin', + 'marmoset', + 'marmot', + 'marsupial', + 'marten', + 'mastodon', + 'meadowlark', + 'meerkat', + 'mink', + 'minnow', + 'mite', + 'mockingbird', + 'mole', + 'mollusk', + 'mongoose', + 'monkey', + 'moose', + 'mosquito', + 'moth', + 'mouse', + 'mule', + 'muskox', + 'narwhal', + 'newt', + 'nightingale', + 'ocelot', + 'octopus', + 'opossum', + 'orangutan', + 'orca', + 'ostrich', + 'otter', + 'owl', + 'ox', + 'panda', + 'panther', + 'parakeet', + 'parrot', + 'parrotfish', + 'partridge', + 'peacock', + 'peafowl', + 'pelican', + 'penguin', + 'perch', + 'pheasant', + 'pig', + 'pigeon', + 'pike', + 'pinniped', + 'piranha', + 'planarian', + 'platypus', + 'pony', + 'porcupine', + 'porpoise', + 'possum', + 'prawn', + 'primate', + 'ptarmigan', + 'puffin', + 'puma', + 'python', + 'quail', + 'quelea', + 'quokka', + 'rabbit', + 'raccoon', + 'rat', + 'rattlesnake', + 'raven', + 'reindeer', + 'reptile', + 'rhinoceros', + 'roadrunner', + 'rodent', + 'rook', + 'rooster', + 'roundworm', + 'sailfish', + 'salamander', + 'salmon', + 'sawfish', + 'scallop', + 'scorpion', + 'seahorse', + 'shark', + 'sheep', + 'shrew', + 'shrimp', + 'silkworm', + 'silverfish', + 'skink', + 'skunk', + 'sloth', + 'slug', + 'smelt', + 'snail', + 'snake', + 'snipe', + 'sole', + 'sparrow', + 'spider', + 'spoonbill', + 'squid', + 'squirrel', + 'starfish', + 'stingray', + 'stoat', + 'stork', + 'sturgeon', + 'swallow', + 'swan', + 'swift', + 'swordfish', + 'swordtail', + 'tahr', + 'takin', + 'tapir', + 'tarantula', + 'tarsier', + 'termite', + 'tern', + 'thrush', + 'tick', + 'tiger', + 'tiglon', + 'toad', + 'tortoise', + 'toucan', + 'trout', + 'tuna', + 'turkey', + 'turtle', + 'urial', + 'vicuna', + 'viper', + 'vole', + 'vulture', + 'wallaby', + 'walrus', + 'wasp', + 'warbler', + 'weasel', + 'whale', + 'whippet', + 'whitefish', + 'wildcat', + 'wildebeest', + 'wildfowl', + 'wolf', + 'wolverine', + 'wombat', + 'woodpecker', + 'worm', + 'wren', + 'xerinae', + 'yak', + 'zebra', + 'alpaca', + 'cat', + 'cattle', + 'chicken', + 'dog', + 'donkey', + 'ferret', + 'gayal', + 'goldfish', + 'guppy', + 'horse', + 'koi', + 'llama', + 'sheep', + 'yak', +]; +var adjectives = [ + 'aback', + 'abaft', + 'abandoned', + 'abashed', + 'aberrant', + 'abhorrent', + 'abiding', + 'abject', + 'ablaze', + 'able', + 'abnormal', + 'aboard', + 'aboriginal', + 'abortive', + 'abounding', + 'abrasive', + 'abrupt', + 'absent', + 'absolute', + 'absorbed', + 'absorbing', + 'abstracted', + 'absurd', + 'abundant', + 'abusive', + 'academic', + 'acceptable', + 'accessible', + 'accidental', + 'acclaimed', + 'accomplished', + 'accurate', + 'aching', + 'acid', + 'acidic', + 'acoustic', + 'acrid', + 'acrobatic', + 'active', + 'actual', + 'actually', + 'ad hoc', + 'adamant', + 'adaptable', + 'addicted', + 'adept', + 'adhesive', + 'adjoining', + 'admirable', + 'admired', + 'adolescent', + 'adorable', + 'adored', + 'advanced', + 'adventurous', + 'affectionate', + 'afraid', + 'aged', + 'aggravating', + 'aggressive', + 'agile', + 'agitated', + 'agonizing', + 'agreeable', + 'ahead', + 'ajar', + 'alarmed', + 'alarming', + 'alcoholic', + 'alert', + 'alienated', + 'alike', + 'alive', + 'all', + 'alleged', + 'alluring', + 'aloof', + 'altruistic', + 'amazing', + 'ambiguous', + 'ambitious', + 'amiable', + 'ample', + 'amuck', + 'amused', + 'amusing', + 'anchored', + 'ancient', + 'ancient', + 'angelic', + 'angry', + 'angry', + 'anguished', + 'animated', + 'annoyed', + 'annoying', + 'annual', + 'another', + 'antique', + 'antsy', + 'anxious', + 'any', + 'apathetic', + 'appetizing', + 'apprehensive', + 'appropriate', + 'apt', + 'aquatic', + 'arctic', + 'arid', + 'aromatic', + 'arrogant', + 'artistic', + 'ashamed', + 'aspiring', + 'assorted', + 'assured', + 'astonishing', + 'athletic', + 'attached', + 'attentive', + 'attractive', + 'auspicious', + 'austere', + 'authentic', + 'authorized', + 'automatic', + 'available', + 'avaricious', + 'average', + 'awake', + 'aware', + 'awesome', + 'awful', + 'awkward', + 'axiomatic', + 'babyish', + 'back', + 'bad', + 'baggy', + 'barbarous', + 'bare', + 'barren', + 'bashful', + 'basic', + 'batty', + 'bawdy', + 'beautiful', + 'beefy', + 'befitting', + 'belated', + 'belligerent', + 'beloved', + 'beneficial', + 'bent', + 'berserk', + 'best', + 'better', + 'bewildered', + 'bewitched', + 'big', + 'big-hearted', + 'billowy', + 'biodegradable', + 'bite-sized', + 'biting', + 'bitter', + 'bizarre', + 'black', + 'black-and-white', + 'bland', + 'blank', + 'blaring', + 'bleak', + 'blind', + 'blissful', + 'blond', + 'bloody', + 'blue', + 'blue-eyed', + 'blushing', + 'bogus', + 'boiling', + 'bold', + 'bony', + 'boorish', + 'bored', + 'boring', + 'bossy', + 'both', + 'bouncy', + 'boundless', + 'bountiful', + 'bowed', + 'brainy', + 'brash', + 'brave', + 'brawny', + 'breakable', + 'breezy', + 'brief', + 'bright', + 'brilliant', + 'brisk', + 'broad', + 'broken', + 'bronze', + 'brown', + 'bruised', + 'bubbly', + 'bulky', + 'bumpy', + 'buoyant', + 'burdensome', + 'burly', + 'bustling', + 'busy', + 'buttery', + 'buzzing', + 'cagey', + 'calculating', + 'callous', + 'calm', + 'candid', + 'canine', + 'capable', + 'capital', + 'capricious', + 'carefree', + 'careful', + 'careless', + 'caring', + 'cautious', + 'cavernous', + 'ceaseless', + 'celebrated', + 'certain', + 'changeable', + 'charming', + 'cheap', + 'cheeky', + 'cheerful', + 'cheery', + 'chemical', + 'chief', + 'childlike', + 'chilly', + 'chivalrous', + 'chubby', + 'chunky', + 'circular', + 'clammy', + 'classic', + 'classy', + 'clean', + 'clear', + 'clear-cut', + 'clever', + 'cloistered', + 'close', + 'closed', + 'cloudy', + 'clueless', + 'clumsy', + 'cluttered', + 'coarse', + 'coherent', + 'cold', + 'colorful', + 'colorless', + 'colossal', + 'colossal', + 'combative', + 'comfortable', + 'common', + 'compassionate', + 'competent', + 'complete', + 'complex', + 'complicated', + 'composed', + 'concerned', + 'concrete', + 'condemned', + 'condescending', + 'confused', + 'conscious', + 'considerate', + 'constant', + 'contemplative', + 'content', + 'conventional', + 'convincing', + 'convoluted', + 'cooing', + 'cooked', + 'cool', + 'cooperative', + 'coordinated', + 'corny', + 'corrupt', + 'costly', + 'courageous', + 'courteous', + 'cowardly', + 'crabby', + 'crafty', + 'craven', + 'crazy', + 'creamy', + 'creative', + 'creepy', + 'criminal', + 'crisp', + 'critical', + 'crooked', + 'crowded', + 'cruel', + 'crushing', + 'cuddly', + 'cultivated', + 'cultured', + 'cumbersome', + 'curious', + 'curly', + 'curved', + 'curvy', + 'cut', + 'cute', + 'cylindrical', + 'cynical', + 'daffy', + 'daily', + 'damaged', + 'damaging', + 'damp', + 'dangerous', + 'dapper', + 'dapper', + 'daring', + 'dark', + 'darling', + 'dashing', + 'dazzling', + 'dead', + 'deadly', + 'deadpan', + 'deafening', + 'dear', + 'dearest', + 'debonair', + 'decayed', + 'deceitful', + 'decent', + 'decimal', + 'decisive', + 'decorous', + 'deep', + 'deeply', + 'defeated', + 'defective', + 'defenseless', + 'defensive', + 'defiant', + 'deficient', + 'definite', + 'delayed', + 'delectable', + 'delicate', + 'delicious', + 'delightful', + 'delirious', + 'demanding', + 'demonic', + 'dense', + 'dental', + 'dependable', + 'dependent', + 'depraved', + 'depressed', + 'deranged', + 'descriptive', + 'deserted', + 'despicable', + 'detailed', + 'determined', + 'devilish', + 'devoted', + 'didactic', + 'different', + 'difficult', + 'digital', + 'dilapidated', + 'diligent', + 'dim', + 'diminutive', + 'dimpled', + 'dimwitted', + 'direct', + 'direful', + 'dirty', + 'disagreeable', + 'disastrous', + 'discreet', + 'discrete', + 'disfigured', + 'disguised', + 'disgusted', + 'disgusting', + 'dishonest', + 'disillusioned', + 'disloyal', + 'dismal', + 'dispensable', + 'distant', + 'distinct', + 'distorted', + 'distraught', + 'distressed', + 'disturbed', + 'divergent', + 'dizzy', + 'domineering', + 'dopey', + 'doting', + 'double', + 'doubtful', + 'downright', + 'drab', + 'draconian', + 'drafty', + 'drained', + 'dramatic', + 'dreary', + 'droopy', + 'drunk', + 'dry', + 'dual', + 'dull', + 'dull', + 'dusty', + 'dutiful', + 'dynamic', + 'dysfunctional', + 'each', + 'eager', + 'early', + 'earnest', + 'earsplitting', + 'earthy', + 'easy', + 'easy-going', + 'eatable', + 'economic', + 'ecstatic', + 'edible', + 'educated', + 'efficacious', + 'efficient', + 'eight', + 'elaborate', + 'elastic', + 'elated', + 'elderly', + 'electric', + 'elegant', + 'elementary', + 'elfin', + 'elite', + 'elliptical', + 'emaciated', + 'embarrassed', + 'embellished', + 'eminent', + 'emotional', + 'empty', + 'enchanted', + 'enchanting', + 'encouraging', + 'endurable', + 'energetic', + 'enlightened', + 'enormous', + 'enraged', + 'entertaining', + 'enthusiastic', + 'entire', + 'envious', + 'envious', + 'equable', + 'equal', + 'equatorial', + 'erect', + 'erratic', + 'essential', + 'esteemed', + 'ethereal', + 'ethical', + 'euphoric', + 'evanescent', + 'evasive', + 'even', + 'evergreen', + 'everlasting', + 'every', + 'evil', + 'exalted', + 'exasperated', + 'excellent', + 'excitable', + 'excited', + 'exciting', + 'exclusive', + 'exemplary', + 'exhausted', + 'exhilarated', + 'exotic', + 'expensive', + 'experienced', + 'expert', + 'extensive', + 'extra-large', + 'extraneous', + 'extra-small', + 'extroverted', + 'exuberant', + 'exultant', + 'fabulous', + 'faded', + 'failing', + 'faint', + 'fair', + 'faithful', + 'fake', + 'fallacious', + 'false', + 'familiar', + 'famous', + 'fanatical', + 'fancy', + 'fantastic', + 'far', + 'faraway', + 'far-flung', + 'far-off', + 'fascinated', + 'fast', + 'fat', + 'fatal', + 'fatherly', + 'faulty', + 'favorable', + 'favorite', + 'fearful', + 'fearless', + 'feeble', + 'feigned', + 'feisty', + 'feline', + 'female', + 'feminine', + 'fertile', + 'festive', + 'few', + 'fickle', + 'fierce', + 'filthy', + 'fine', + 'finicky', + 'finished', + 'firm', + 'first', + 'firsthand', + 'fitting', + 'five', + 'fixed', + 'flagrant', + 'flaky', + 'flamboyant', + 'flashy', + 'flat', + 'flawed', + 'flawless', + 'flickering', + 'flimsy', + 'flippant', + 'floppy', + 'flowery', + 'flufy', + 'fluid', + 'flustered', + 'fluttering', + 'foamy', + 'focused', + 'fond', + 'foolhardy', + 'foolish', + 'forceful', + 'foregoing', + 'forgetful', + 'forked', + 'formal', + 'forsaken', + 'forthright', + 'fortunate', + 'four', + 'fragile', + 'fragrant', + 'frail', + 'frank', + 'frantic', + 'frayed', + 'free', + 'freezing', + 'french', + 'frequent', + 'fresh', + 'fretful', + 'friendly', + 'frightened', + 'frightening', + 'frigid', + 'frilly', + 'frivolous', + 'frizzy', + 'front', + 'frosty', + 'frothy', + 'frozen', + 'frugal', + 'fruitful', + 'frustrating', + 'full', + 'fumbling', + 'fumbling', + 'functional', + 'funny', + 'furry', + 'furtive', + 'fussy', + 'future', + 'futuristic', + 'fuzzy', + 'gabby', + 'gainful', + 'gamy', + 'gaping', + 'gargantuan', + 'garrulous', + 'gaseous', + 'gaudy', + 'general', + 'general', + 'generous', + 'gentle', + 'genuine', + 'ghastly', + 'giant', + 'giddy', + 'gifted', + 'gigantic', + 'giving', + 'glamorous', + 'glaring', + 'glass', + 'gleaming', + 'gleeful', + 'glib', + 'glistening', + 'glittering', + 'gloomy', + 'glorious', + 'glossy', + 'glum', + 'godly', + 'golden', + 'good', + 'good-natured', + 'goofy', + 'gorgeous', + 'graceful', + 'gracious', + 'grand', + 'grandiose', + 'grandiose', + 'granular', + 'grateful', + 'gratis', + 'grave', + 'gray', + 'greasy', + 'great', + 'greedy', + 'green', + 'gregarious', + 'grey', + 'grieving', + 'grim', + 'grimy', + 'gripping', + 'grizzled', + 'groovy', + 'gross', + 'grotesque', + 'grouchy', + 'grounded', + 'growing', + 'growling', + 'grown', + 'grubby', + 'gruesome', + 'grumpy', + 'guarded', + 'guiltless', + 'guilty', + 'gullible', + 'gummy', + 'gusty', + 'guttural', + 'habitual', + 'hairy', + 'half', + 'half', + 'hallowed', + 'halting', + 'handmade', + 'handsome', + 'handsomely', + 'handy', + 'hanging', + 'hapless', + 'happy', + 'happy-go-lucky', + 'hard', + 'hard-to-find', + 'harebrained', + 'harmful', + 'harmless', + 'harmonious', + 'harsh', + 'hasty', + 'hateful', + 'haunting', + 'heady', + 'healthy', + 'heartbreaking', + 'heartfelt', + 'hearty', + 'heavenly', + 'heavy', + 'hefty', + 'hellish', + 'helpful', + 'helpless', + 'hesitant', + 'hidden', + 'hideous', + 'high', + 'highfalutin', + 'high-level', + 'high-pitched', + 'hilarious', + 'hissing', + 'historical', + 'hoarse', + 'holistic', + 'hollow', + 'homeless', + 'homely', + 'honest', + 'honorable', + 'honored', + 'hopeful', + 'horrible', + 'horrific', + 'hospitable', + 'hot', + 'huge', + 'hulking', + 'humble', + 'humdrum', + 'humiliating', + 'humming', + 'humongous', + 'humorous', + 'hungry', + 'hurried', + 'hurt', + 'hurtful', + 'hushed', + 'husky', + 'hypnotic', + 'hysterical', + 'icky', + 'icy', + 'ideal', + 'ideal', + 'idealistic', + 'identical', + 'idiotic', + 'idle', + 'idolized', + 'ignorant', + 'ill', + 'illegal', + 'ill-fated', + 'ill-informed', + 'illiterate', + 'illustrious', + 'imaginary', + 'imaginative', + 'immaculate', + 'immaterial', + 'immediate', + 'immense', + 'imminent', + 'impartial', + 'impassioned', + 'impeccable', + 'imperfect', + 'imperturbable', + 'impish', + 'impolite', + 'important', + 'imported', + 'impossible', + 'impractical', + 'impressionable', + 'impressive', + 'improbable', + 'impure', + 'inborn', + 'incandescent', + 'incomparable', + 'incompatible', + 'incompetent', + 'incomplete', + 'inconclusive', + 'inconsequential', + 'incredible', + 'indelible', + 'indolent', + 'industrious', + 'inexpensive', + 'inexperienced', + 'infamous', + 'infantile', + 'infatuated', + 'inferior', + 'infinite', + 'informal', + 'innate', + 'innocent', + 'inquisitive', + 'insecure', + 'insidious', + 'insignificant', + 'insistent', + 'instinctive', + 'instructive', + 'insubstantial', + 'intelligent', + 'intent', + 'intentional', + 'interesting', + 'internal', + 'international', + 'intrepid', + 'intrigued', + 'invincible', + 'irate', + 'ironclad', + 'irresponsible', + 'irritable', + 'irritating', + 'itchy', + 'jaded', + 'jagged', + 'jam-packed', + 'jaunty', + 'jazzy', + 'jealous', + 'jittery', + 'jobless', + 'joint', + 'jolly', + 'jovial', + 'joyful', + 'joyous', + 'jubilant', + 'judicious', + 'juicy', + 'jumbled', + 'jumbo', + 'jumpy', + 'jumpy', + 'junior', + 'juvenile', + 'kaleidoscopic', + 'kaput', + 'keen', + 'key', + 'kind', + 'kindhearted', + 'kindly', + 'klutzy', + 'knobby', + 'knotty', + 'knowing', + 'knowledgeable', + 'known', + 'kooky', + 'kosher', + 'labored', + 'lackadaisical', + 'lacking', + 'lame', + 'lame', + 'lamentable', + 'languid', + 'lanky', + 'large', + 'last', + 'lasting', + 'late', + 'laughable', + 'lavish', + 'lawful', + 'lazy', + 'leading', + 'leafy', + 'lean', + 'learned', + 'left', + 'legal', + 'legitimate', + 'lethal', + 'level', + 'lewd', + 'light', + 'lighthearted', + 'likable', + 'like', + 'likeable', + 'likely', + 'limited', + 'limp', + 'limping', + 'linear', + 'lined', + 'liquid', + 'literate', + 'little', + 'live', + 'lively', + 'livid', + 'living', + 'loathsome', + 'lone', + 'lonely', + 'long', + 'longing', + 'long-term', + 'loose', + 'lopsided', + 'lost', + 'loud', + 'loutish', + 'lovable', + 'lovely', + 'loving', + 'low', + 'lowly', + 'loyal', + 'lucky', + 'ludicrous', + 'lumbering', + 'luminous', + 'lumpy', + 'lush', + 'lustrous', + 'luxuriant', + 'luxurious', + 'lying', + 'lyrical', + 'macabre', + 'macho', + 'mad', + 'maddening', + 'made-up', + 'madly', + 'magenta', + 'magical', + 'magnificent', + 'majestic', + 'major', + 'makeshift', + 'male', + 'malicious', + 'mammoth', + 'maniacal', + 'many', + 'marked', + 'married', + 'marvelous', + 'masculine', + 'massive', + 'material', + 'materialistic', + 'mature', + 'meager', + 'mealy', + 'mean', + 'measly', + 'meaty', + 'medical', + 'mediocre', + 'medium', + 'meek', + 'melancholy', + 'mellow', + 'melodic', + 'melted', + 'memorable', + 'menacing', + 'merciful', + 'mere', + 'merry', + 'messy', + 'metallic', + 'mighty', + 'mild', + 'military', + 'milky', + 'mindless', + 'miniature', + 'minor', + 'minty', + 'minute', + 'miscreant', + 'miserable', + 'miserly', + 'misguided', + 'mistaken', + 'misty', + 'mixed', + 'moaning', + 'modern', + 'modest', + 'moist', + 'moldy', + 'momentous', + 'monstrous', + 'monthly', + 'monumental', + 'moody', + 'moral', + 'mortified', + 'motherly', + 'motionless', + 'mountainous', + 'muddled', + 'muddy', + 'muffled', + 'multicolored', + 'mundane', + 'mundane', + 'murky', + 'mushy', + 'musty', + 'mute', + 'muted', + 'mysterious', + 'naive', + 'nappy', + 'narrow', + 'nasty', + 'natural', + 'naughty', + 'nauseating', + 'nautical', + 'near', + 'neat', + 'nebulous', + 'necessary', + 'needless', + 'needy', + 'negative', + 'neglected', + 'negligible', + 'neighboring', + 'neighborly', + 'nervous', + 'nervous', + 'new', + 'next', + 'nice', + 'nice', + 'nifty', + 'nimble', + 'nine', + 'nippy', + 'nocturnal', + 'noiseless', + 'noisy', + 'nonchalant', + 'nondescript', + 'nonsensical', + 'nonstop', + 'normal', + 'nostalgic', + 'nosy', + 'notable', + 'noted', + 'noteworthy', + 'novel', + 'noxious', + 'null', + 'numb', + 'numberless', + 'numerous', + 'nutritious', + 'nutty', + 'oafish', + 'obedient', + 'obeisant', + 'obese', + 'oblivious', + 'oblong', + 'obnoxious', + 'obscene', + 'obsequious', + 'observant', + 'obsolete', + 'obtainable', + 'obvious', + 'occasional', + 'oceanic', + 'odd', + 'oddball', + 'offbeat', + 'offensive', + 'official', + 'oily', + 'old', + 'old-fashioned', + 'omniscient', + 'one', + 'onerous', + 'only', + 'open', + 'opposite', + 'optimal', + 'optimistic', + 'opulent', + 'orange', + 'orderly', + 'ordinary', + 'organic', + 'original', + 'ornate', + 'ornery', + 'ossified', + 'other', + 'our', + 'outgoing', + 'outlandish', + 'outlying', + 'outrageous', + 'outstanding', + 'oval', + 'overconfident', + 'overcooked', + 'overdue', + 'overjoyed', + 'overlooked', + 'overrated', + 'overt', + 'overwrought', + 'painful', + 'painstaking', + 'palatable', + 'pale', + 'paltry', + 'panicky', + 'panoramic', + 'parallel', + 'parched', + 'parsimonious', + 'partial', + 'passionate', + 'past', + 'pastel', + 'pastoral', + 'pathetic', + 'peaceful', + 'penitent', + 'peppery', + 'perfect', + 'perfumed', + 'periodic', + 'perky', + 'permissible', + 'perpetual', + 'perplexed', + 'personal', + 'pertinent', + 'pesky', + 'pessimistic', + 'petite', + 'petty', + 'petty', + 'phobic', + 'phony', + 'physical', + 'picayune', + 'piercing', + 'pink', + 'piquant', + 'pitiful', + 'placid', + 'plain', + 'plaintive', + 'plant', + 'plastic', + 'plausible', + 'playful', + 'pleasant', + 'pleased', + 'pleasing', + 'plucky', + 'plump', + 'plush', + 'pointed', + 'pointless', + 'poised', + 'polished', + 'polite', + 'political', + 'pompous', + 'poor', + 'popular', + 'portly', + 'posh', + 'positive', + 'possessive', + 'possible', + 'potable', + 'powerful', + 'powerless', + 'practical', + 'precious', + 'premium', + 'present', + 'present', + 'prestigious', + 'pretty', + 'previous', + 'pricey', + 'prickly', + 'primary', + 'prime', + 'pristine', + 'private', + 'prize', + 'probable', + 'productive', + 'profitable', + 'profuse', + 'proper', + 'protective', + 'proud', + 'prudent', + 'psychedelic', + 'psychotic', + 'public', + 'puffy', + 'pumped', + 'punctual', + 'pungent', + 'puny', + 'pure', + 'purple', + 'purring', + 'pushy', + 'pushy', + 'putrid', + 'puzzled', + 'puzzling', + 'quack', + 'quaint', + 'quaint', + 'qualified', + 'quarrelsome', + 'quarterly', + 'queasy', + 'querulous', + 'questionable', + 'quick', + 'quickest', + 'quick-witted', + 'quiet', + 'quintessential', + 'quirky', + 'quixotic', + 'quixotic', + 'quizzical', + 'rabid', + 'racial', + 'radiant', + 'ragged', + 'rainy', + 'rambunctious', + 'rampant', + 'rapid', + 'rare', + 'rash', + 'raspy', + 'ratty', + 'raw', + 'ready', + 'real', + 'realistic', + 'reasonable', + 'rebel', + 'recent', + 'receptive', + 'reckless', + 'recondite', + 'rectangular', + 'red', + 'redundant', + 'reflecting', + 'reflective', + 'regal', + 'regular', + 'reliable', + 'relieved', + 'remarkable', + 'reminiscent', + 'remorseful', + 'remote', + 'repentant', + 'repulsive', + 'required', + 'resolute', + 'resonant', + 'respectful', + 'responsible', + 'responsive', + 'revolving', + 'rewarding', + 'rhetorical', + 'rich', + 'right', + 'righteous', + 'rightful', + 'rigid', + 'ringed', + 'ripe', + 'ritzy', + 'roasted', + 'robust', + 'romantic', + 'roomy', + 'rosy', + 'rotating', + 'rotten', + 'rotund', + 'rough', + 'round', + 'rowdy', + 'royal', + 'rubbery', + 'ruddy', + 'rude', + 'rundown', + 'runny', + 'rural', + 'rustic  rusty', + 'ruthless', + 'sable', + 'sad', + 'safe', + 'salty', + 'same', + 'sandy', + 'sane', + 'sarcastic', + 'sardonic', + 'sassy', + 'satisfied', + 'satisfying', + 'savory', + 'scaly', + 'scandalous', + 'scant', + 'scarce', + 'scared', + 'scary', + 'scattered', + 'scented', + 'scholarly', + 'scientific', + 'scintillating', + 'scornful', + 'scratchy', + 'scrawny', + 'screeching', + 'second', + 'secondary', + 'second-hand', + 'secret', + 'secretive', + 'sedate', + 'seemly', + 'selective', + 'self-assured', + 'selfish', + 'self-reliant', + 'sentimental', + 'separate', + 'serene', + 'serious', + 'serpentine', + 'several', + 'severe', + 'shabby', + 'shadowy', + 'shady', + 'shaggy', + 'shaky', + 'shallow', + 'shameful', + 'shameless', + 'sharp', + 'shimmering', + 'shiny', + 'shivering', + 'shocked', + 'shocking', + 'shoddy', + 'short', + 'short-term', + 'showy', + 'shrill', + 'shut', + 'shy', + 'sick', + 'silent', + 'silky', + 'silly', + 'silver', + 'similar', + 'simple', + 'simplistic', + 'sincere', + 'sinful', + 'single', + 'six', + 'sizzling', + 'skeletal', + 'skillful', + 'skinny', + 'sleepy', + 'slight', + 'slim', + 'slimy', + 'slippery', + 'sloppy', + 'slow', + 'slushy', + 'small', + 'smarmy', + 'smart', + 'smelly', + 'smiling', + 'smoggy', + 'smooth', + 'smug', + 'snappy', + 'snarling', + 'sneaky', + 'sniveling', + 'snobbish', + 'snoopy', + 'snotty', + 'sociable', + 'soft', + 'soggy', + 'solid', + 'somber', + 'some', + 'sophisticated', + 'sordid', + 'sore', + 'sorrowful', + 'soulful', + 'soupy', + 'sour', + 'sour', + 'spanish', + 'sparkling', + 'sparse', + 'special', + 'specific', + 'spectacular', + 'speedy', + 'spherical', + 'spicy', + 'spiffy', + 'spiky', + 'spirited', + 'spiritual', + 'spiteful', + 'splendid', + 'spooky', + 'spotless', + 'spotted', + 'spotty', + 'spry', + 'spurious', + 'squalid', + 'square', + 'squeaky', + 'squealing', + 'squeamish', + 'squiggly', + 'stable', + 'staid', + 'stained', + 'staking', + 'stale', + 'standard', + 'standing', + 'starchy', + 'stark', + 'starry', + 'statuesque', + 'steadfast', + 'steady', + 'steel', + 'steep', + 'stereotyped', + 'sticky', + 'stiff', + 'stimulating', + 'stingy', + 'stormy', + 'stout', + 'straight', + 'strange', + 'strict', + 'strident', + 'striking', + 'striped', + 'strong', + 'studious', + 'stunning', + 'stunning', + 'stupendous', + 'stupid', + 'sturdy', + 'stylish', + 'subdued', + 'submissive', + 'subsequent', + 'substantial', + 'subtle', + 'suburban', + 'successful', + 'succinct', + 'succulent', + 'sudden', + 'sugary', + 'sulky', + 'sunny', + 'super', + 'superb', + 'superficial', + 'superior', + 'supportive', + 'supreme', + 'sure-footed', + 'surprised', + 'suspicious', + 'svelte', + 'swanky', + 'sweaty', + 'sweet', + 'sweltering', + 'swift', + 'sympathetic', + 'symptomatic', + 'synonymous', + 'taboo', + 'tacit', + 'tacky', + 'talented', + 'talkative', + 'tall', + 'tame', + 'tan', + 'tangible', + 'tangy', + 'tart', + 'tasteful', + 'tasteless', + 'tasty', + 'tattered', + 'taut', + 'tawdry', + 'tearful', + 'tedious', + 'teeming', + 'teeny', + 'teeny-tiny', + 'telling', + 'temporary', + 'tempting', + 'ten', + 'tender', + 'tense', + 'tenuous', + 'tepid', + 'terrible', + 'terrific', + 'tested', + 'testy', + 'thankful', + 'that', + 'therapeutic', + 'these', + 'thick', + 'thin', + 'thinkable', + 'third', + 'thirsty', + 'this', + 'thorny', + 'thorough', + 'those', + 'thoughtful', + 'thoughtless', + 'threadbare', + 'threatening', + 'three', + 'thrifty', + 'thundering', + 'thunderous', + 'tidy', + 'tight', + 'tightfisted', + 'timely', + 'tinted', + 'tiny', + 'tired', + 'tiresome', + 'toothsome', + 'torn', + 'torpid', + 'total', + 'tough', + 'towering', + 'tragic', + 'trained', + 'tranquil', + 'trashy', + 'traumatic', + 'treasured', + 'tremendous', + 'triangular', + 'tricky', + 'trifling', + 'trim', + 'trite', + 'trivial', + 'troubled', + 'truculent', + 'true', + 'trusting', + 'trustworthy', + 'trusty', + 'truthful', + 'tubby', + 'turbulent', + 'twin', + 'two', + 'typical', + 'ubiquitous', + 'ugliest', + 'ugly', + 'ultimate', + 'ultra', + 'unable', + 'unaccountable', + 'unarmed', + 'unaware', + 'unbecoming', + 'unbiased', + 'uncomfortable', + 'uncommon', + 'unconscious', + 'uncovered', + 'understated', + 'understood', + 'undesirable', + 'unequal', + 'unequaled', + 'uneven', + 'unfinished', + 'unfit', + 'unfolded', + 'unfortunate', + 'unhappy', + 'unhealthy', + 'uniform', + 'unimportant', + 'uninterested', + 'unique', + 'united', + 'unkempt', + 'unknown', + 'unlawful', + 'unlined', + 'unlucky', + 'unnatural', + 'unpleasant', + 'unrealistic', + 'unripe', + 'unruly', + 'unselfish', + 'unsightly', + 'unsteady', + 'unsuitable', + 'unsung', + 'untidy', + 'untimely', + 'untried', + 'untrue', + 'unused', + 'unusual', + 'unwelcome', + 'unwieldy', + 'unwitting', + 'unwritten', + 'upbeat', + 'uppity', + 'upright', + 'upset', + 'uptight', + 'urban', + 'usable', + 'used', + 'used', + 'useful', + 'useless', + 'utilized', + 'utopian', + 'utter', + 'uttermost', + 'vacant', + 'vacuous', + 'vagabond', + 'vague', + 'vain', + 'valid', + 'valuable', + 'vapid', + 'variable', + 'various', + 'vast', + 'velvety', + 'venerated', + 'vengeful', + 'venomous', + 'verdant', + 'verifiable', + 'versed', + 'vexed', + 'vibrant', + 'vicious', + 'victorious', + 'vigilant', + 'vigorous', + 'villainous', + 'violent', + 'violet', + 'virtual', + 'virtuous', + 'visible', + 'vital', + 'vivacious', + 'vivid', + 'voiceless', + 'volatile', + 'voluminous', + 'voracious', + 'vulgar', + 'wacky', + 'waggish', + 'waiting', + 'wakeful', + 'wan', + 'wandering', + 'wanting', + 'warlike', + 'warm', + 'warmhearted', + 'warped', + 'wary', + 'wasteful', + 'watchful', + 'waterlogged', + 'watery', + 'wavy', + 'weak', + 'wealthy', + 'weary', + 'webbed', + 'wee', + 'weekly', + 'weepy', + 'weighty', + 'weird', + 'welcome', + 'well-documented', + 'well-groomed', + 'well-informed', + 'well-lit', + 'well-made', + 'well-off', + 'well-to-do', + 'well-worn', + 'wet', + 'which', + 'whimsical', + 'whirlwind', + 'whispered', + 'whispering', + 'white', + 'whole', + 'wholesale', + 'whopping', + 'wicked', + 'wide', + 'wide-eyed', + 'wiggly', + 'wild', + 'willing', + 'wilted', + 'winding', + 'windy', + 'winged', + 'wiry', + 'wise', + 'wistful', + 'witty', + 'wobbly', + 'woebegone', + 'woeful', + 'womanly', + 'wonderful', + 'wooden', + 'woozy', + 'wordy', + 'workable', + 'worldly', + 'worn', + 'worried', + 'worrisome', + 'worse', + 'worst', + 'worthless', + 'worthwhile', + 'worthy', + 'wrathful', + 'wretched', + 'writhing', + 'wrong', + 'wry', + 'xenophobic', + 'yawning', + 'yearly', + 'yellow', + 'yellowish', + 'yielding', + 'young', + 'youthful', + 'yummy', + 'zany', + 'zealous', + 'zesty', + 'zigzag', + 'zippy', + 'zonked', +]; + +function pickRandom(array) { + return array[~~(Math.random() * array.length)]; +} + +function nameyMcNameface(mcMode) { + if (mcMode === void 0) mcMode = false; + + var animal = pickRandom(animals); + if (mcMode) { + animal = 'mc' + animal.substr(0, 1).toUpperCase() + animal.substr(1); + } + + return pickRandom(adjectives) + '-' + animal; +} + +export default nameyMcNameface; diff --git a/yarn.lock b/yarn.lock index 5f6dfbf5..e77f5756 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,23 +2,57 @@ # yarn lockfile v1 -"@babel/polyfill@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0.tgz#c8ff65c9ec3be6a1ba10113ebd40e8750fb90bff" - integrity sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q== +"@babel/code-frame@^7.10.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: - core-js "^2.5.7" - regenerator-runtime "^0.11.1" + "@babel/highlight" "^7.12.13" + +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/highlight@^7.12.13": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" + integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/polyfill@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" + integrity sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.4" "@polka/url@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" integrity sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw== -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@rollup/plugin-html@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-html/-/plugin-html-0.2.3.tgz#bed48fc18dbde345c0ef09b0b53a165d7bd3b7cd" + integrity sha512-efx8Ud1FWaHmj3Es5parp6uRt1DPyKq9A8t1GEZoNsYB4UTQQIL8PsjxcJOlH+P3QKRsSv1rIJhiMvuG4+kfwg== + +"@rollup/pluginutils@4": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.0.tgz#0dcc61c780e39257554feb7f77207dceca13c838" + integrity sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + +"@types/estree@*": + version "0.0.46" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" + integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== "@types/node@*": version "10.12.12" @@ -49,6 +83,13 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -103,6 +144,15 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + clean-css@4.2.x: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" @@ -110,11 +160,28 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + commander@2.17.x, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -130,7 +197,7 @@ concat-stream@1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -core-js@^2.5.7: +core-js@^2.6.5: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== @@ -198,11 +265,16 @@ estree-walker@^0.2.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" integrity sha1-va/oCVOD2EFNXcLs9MkXO225QS4= -estree-walker@^0.6.0, estree-walker@^0.6.1: +estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + events-to-array@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" @@ -253,6 +325,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -270,6 +347,18 @@ glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globalyzer@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" @@ -287,6 +376,16 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -333,7 +432,7 @@ inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -is-core-module@^2.1.0: +is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== @@ -352,11 +451,32 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= +is-reference@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@^3.2.7: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -377,6 +497,11 @@ magic-string@^0.25.2: dependencies: sourcemap-codec "^1.4.4" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + mime@^2.0.3, mime@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" @@ -467,6 +592,11 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + plur@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" @@ -520,6 +650,13 @@ q@^1.0.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + re-emitter@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/re-emitter/-/re-emitter-1.1.3.tgz#fa9e319ffdeeeb35b27296ef0f3d374dac2f52a7" @@ -538,10 +675,10 @@ readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.2.2, readable-str string_decoder "~1.1.1" util-deprecate "~1.0.1" -regenerator-runtime@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== relateurl@0.2.x: version "0.2.7" @@ -558,12 +695,12 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= -resolve@^1.10.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== +resolve@^1.11.0, resolve@^1.11.1: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.1.0" + is-core-module "^2.2.0" path-parse "^1.0.6" rimraf@^2.6.1: @@ -573,15 +710,37 @@ rimraf@^2.6.1: dependencies: glob "^7.0.5" -rollup-plugin-commonjs@^9.2.0: - version "9.3.4" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz#2b3dddbbbded83d45c36ff101cdd29e924fd23bc" - integrity sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w== +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: - estree-walker "^0.6.0" + glob "^7.1.3" + +rollup-plugin-cleaner@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-cleaner/-/rollup-plugin-cleaner-1.0.0.tgz#9f2d7226327fca9109b68c18fea77b427e33c193" + integrity sha512-q+Zf9estkFwGede9QzmbkhKeuXzlliOvcICVNzBHAs5xYPPs1XLtfin5TMU2tC2EYjmfaF97saY9MnQM6Og4eA== + dependencies: + rimraf "^2.6.3" + +rollup-plugin-commonjs@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb" + integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q== + dependencies: + estree-walker "^0.6.1" + is-reference "^1.1.2" magic-string "^0.25.2" - resolve "^1.10.0" - rollup-pluginutils "^2.6.0" + resolve "^1.11.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-css-only@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz#6a701cc5b051c6b3f0961e69b108a9a118e1b1df" + integrity sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA== + dependencies: + "@rollup/pluginutils" "4" rollup-plugin-html@^0.2.1: version "0.2.1" @@ -591,24 +750,34 @@ rollup-plugin-html@^0.2.1: html-minifier "^3.0.2" rollup-pluginutils "^1.5.0" -rollup-plugin-node-resolve@^4.0.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz#7d370f8d6fd3031006a0032c38262dd9be3c6250" - integrity sha512-t/64I6l7fZ9BxqD3XlX4ZeO6+5RLKyfpwE2CiPNUKa+GocPlQhf/C208ou8y3AwtNsc6bjSk/8/6y/YAyxCIvw== +rollup-plugin-node-resolve@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" + integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== dependencies: "@types/resolve" "0.0.8" builtin-modules "^3.1.0" is-module "^1.0.0" - resolve "^1.10.0" + resolve "^1.11.1" + rollup-pluginutils "^2.8.1" -rollup-plugin-svelte@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-6.1.1.tgz#66362cf0500fb7a848283ebcf19d289a60ef0871" - integrity sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow== +rollup-plugin-svelte@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.0.tgz#d45f2b92b1014be4eb46b55aa033fb9a9c65f04d" + integrity sha512-vopCUq3G+25sKjwF5VilIbiY6KCuMNHP1PFvx2Vr3REBNMDllKHFZN2B9jwwC+MqNc3UPKkjXnceLPEjTjXGXg== dependencies: require-relative "^0.8.7" rollup-pluginutils "^2.8.2" - sourcemap-codec "^1.4.8" + +rollup-plugin-terser@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" rollup-pluginutils@^1.5.0: version "1.5.2" @@ -618,26 +787,37 @@ rollup-pluginutils@^1.5.0: estree-walker "^0.2.1" minimatch "^3.0.2" -rollup-pluginutils@^2.6.0, rollup-pluginutils@^2.8.2: +rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== dependencies: estree-walker "^0.6.1" -rollup@^0.66.6: - version "0.66.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.66.6.tgz#ce7d6185beb7acea644ce220c25e71ae03275482" - integrity sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw== - dependencies: - "@types/estree" "0.0.39" - "@types/node" "*" +rollup@^2.41.2: + version "2.41.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.41.2.tgz#b7db5cb7c21c2d524e8b26ef39c7e9808a290c7e" + integrity sha512-6u8fJJXJx6fmvKrAC9DHYZgONvSkz8S9b/VFBjoQ6dkKdHyPpPbpqiNl2Bao9XBzDHpq672X6sGZ9G1ZBqAHMg== + optionalDependencies: + fsevents "~2.3.1" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + sirv@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/sirv/-/sirv-0.2.2.tgz#334d86074c73008fda60129b2487ae94db1fbc7b" @@ -647,12 +827,25 @@ sirv@^0.2.2: mime "^2.3.1" tiny-glob "^0.2.0" -source-map@~0.6.0, source-map@~0.6.1: +source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -688,10 +881,24 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -svelte@^3.31.0: - version "3.31.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.31.0.tgz#13966e5f55b975bc86675469bb2c58dd0e558d97" - integrity sha512-r+n8UJkDqoQm1b+3tA3Lh6mHXKpcfOSOuEuIo5gE2W9wQYi64RYX/qE6CZBDDsP/H4M+N426JwY7XGH4xASvGQ== +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +svelte@^3.35.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.35.0.tgz#e0d0ba60c4852181c2b4fd851194be6fda493e65" + integrity sha512-gknlZkR2sXheu/X+B7dDImwANVvK1R0QGQLd8CNIfxxGPeXBmePnxfzb6fWwTQRsYQG7lYkZXvpXJvxvpsoB7g== tap-diff@^0.1.1: version "0.1.1" @@ -741,6 +948,15 @@ tape-modern@^1.1.1: resolved "https://registry.yarnpkg.com/tape-modern/-/tape-modern-1.1.1.tgz#32189f709740672dc4ca965489208caba983986e" integrity sha512-sb1PNwSlphD2t5z9diUO7dd+r25sfdw94wD3yyi1Dcmu7oJ6wKMGdZ/pB6OZ0jqm0oAEESL4iOHeiCqnHhc1dg== +terser@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.0.tgz#138cdf21c5e3100b1b3ddfddf720962f88badcd2" + integrity sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" From b1571df1800b2398357a0a50b2d0b4398aae4151 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Mar 2021 17:51:37 +1100 Subject: [PATCH 156/635] beta bump --- Select.js | 1 - package.json | 2 +- src/Select.js | 3 --- 3 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 Select.js delete mode 100644 src/Select.js diff --git a/Select.js b/Select.js deleted file mode 100644 index 8de6a978..00000000 --- a/Select.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./src/Select'); diff --git a/package.json b/package.json index 8bcb580c..5d29deeb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "3.17.0", + "version": "4.0.0-beta.1", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 1196a16a1bdb2aca39215c86984974263e261cfe Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Mar 2021 19:03:13 +1100 Subject: [PATCH 160/635] moving around / removing some old stuff --- .editorconfig | 4 ---- .gitignore | 4 +--- .npmignore | 1 + .travis.yml | 7 ------- appveyor.yml | 30 ------------------------------ src/Select.svelte | 9 +++++---- index.d.ts => src/index.d.ts | 0 src/index.js | 1 + 8 files changed, 8 insertions(+), 48 deletions(-) delete mode 100644 .editorconfig create mode 100644 .npmignore delete mode 100644 .travis.yml delete mode 100644 appveyor.yml rename index.d.ts => src/index.d.ts (100%) create mode 100644 src/index.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 720535e1..00000000 --- a/.editorconfig +++ /dev/null @@ -1,4 +0,0 @@ -[*] -insert_final_newline = true -indent_size = 2 -indent_style = space diff --git a/.gitignore b/.gitignore index dfc9c3ee..620211cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ node_modules .DS_Store .idea -index.js -index.mjs .nova -/dist/ +dist diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..7fe306fa --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +/dist/test/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c84e0924..00000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: - - "stable" - -env: - global: - - BUILD_TIMEOUT=10000 diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 64ab3aab..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,30 +0,0 @@ -# http://www.appveyor.com/docs/appveyor-yml - -version: "{build}" - -clone_depth: 10 - -init: - - git config --global core.autocrlf false - -environment: - matrix: - # node.js - - nodejs_version: 8 - -install: - - ps: Install-Product node $env:nodejs_version - - npm install - -build: off - -test_script: - - node --version && npm --version - - npm test - -matrix: - fast_finish: false - -# cache: -# - C:\Users\appveyor\AppData\Roaming\npm-cache -> package.json # npm cache -# - node_modules -> package.json # local npm modules diff --git a/src/Select.svelte b/src/Select.svelte index e951d954..ef800e17 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -766,6 +766,7 @@ letter-spacing: var(--inputLetterSpacing, -0.08px); position: absolute; left: var(--inputLeft, 0); + margin: var(--inputMargin, 0); } .selectContainer input::placeholder { @@ -984,10 +985,10 @@ > {/if} diff --git a/index.d.ts b/src/index.d.ts similarity index 100% rename from index.d.ts rename to src/index.d.ts diff --git a/src/index.js b/src/index.js new file mode 100644 index 00000000..297d202b --- /dev/null +++ b/src/index.js @@ -0,0 +1 @@ +export { default as default } from './Select.svelte'; From 3449b1023ba3c2f1b41cfe310a69c99f3ae8e2e9 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Mar 2021 19:03:47 +1100 Subject: [PATCH 161/635] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f7ee076..19f9f7db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.0.0-beta.2", + "version": "4.0.0-beta.3", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A + ``` ## API - `items: Array` Default: `[]`. List of selectable items that appear in the dropdown. -- `selectedValue: Any` Default: `undefined`. Selected item or items +- `value: Any` Default: `undefined`. Selected item or items - `filterText: String` Default: `''`. Text to filter `items` by. - `placeholder: String` Default: `'Select...'`. Placeholder text. - `noOptionsMessage: String` Default: `'No options'`. Message to display in list when there are no `items`. @@ -56,9 +56,9 @@ yarn add svelte-select - `containerClasses: String` Default: `''`. Add extra container classes, for example 'global-x local-y'. - `containerStyles: String` Default: `''`. Add inline styles to container. - `isClearable: Boolean` Default: `true`. Enable clearing of selected items. -- `isCreatable: Boolean` Default: `false`. Can create new item(s) to be added to `selectedValue`. +- `isCreatable: Boolean` Default: `false`. Can create new item(s) to be added to `value`. - `isDisabled: Boolean` Default: `false`. Disable select. -- `isMulti: Boolean` Default: `false`. Enable multi-select, `selectedValue` becomes an array of selected items. +- `isMulti: Boolean` Default: `false`. Enable multi-select, `value` becomes an array of selected items. - `isSearchable: Boolean` Default: `true`. Enable search/filtering of `items` via `filterText`. - `isGroupHeaderSelectable: Boolean` Default: `false`. Enable selectable group headers in `items` (see adv demo). - `listPlacement: String` Default: `'auto'`. When `'auto'` displays either `'top'` or `'bottom'` depending on viewport. @@ -129,9 +129,9 @@ export let getGroupHeaderLabel = option => { ```js export function handleClear() { - selectedValue = undefined; + value = undefined; listOpen = false; - dispatch("clear", selectedValue); + dispatch("clear", value); handleFocus(); } ``` @@ -182,7 +182,7 @@ You can also use the `inputStyles` prop to write in any override styles needed f | Event Name | Callback | Description | |------|------|----------| -| select | { detail } | fires when selectedValue changes +| select | { detail } | fires when value changes | clear | - | fires when clear all is invoked | loaded | { items } | fires when `loadOptions` resolves | error | { type, details } | fires when error is caught @@ -222,7 +222,7 @@ test.only('when getSelectionLabel contains HTML then render the HTML', async (t) const select = new Select({ target, props: { - selectedValue: items[0], + value: items[0], getSelectionLabel: (option) => `

${option.label}

`, } }); diff --git a/package.json b/package.json index 488ed745..b65e054f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.0.0-beta.3", + "version": "4.0.0-beta.4", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A was created with unknown prop '${key}'`); + }); + + function input_1_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + input = $$value; + $$invalidate(4, input); + }); + } + + function input_1_input_handler() { + filterText = this.value; + $$invalidate(3, filterText); + } + + function input_1_binding_1($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + input = $$value; + $$invalidate(4, input); + }); + } + + function input_1_input_handler_1() { + filterText = this.value; + $$invalidate(3, filterText); + } + + function div_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + container = $$value; + $$invalidate(0, container); + }); + } + + $$self.$$set = $$props => { + if ("container" in $$props) $$invalidate(0, container = $$props.container); + if ("input" in $$props) $$invalidate(4, input = $$props.input); + if ("Item" in $$props) $$invalidate(39, Item$1 = $$props.Item); + if ("Selection" in $$props) $$invalidate(6, Selection$1 = $$props.Selection); + if ("MultiSelection" in $$props) $$invalidate(7, MultiSelection$1 = $$props.MultiSelection); + if ("isMulti" in $$props) $$invalidate(8, isMulti = $$props.isMulti); + if ("multiFullItemClearable" in $$props) $$invalidate(9, multiFullItemClearable = $$props.multiFullItemClearable); + if ("isDisabled" in $$props) $$invalidate(10, isDisabled = $$props.isDisabled); + if ("isCreatable" in $$props) $$invalidate(40, isCreatable = $$props.isCreatable); + if ("isFocused" in $$props) $$invalidate(1, isFocused = $$props.isFocused); + if ("value" in $$props) $$invalidate(2, value = $$props.value); + if ("filterText" in $$props) $$invalidate(3, filterText = $$props.filterText); + if ("placeholder" in $$props) $$invalidate(41, placeholder = $$props.placeholder); + if ("items" in $$props) $$invalidate(35, items = $$props.items); + if ("itemFilter" in $$props) $$invalidate(42, itemFilter = $$props.itemFilter); + if ("groupBy" in $$props) $$invalidate(43, groupBy = $$props.groupBy); + if ("groupFilter" in $$props) $$invalidate(44, groupFilter = $$props.groupFilter); + if ("isGroupHeaderSelectable" in $$props) $$invalidate(45, isGroupHeaderSelectable = $$props.isGroupHeaderSelectable); + if ("getGroupHeaderLabel" in $$props) $$invalidate(46, getGroupHeaderLabel = $$props.getGroupHeaderLabel); + if ("getOptionLabel" in $$props) $$invalidate(47, getOptionLabel = $$props.getOptionLabel); + if ("optionIdentifier" in $$props) $$invalidate(48, optionIdentifier = $$props.optionIdentifier); + if ("loadOptions" in $$props) $$invalidate(49, loadOptions = $$props.loadOptions); + if ("hasError" in $$props) $$invalidate(11, hasError = $$props.hasError); + if ("containerStyles" in $$props) $$invalidate(12, containerStyles = $$props.containerStyles); + if ("getSelectionLabel" in $$props) $$invalidate(13, getSelectionLabel = $$props.getSelectionLabel); + if ("createGroupHeaderItem" in $$props) $$invalidate(50, createGroupHeaderItem = $$props.createGroupHeaderItem); + if ("createItem" in $$props) $$invalidate(51, createItem = $$props.createItem); + if ("isSearchable" in $$props) $$invalidate(14, isSearchable = $$props.isSearchable); + if ("inputStyles" in $$props) $$invalidate(15, inputStyles = $$props.inputStyles); + if ("isClearable" in $$props) $$invalidate(16, isClearable = $$props.isClearable); + if ("isWaiting" in $$props) $$invalidate(5, isWaiting = $$props.isWaiting); + if ("listPlacement" in $$props) $$invalidate(52, listPlacement = $$props.listPlacement); + if ("listOpen" in $$props) $$invalidate(36, listOpen = $$props.listOpen); + if ("list" in $$props) $$invalidate(37, list = $$props.list); + if ("isVirtualList" in $$props) $$invalidate(53, isVirtualList = $$props.isVirtualList); + if ("loadOptionsInterval" in $$props) $$invalidate(54, loadOptionsInterval = $$props.loadOptionsInterval); + if ("noOptionsMessage" in $$props) $$invalidate(55, noOptionsMessage = $$props.noOptionsMessage); + if ("hideEmptyState" in $$props) $$invalidate(56, hideEmptyState = $$props.hideEmptyState); + if ("filteredItems" in $$props) $$invalidate(38, filteredItems = $$props.filteredItems); + if ("inputAttributes" in $$props) $$invalidate(57, inputAttributes = $$props.inputAttributes); + if ("listAutoWidth" in $$props) $$invalidate(58, listAutoWidth = $$props.listAutoWidth); + if ("itemHeight" in $$props) $$invalidate(59, itemHeight = $$props.itemHeight); + if ("Icon" in $$props) $$invalidate(17, Icon = $$props.Icon); + if ("iconProps" in $$props) $$invalidate(18, iconProps = $$props.iconProps); + if ("showChevron" in $$props) $$invalidate(19, showChevron = $$props.showChevron); + if ("showIndicator" in $$props) $$invalidate(20, showIndicator = $$props.showIndicator); + if ("containerClasses" in $$props) $$invalidate(21, containerClasses = $$props.containerClasses); + if ("indicatorSvg" in $$props) $$invalidate(22, indicatorSvg = $$props.indicatorSvg); + if ("ClearIcon" in $$props) $$invalidate(23, ClearIcon$1 = $$props.ClearIcon); + }; + + $$self.$capture_state = () => ({ + beforeUpdate, + createEventDispatcher, + onDestroy, + onMount, + tick, + List, + ItemComponent: Item, + SelectionComponent: Selection, + MultiSelectionComponent: MultiSelection, + isOutOfViewport, + debounce, + DefaultClearIcon: ClearIcon, + dispatch, + container, + input, + Item: Item$1, + Selection: Selection$1, + MultiSelection: MultiSelection$1, + isMulti, + multiFullItemClearable, + isDisabled, + isCreatable, + isFocused, + value, + filterText, + placeholder, + items, + itemFilter, + groupBy, + groupFilter, + isGroupHeaderSelectable, + getGroupHeaderLabel, + getOptionLabel, + optionIdentifier, + loadOptions, + hasError, + containerStyles, + getSelectionLabel, + createGroupHeaderItem, + createItem, + isSearchable, + inputStyles, + isClearable, + isWaiting, + listPlacement, + listOpen, + list, + isVirtualList, + loadOptionsInterval, + noOptionsMessage, + hideEmptyState, + filteredItems, + inputAttributes, + listAutoWidth, + itemHeight, + Icon, + iconProps, + showChevron, + showIndicator, + containerClasses, + indicatorSvg, + ClearIcon: ClearIcon$1, + target, + activevalue, + originalItemsClone, + VirtualList, + prev_value, + prev_filterText, + prev_isFocused, + prev_filteredItems, + resetFilter, + getItemsHasInvoked, + getItems, + setvalue, + _inputAttributes, + assignInputAttributes, + convertStringItemsToObjects, + resetFilteredItems, + filterItem, + setupFilteredItems, + filterGroupedItems, + dispatchSelectedItem, + setupFilterText, + setupFocus, + VirtualListComponent, + setupVirtualList, + setupFilteredItem, + checkvalueForDuplicates, + findItem, + updatevalueDisplay, + setList, + handleMultiItemClear, + getPosition, + handleKeyDown, + handleFocus, + removeList, + handleWindowClick, + handleClick, + handleClear, + loadList, + showSelectedItem, + placeholderText + }); + + $$self.$inject_state = $$props => { + if ("container" in $$props) $$invalidate(0, container = $$props.container); + if ("input" in $$props) $$invalidate(4, input = $$props.input); + if ("Item" in $$props) $$invalidate(39, Item$1 = $$props.Item); + if ("Selection" in $$props) $$invalidate(6, Selection$1 = $$props.Selection); + if ("MultiSelection" in $$props) $$invalidate(7, MultiSelection$1 = $$props.MultiSelection); + if ("isMulti" in $$props) $$invalidate(8, isMulti = $$props.isMulti); + if ("multiFullItemClearable" in $$props) $$invalidate(9, multiFullItemClearable = $$props.multiFullItemClearable); + if ("isDisabled" in $$props) $$invalidate(10, isDisabled = $$props.isDisabled); + if ("isCreatable" in $$props) $$invalidate(40, isCreatable = $$props.isCreatable); + if ("isFocused" in $$props) $$invalidate(1, isFocused = $$props.isFocused); + if ("value" in $$props) $$invalidate(2, value = $$props.value); + if ("filterText" in $$props) $$invalidate(3, filterText = $$props.filterText); + if ("placeholder" in $$props) $$invalidate(41, placeholder = $$props.placeholder); + if ("items" in $$props) $$invalidate(35, items = $$props.items); + if ("itemFilter" in $$props) $$invalidate(42, itemFilter = $$props.itemFilter); + if ("groupBy" in $$props) $$invalidate(43, groupBy = $$props.groupBy); + if ("groupFilter" in $$props) $$invalidate(44, groupFilter = $$props.groupFilter); + if ("isGroupHeaderSelectable" in $$props) $$invalidate(45, isGroupHeaderSelectable = $$props.isGroupHeaderSelectable); + if ("getGroupHeaderLabel" in $$props) $$invalidate(46, getGroupHeaderLabel = $$props.getGroupHeaderLabel); + if ("getOptionLabel" in $$props) $$invalidate(47, getOptionLabel = $$props.getOptionLabel); + if ("optionIdentifier" in $$props) $$invalidate(48, optionIdentifier = $$props.optionIdentifier); + if ("loadOptions" in $$props) $$invalidate(49, loadOptions = $$props.loadOptions); + if ("hasError" in $$props) $$invalidate(11, hasError = $$props.hasError); + if ("containerStyles" in $$props) $$invalidate(12, containerStyles = $$props.containerStyles); + if ("getSelectionLabel" in $$props) $$invalidate(13, getSelectionLabel = $$props.getSelectionLabel); + if ("createGroupHeaderItem" in $$props) $$invalidate(50, createGroupHeaderItem = $$props.createGroupHeaderItem); + if ("createItem" in $$props) $$invalidate(51, createItem = $$props.createItem); + if ("isSearchable" in $$props) $$invalidate(14, isSearchable = $$props.isSearchable); + if ("inputStyles" in $$props) $$invalidate(15, inputStyles = $$props.inputStyles); + if ("isClearable" in $$props) $$invalidate(16, isClearable = $$props.isClearable); + if ("isWaiting" in $$props) $$invalidate(5, isWaiting = $$props.isWaiting); + if ("listPlacement" in $$props) $$invalidate(52, listPlacement = $$props.listPlacement); + if ("listOpen" in $$props) $$invalidate(36, listOpen = $$props.listOpen); + if ("list" in $$props) $$invalidate(37, list = $$props.list); + if ("isVirtualList" in $$props) $$invalidate(53, isVirtualList = $$props.isVirtualList); + if ("loadOptionsInterval" in $$props) $$invalidate(54, loadOptionsInterval = $$props.loadOptionsInterval); + if ("noOptionsMessage" in $$props) $$invalidate(55, noOptionsMessage = $$props.noOptionsMessage); + if ("hideEmptyState" in $$props) $$invalidate(56, hideEmptyState = $$props.hideEmptyState); + if ("filteredItems" in $$props) $$invalidate(38, filteredItems = $$props.filteredItems); + if ("inputAttributes" in $$props) $$invalidate(57, inputAttributes = $$props.inputAttributes); + if ("listAutoWidth" in $$props) $$invalidate(58, listAutoWidth = $$props.listAutoWidth); + if ("itemHeight" in $$props) $$invalidate(59, itemHeight = $$props.itemHeight); + if ("Icon" in $$props) $$invalidate(17, Icon = $$props.Icon); + if ("iconProps" in $$props) $$invalidate(18, iconProps = $$props.iconProps); + if ("showChevron" in $$props) $$invalidate(19, showChevron = $$props.showChevron); + if ("showIndicator" in $$props) $$invalidate(20, showIndicator = $$props.showIndicator); + if ("containerClasses" in $$props) $$invalidate(21, containerClasses = $$props.containerClasses); + if ("indicatorSvg" in $$props) $$invalidate(22, indicatorSvg = $$props.indicatorSvg); + if ("ClearIcon" in $$props) $$invalidate(23, ClearIcon$1 = $$props.ClearIcon); + if ("target" in $$props) target = $$props.target; + if ("activevalue" in $$props) $$invalidate(25, activevalue = $$props.activevalue); + if ("originalItemsClone" in $$props) $$invalidate(60, originalItemsClone = $$props.originalItemsClone); + if ("VirtualList" in $$props) VirtualList = $$props.VirtualList; + if ("prev_value" in $$props) prev_value = $$props.prev_value; + if ("prev_filterText" in $$props) $$invalidate(61, prev_filterText = $$props.prev_filterText); + if ("prev_isFocused" in $$props) $$invalidate(62, prev_isFocused = $$props.prev_isFocused); + if ("prev_filteredItems" in $$props) $$invalidate(63, prev_filteredItems = $$props.prev_filteredItems); + if ("getItemsHasInvoked" in $$props) getItemsHasInvoked = $$props.getItemsHasInvoked; + if ("_inputAttributes" in $$props) $$invalidate(26, _inputAttributes = $$props._inputAttributes); + if ("VirtualListComponent" in $$props) VirtualListComponent = $$props.VirtualListComponent; + if ("showSelectedItem" in $$props) $$invalidate(27, showSelectedItem = $$props.showSelectedItem); + if ("placeholderText" in $$props) $$invalidate(28, placeholderText = $$props.placeholderText); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + $$self.$$.update = () => { + if ($$self.$$.dirty[1] & /*items*/ 16) { + updatevalueDisplay(items); + } + + if ($$self.$$.dirty[0] & /*value*/ 4) { + { + if (value) setvalue(); + } + } + + if ($$self.$$.dirty[1] & /*noOptionsMessage, list*/ 16777280) { + { + if (noOptionsMessage && list) list.$set({ noOptionsMessage }); + } + } + + if ($$self.$$.dirty[0] & /*isSearchable*/ 16384 | $$self.$$.dirty[1] & /*inputAttributes*/ 67108864) { + { + if (inputAttributes || !isSearchable) assignInputAttributes(); + } + } + + if ($$self.$$.dirty[0] & /*filterText*/ 8 | $$self.$$.dirty[1] & /*items, loadOptions, originalItemsClone, groupBy*/ 537137168) { + { + if (items && items.length > 0 && typeof items[0] !== "object") { + convertStringItemsToObjects(); + } + + if (loadOptions && filterText.length === 0 && originalItemsClone) { + resetFilteredItems(); + } else { + setupFilteredItems(); + } + + if (groupBy) { + filterGroupedItems(); + } + } + } + + if ($$self.$$.dirty[0] & /*isMulti, value*/ 260) { + { + if (isMulti && value && value.length > 1) { + checkvalueForDuplicates(); + } + } + } + + if ($$self.$$.dirty[0] & /*value*/ 4) { + { + if (value) { + dispatchSelectedItem(); + } + } + } + + if ($$self.$$.dirty[0] & /*container*/ 1 | $$self.$$.dirty[1] & /*listOpen*/ 32) { + { + if (container) { + if (listOpen) { + loadList(); + } else { + removeList(); + } + } + } + } + + if ($$self.$$.dirty[0] & /*isFocused*/ 2 | $$self.$$.dirty[2] & /*prev_isFocused*/ 1) { + { + if (isFocused !== prev_isFocused) { + setupFocus(); + } + } + } + + if ($$self.$$.dirty[0] & /*filterText*/ 8 | $$self.$$.dirty[1] & /*prev_filterText*/ 1073741824) { + { + if (filterText !== prev_filterText) { + setupFilterText(); + } + } + } + + if ($$self.$$.dirty[1] & /*filteredItems*/ 128 | $$self.$$.dirty[2] & /*prev_filteredItems*/ 2) { + { + if (prev_filteredItems !== filteredItems) { + setupFilteredItem(); + } + } + } + + if ($$self.$$.dirty[0] & /*value, filterText*/ 12) { + $$invalidate(27, showSelectedItem = value && filterText.length === 0); + } + + if ($$self.$$.dirty[0] & /*value*/ 4 | $$self.$$.dirty[1] & /*placeholder*/ 1024) { + $$invalidate(28, placeholderText = value ? "" : placeholder); + } + }; + + return [ + container, + isFocused, + value, + filterText, + input, + isWaiting, + Selection$1, + MultiSelection$1, + isMulti, + multiFullItemClearable, + isDisabled, + hasError, + containerStyles, + getSelectionLabel, + isSearchable, + inputStyles, + isClearable, + Icon, + iconProps, + showChevron, + showIndicator, + containerClasses, + indicatorSvg, + ClearIcon$1, + handleClear, + activevalue, + _inputAttributes, + showSelectedItem, + placeholderText, + handleMultiItemClear, + getPosition, + handleKeyDown, + handleFocus, + handleWindowClick, + handleClick, + items, + listOpen, + list, + filteredItems, + Item$1, + isCreatable, + placeholder, + itemFilter, + groupBy, + groupFilter, + isGroupHeaderSelectable, + getGroupHeaderLabel, + getOptionLabel, + optionIdentifier, + loadOptions, + createGroupHeaderItem, + createItem, + listPlacement, + isVirtualList, + loadOptionsInterval, + noOptionsMessage, + hideEmptyState, + inputAttributes, + listAutoWidth, + itemHeight, + originalItemsClone, + prev_filterText, + prev_isFocused, + prev_filteredItems, + input_1_binding, + input_1_input_handler, + input_1_binding_1, + input_1_input_handler_1, + div_binding + ]; +} + +class Select extends SvelteComponentDev { + constructor(options) { + super(options); + if (!document_1.getElementById("svelte-1ri8kk0-style")) add_css$3(); + + init( + this, + options, + instance$7, + create_fragment$7, + safe_not_equal, + { + container: 0, + input: 4, + Item: 39, + Selection: 6, + MultiSelection: 7, + isMulti: 8, + multiFullItemClearable: 9, + isDisabled: 10, + isCreatable: 40, + isFocused: 1, + value: 2, + filterText: 3, + placeholder: 41, + items: 35, + itemFilter: 42, + groupBy: 43, + groupFilter: 44, + isGroupHeaderSelectable: 45, + getGroupHeaderLabel: 46, + getOptionLabel: 47, + optionIdentifier: 48, + loadOptions: 49, + hasError: 11, + containerStyles: 12, + getSelectionLabel: 13, + createGroupHeaderItem: 50, + createItem: 51, + isSearchable: 14, + inputStyles: 15, + isClearable: 16, + isWaiting: 5, + listPlacement: 52, + listOpen: 36, + list: 37, + isVirtualList: 53, + loadOptionsInterval: 54, + noOptionsMessage: 55, + hideEmptyState: 56, + filteredItems: 38, + inputAttributes: 57, + listAutoWidth: 58, + itemHeight: 59, + Icon: 17, + iconProps: 18, + showChevron: 19, + showIndicator: 20, + containerClasses: 21, + indicatorSvg: 22, + ClearIcon: 23, + handleClear: 24 + }, + [-1, -1, -1, -1] + ); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Select", + options, + id: create_fragment$7.name + }); + } + + get container() { + return this.$$.ctx[0]; + } + + set container(container) { + this.$set({ container }); + flush(); + } + + get input() { + return this.$$.ctx[4]; + } + + set input(input) { + this.$set({ input }); + flush(); + } + + get Item() { + return this.$$.ctx[39]; + } + + set Item(Item) { + this.$set({ Item }); + flush(); + } + + get Selection() { + return this.$$.ctx[6]; + } + + set Selection(Selection) { + this.$set({ Selection }); + flush(); + } + + get MultiSelection() { + return this.$$.ctx[7]; + } + + set MultiSelection(MultiSelection) { + this.$set({ MultiSelection }); + flush(); + } + + get isMulti() { + return this.$$.ctx[8]; + } + + set isMulti(isMulti) { + this.$set({ isMulti }); + flush(); + } + + get multiFullItemClearable() { + return this.$$.ctx[9]; + } + + set multiFullItemClearable(multiFullItemClearable) { + this.$set({ multiFullItemClearable }); + flush(); + } + + get isDisabled() { + return this.$$.ctx[10]; + } + + set isDisabled(isDisabled) { + this.$set({ isDisabled }); + flush(); + } + + get isCreatable() { + return this.$$.ctx[40]; + } + + set isCreatable(isCreatable) { + this.$set({ isCreatable }); + flush(); + } + + get isFocused() { + return this.$$.ctx[1]; + } + + set isFocused(isFocused) { + this.$set({ isFocused }); + flush(); + } + + get value() { + return this.$$.ctx[2]; + } + + set value(value) { + this.$set({ value }); + flush(); + } + + get filterText() { + return this.$$.ctx[3]; + } + + set filterText(filterText) { + this.$set({ filterText }); + flush(); + } + + get placeholder() { + return this.$$.ctx[41]; + } + + set placeholder(placeholder) { + this.$set({ placeholder }); + flush(); + } + + get items() { + return this.$$.ctx[35]; + } + + set items(items) { + this.$set({ items }); + flush(); + } + + get itemFilter() { + return this.$$.ctx[42]; + } + + set itemFilter(itemFilter) { + this.$set({ itemFilter }); + flush(); + } + + get groupBy() { + return this.$$.ctx[43]; + } + + set groupBy(groupBy) { + this.$set({ groupBy }); + flush(); + } + + get groupFilter() { + return this.$$.ctx[44]; + } + + set groupFilter(groupFilter) { + this.$set({ groupFilter }); + flush(); + } + + get isGroupHeaderSelectable() { + return this.$$.ctx[45]; + } + + set isGroupHeaderSelectable(isGroupHeaderSelectable) { + this.$set({ isGroupHeaderSelectable }); + flush(); + } + + get getGroupHeaderLabel() { + return this.$$.ctx[46]; + } + + set getGroupHeaderLabel(getGroupHeaderLabel) { + this.$set({ getGroupHeaderLabel }); + flush(); + } + + get getOptionLabel() { + return this.$$.ctx[47]; + } + + set getOptionLabel(getOptionLabel) { + this.$set({ getOptionLabel }); + flush(); + } + + get optionIdentifier() { + return this.$$.ctx[48]; + } + + set optionIdentifier(optionIdentifier) { + this.$set({ optionIdentifier }); + flush(); + } + + get loadOptions() { + return this.$$.ctx[49]; + } + + set loadOptions(loadOptions) { + this.$set({ loadOptions }); + flush(); + } + + get hasError() { + return this.$$.ctx[11]; + } + + set hasError(hasError) { + this.$set({ hasError }); + flush(); + } + + get containerStyles() { + return this.$$.ctx[12]; + } + + set containerStyles(containerStyles) { + this.$set({ containerStyles }); + flush(); + } + + get getSelectionLabel() { + return this.$$.ctx[13]; + } + + set getSelectionLabel(getSelectionLabel) { + this.$set({ getSelectionLabel }); + flush(); + } + + get createGroupHeaderItem() { + return this.$$.ctx[50]; + } + + set createGroupHeaderItem(createGroupHeaderItem) { + this.$set({ createGroupHeaderItem }); + flush(); + } + + get createItem() { + return this.$$.ctx[51]; + } + + set createItem(createItem) { + this.$set({ createItem }); + flush(); + } + + get isSearchable() { + return this.$$.ctx[14]; + } + + set isSearchable(isSearchable) { + this.$set({ isSearchable }); + flush(); + } + + get inputStyles() { + return this.$$.ctx[15]; + } + + set inputStyles(inputStyles) { + this.$set({ inputStyles }); + flush(); + } + + get isClearable() { + return this.$$.ctx[16]; + } + + set isClearable(isClearable) { + this.$set({ isClearable }); + flush(); + } + + get isWaiting() { + return this.$$.ctx[5]; + } + + set isWaiting(isWaiting) { + this.$set({ isWaiting }); + flush(); + } + + get listPlacement() { + return this.$$.ctx[52]; + } + + set listPlacement(listPlacement) { + this.$set({ listPlacement }); + flush(); + } + + get listOpen() { + return this.$$.ctx[36]; + } + + set listOpen(listOpen) { + this.$set({ listOpen }); + flush(); + } + + get list() { + return this.$$.ctx[37]; + } + + set list(list) { + this.$set({ list }); + flush(); + } + + get isVirtualList() { + return this.$$.ctx[53]; + } + + set isVirtualList(isVirtualList) { + this.$set({ isVirtualList }); + flush(); + } + + get loadOptionsInterval() { + return this.$$.ctx[54]; + } + + set loadOptionsInterval(loadOptionsInterval) { + this.$set({ loadOptionsInterval }); + flush(); + } + + get noOptionsMessage() { + return this.$$.ctx[55]; + } + + set noOptionsMessage(noOptionsMessage) { + this.$set({ noOptionsMessage }); + flush(); + } + + get hideEmptyState() { + return this.$$.ctx[56]; + } + + set hideEmptyState(hideEmptyState) { + this.$set({ hideEmptyState }); + flush(); + } + + get filteredItems() { + return this.$$.ctx[38]; + } + + set filteredItems(filteredItems) { + this.$set({ filteredItems }); + flush(); + } + + get inputAttributes() { + return this.$$.ctx[57]; + } + + set inputAttributes(inputAttributes) { + this.$set({ inputAttributes }); + flush(); + } + + get listAutoWidth() { + return this.$$.ctx[58]; + } + + set listAutoWidth(listAutoWidth) { + this.$set({ listAutoWidth }); + flush(); + } + + get itemHeight() { + return this.$$.ctx[59]; + } + + set itemHeight(itemHeight) { + this.$set({ itemHeight }); + flush(); + } + + get Icon() { + return this.$$.ctx[17]; + } + + set Icon(Icon) { + this.$set({ Icon }); + flush(); + } + + get iconProps() { + return this.$$.ctx[18]; + } + + set iconProps(iconProps) { + this.$set({ iconProps }); + flush(); + } + + get showChevron() { + return this.$$.ctx[19]; + } + + set showChevron(showChevron) { + this.$set({ showChevron }); + flush(); + } + + get showIndicator() { + return this.$$.ctx[20]; + } + + set showIndicator(showIndicator) { + this.$set({ showIndicator }); + flush(); + } + + get containerClasses() { + return this.$$.ctx[21]; + } + + set containerClasses(containerClasses) { + this.$set({ containerClasses }); + flush(); + } + + get indicatorSvg() { + return this.$$.ctx[22]; + } + + set indicatorSvg(indicatorSvg) { + this.$set({ indicatorSvg }); + flush(); + } + + get ClearIcon() { + return this.$$.ctx[23]; + } + + set ClearIcon(ClearIcon) { + this.$set({ ClearIcon }); + flush(); + } + + get handleClear() { + return this.$$.ctx[24]; + } + + set handleClear(value) { + throw new Error(" + -

{selectedValue.label}

+

{value.label}

diff --git a/test/src/index.js b/test/src/index.js index 61345713..b036d030 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -164,7 +164,7 @@ test('should highlight active list item', async (t) => { target, props: { items: itemsWithIndex, - selectedValue: {value: 'pizza', label: 'Pizza', index: 1} + value: {value: 'pizza', label: 'Pizza', index: 1} } }); @@ -183,7 +183,7 @@ test('list scrolls to active item', async (t) => { target, props: { items: itemsWithIndex.concat(extras), - selectedValue: {value: 'sunday-roast', label: 'Sunday Roast'}, + value: {value: 'sunday-roast', label: 'Sunday Roast'}, } }); @@ -255,15 +255,15 @@ test('on enter active item fires a itemSelected event', async (t) => { } }); - let selectedValue = undefined; + let value = undefined; list.$on('itemSelected', event => { - selectedValue = event; + value = event; }); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(JSON.stringify(selectedValue.detail), JSON.stringify({value: 'cake', label: 'Cake', index: 2})); + t.equal(JSON.stringify(value.detail), JSON.stringify({value: 'cake', label: 'Cake', index: 2})); list.$destroy(); }); @@ -275,15 +275,15 @@ test('on tab active item fires a itemSelected event', async (t) => { } }); - let selectedValue = undefined; + let value = undefined; list.$on('itemSelected', event => { - selectedValue = event; + value = event; }); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Tab'})); - t.equal(JSON.stringify(selectedValue.detail), JSON.stringify({value: 'cake', label: 'Cake', index: 2})); + t.equal(JSON.stringify(value.detail), JSON.stringify({value: 'cake', label: 'Cake', index: 2})); list.$destroy(); }); @@ -292,7 +292,7 @@ test('on selected of current active item does not fire a itemSelected event', as target, props: { items: itemsWithIndex, - selectedValue: { value: 'chocolate', label: 'Chocolate', index: 0 } + value: { value: 'chocolate', label: 'Chocolate', index: 0 } } }); @@ -312,7 +312,7 @@ test('selected item\'s default view', async (t) => { const select = new Select({ target, props: { - selectedValue: {value: 'chips', label: 'Chips'}, + value: {value: 'chips', label: 'Chips'}, } }); @@ -320,27 +320,27 @@ test('selected item\'s default view', async (t) => { select.$destroy(); }); -test('select view updates with selectedValue updates', async (t) => { +test('select view updates with value updates', async (t) => { const select = new Select({ target, }); - await handleSet(select, {selectedValue: {value: 'chips', label: 'Chips'}}); + await handleSet(select, {value: {value: 'chips', label: 'Chips'}}); t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); select.$destroy(); }); -test('clear wipes selectedValue and updates view', async (t) => { +test('clear wipes value and updates view', async (t) => { const select = new Select({ target, props: { - selectedValue: {value: 'chips', label: 'Chips'}, + value: {value: 'chips', label: 'Chips'}, } }); await wait(0); - await handleSet(select, {selectedValue: undefined}); + await handleSet(select, {value: undefined}); t.ok(!target.querySelector('.selectedItem .selection')); select.$destroy(); @@ -600,7 +600,7 @@ test('typing in Select filter will hide selected Item', async (t) => { window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); select.$set({filterText: 'potato'}); - t.ok(!document.querySelector('.selectContainer .selectedValue')); + t.ok(!document.querySelector('.selectContainer .value')); select.$destroy(); }); @@ -716,7 +716,7 @@ test('Select input placeholder wipes while item is selected', async (t) => { target, props: { items, - selectedValue: {name: 'Item #2'}, + value: {name: 'Item #2'}, } }); @@ -826,7 +826,7 @@ test('Select container styles can be overridden', async (t) => { target, props: { items, - selectedValue: {name: 'Item #2'}, + value: {name: 'Item #2'}, containerStyles: `padding-left: 40px;` } }); @@ -896,7 +896,7 @@ test(`shouldn't be able to clear a disabled Select`, async (t) => { props: { items, isDisabled: true, - selectedValue: {name: 'Item #4'} + value: {name: 'Item #4'} } }); @@ -911,14 +911,14 @@ test(`two way binding between Select and it's parent component`, async (t) => { target, props: { items, - selectedValue: {value: 'chips', label: 'Chips'}, + value: {value: 'chips', label: 'Chips'}, } }); t.equal(document.querySelector('.selection').innerHTML, document.querySelector('.result').innerHTML); parent.$set({ - selectedValue: {value: 'ice-cream', label: 'Ice Cream'}, + value: {value: 'ice-cream', label: 'Ice Cream'}, }); t.equal(document.querySelector('.selection').innerHTML, document.querySelector('.result').innerHTML); @@ -1034,7 +1034,7 @@ test(`data shouldn't be stripped from item - currently only saves name`, async ( await querySelectorClick('.selectContainer'); await querySelectorClick('.listItem'); - t.equal(JSON.stringify(select.selectedValue), JSON.stringify({value: 'chocolate', label: 'Chocolate'})); + t.equal(JSON.stringify(select.value), JSON.stringify({value: 'chocolate', label: 'Chocolate'})); select.$destroy(); }); @@ -1131,7 +1131,7 @@ test('inputStyles prop applies css to select input', async (t) => { target, props: { items, - selectedValue: {value: 'pizza', label: 'Pizza'}, + value: {value: 'pizza', label: 'Pizza'}, inputStyles: `padding-left: 40px;` } }); @@ -1183,7 +1183,7 @@ test('clicking group header should not make a selected', async (t) => { await wait(0); await querySelectorClick('.listGroupTitle'); - t.equal(select.selectedValue, undefined); + t.equal(select.value, undefined); select.$destroy(); }); @@ -1201,7 +1201,7 @@ test('when groupBy, no active item and keydown enter is fired then list should c await wait(0); await querySelectorClick('.selectContainer'); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(select.selectedValue, undefined); + t.equal(select.value, undefined); select.$destroy(); }); @@ -1237,8 +1237,8 @@ test('when isGroupHeaderSelectable clicking group header should select createGro await querySelectorClick('.listItem'); - t.ok(select.selectedValue.isGroupHeader); - t.equal(select.selectedValue.label, createGroupHeaderItem(groupBy(groupItem), groupItem).label); + t.ok(select.value.isGroupHeader); + t.equal(select.value.label, createGroupHeaderItem(groupBy(groupItem), groupItem).label); select.$destroy(); }); @@ -1290,13 +1290,13 @@ test('groups should be sorted by expression', async (t) => { select.$destroy(); }); -test('when isMulti is true show each item in selectedValue', async (t) => { +test('when isMulti is true show each item in value', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: [ + value: [ {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'}, ], @@ -1310,13 +1310,13 @@ test('when isMulti is true show each item in selectedValue', async (t) => { select.$destroy(); }); -test('when isMulti is true and selectedValue is undefined show placeholder text', async (t) => { +test('when isMulti is true and value is undefined show placeholder text', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: undefined + value: undefined } }); @@ -1325,31 +1325,31 @@ test('when isMulti is true and selectedValue is undefined show placeholder text' select.$destroy(); }); -test('when isMulti is true clicking item in List will populate selectedValue', async (t) => { +test('when isMulti is true clicking item in List will populate value', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: undefined + value: undefined } }); await querySelectorClick('.selectContainer'); await querySelectorClick('.listItem'); - t.equal(JSON.stringify(select.selectedValue), JSON.stringify([{value: 'chocolate', label: 'Chocolate'}])); + t.equal(JSON.stringify(select.value), JSON.stringify([{value: 'chocolate', label: 'Chocolate'}])); select.$destroy(); }); -test('when isMulti is true items in selectedValue will not appear in List', async (t) => { +test('when isMulti is true items in value will not appear in List', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: [{value: 'chocolate', label: 'Chocolate'}] + value: [{value: 'chocolate', label: 'Chocolate'}] } }); @@ -1363,7 +1363,7 @@ test('when isMulti is true items in selectedValue will not appear in List', asyn select.$destroy(); }); -test('when isMulti is true both selectedValue and filterText filters List', async (t) => { +test('when isMulti is true both value and filterText filters List', async (t) => { const select = new Select({ target, props: { @@ -1371,7 +1371,7 @@ test('when isMulti is true both selectedValue and filterText filters List', asyn isMulti: true, items, filterText: 'Pizza', - selectedValue: [{value: 'chocolate', label: 'Chocolate'}] + value: [{value: 'chocolate', label: 'Chocolate'}] } }); @@ -1382,18 +1382,18 @@ test('when isMulti is true both selectedValue and filterText filters List', asyn select.$destroy(); }); -test('when isMulti is true clicking X on a selected item will remove it from selectedValue', async (t) => { +test('when isMulti is true clicking X on a selected item will remove it from value', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] + value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] } }); document.querySelector('.multiSelectItem_clear').click(); - t.equal(JSON.stringify(select.selectedValue), JSON.stringify([{value: 'pizza', label: 'Pizza'}])); + t.equal(JSON.stringify(select.value), JSON.stringify([{value: 'pizza', label: 'Pizza'}])); select.$destroy(); }); @@ -1404,7 +1404,7 @@ test('when isMulti is true and all selected items have been removed then placeho props: { isMulti: true, items, - selectedValue: [{value: 'chocolate', label: 'Chocolate'}] + value: [{value: 'chocolate', label: 'Chocolate'}] } }); @@ -1419,12 +1419,12 @@ test('when isMulti is true and items are selected then clear all should wipe all props: { isMulti: true, items, - selectedValue: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] + value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] } }); document.querySelector('.clearSelect').click(); - t.equal(select.selectedValue, undefined); + t.equal(select.value, undefined); select.$destroy(); }); @@ -1442,7 +1442,7 @@ test('when isMulti and groupBy is active then items should be selectable', async target.style.maxWidth = '400px'; await querySelectorClick('.selectContainer'); await querySelectorClick('.listItem'); - t.equal(JSON.stringify(select.selectedValue), JSON.stringify([{"isGroupItem":true,"value":"chocolate","label":"Chocolate","group":"Sweet"}])); + t.equal(JSON.stringify(select.value), JSON.stringify([{"isGroupItem":true,"value":"chocolate","label":"Chocolate","group":"Sweet"}])); select.$destroy(); }); @@ -1458,18 +1458,18 @@ test('when isMulti and selected items reach edge of container then Select height target.style.maxWidth = '250px'; t.ok(document.querySelector('.selectContainer').scrollHeight === 42); - await handleSet(select, {selectedValue: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}]}); + await handleSet(select, {value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}]}); t.ok(document.querySelector('.selectContainer').scrollHeight > 44); select.$destroy(); }); -test('when isMulti and selectedValue is populated then navigating with LeftArrow updates activeSelectedValue', async (t) => { +test('when isMulti and value is populated then navigating with LeftArrow updates activevalue', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], + value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], isFocused: true } }); @@ -1477,18 +1477,18 @@ test('when isMulti and selectedValue is populated then navigating with LeftArrow target.style.maxWidth = '100%'; window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - t.ok(select.$capture_state().activeSelectedValue === 1); + t.ok(select.$capture_state().activevalue === 1); select.$destroy(); }); -test('when isMulti and selectedValue is populated then navigating with ArrowRight updates activeSelectedValue', async (t) => { +test('when isMulti and value is populated then navigating with ArrowRight updates activevalue', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], + value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], isFocused: true } }); @@ -1497,12 +1497,12 @@ test('when isMulti and selectedValue is populated then navigating with ArrowRigh window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowRight'})); - t.ok(select.$capture_state().activeSelectedValue === 1); + t.ok(select.$capture_state().activevalue === 1); select.$destroy(); }); -test('when isMulti and selectedValue has items and list opens then first item in list should be active', async (t) => { +test('when isMulti and value has items and list opens then first item in list should be active', async (t) => { const select = new Select({ target, props: { @@ -1521,14 +1521,14 @@ test('when isMulti and selectedValue has items and list opens then first item in select.$destroy(); }); -test('when isMulti, isDisabled, and selectedValue has items then items should be locked', async (t) => { +test('when isMulti, isDisabled, and value has items then items should be locked', async (t) => { const select = new Select({ target, props: { isMulti: true, items, isDisabled: true, - selectedValue: [{value: 'chocolate', label: 'Chocolate'}], + value: [{value: 'chocolate', label: 'Chocolate'}], } }); @@ -1537,14 +1537,14 @@ test('when isMulti, isDisabled, and selectedValue has items then items should be select.$destroy(); }); -test('when isMulti is true show each item in selectedValue if simple arrays are used', async (t) => { +test('when isMulti is true show each item in value if simple arrays are used', async (t) => { const select = new Select({ target, props: { isMulti: true, test: true, items: ['pizza', 'chips', 'chocolate'], - selectedValue: ['pizza', 'chocolate'] + value: ['pizza', 'chocolate'] } }); @@ -1555,21 +1555,21 @@ test('when isMulti is true show each item in selectedValue if simple arrays are select.$destroy(); }); -test('when getValue method is set should use that key to update selectedValue', async (t) => { +test('when getValue method is set should use that key to update value', async (t) => { const select = new Select({ target, props: { items: [{id: 0, label: 'ONE'}, {id: 1, label: 'TWO'}], - selectedValue: {id: 0, label: 'ONE'}, + value: {id: 0, label: 'ONE'}, optionIdentifier: 'id' } }); - t.ok(select.selectedValue.id === 0); + t.ok(select.value.id === 0); await querySelectorClick('.selectContainer'); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.selectedValue.id === 1); + t.ok(select.value.id === 1); select.$destroy(); }); @@ -1610,12 +1610,12 @@ test('when noOptionsMessage is set and there are no items then show message', as select.$destroy(); }); -test('when getSelectionLabel method is supplied and selectedValue are no items then display result of getSelectionLabel', async (t) => { +test('when getSelectionLabel method is supplied and value are no items then display result of getSelectionLabel', async (t) => { const select = new Select({ target, props: { getSelectionLabel: (option) => option.notLabel, - selectedValue: {notLabel: 'This is not a label', value: 'not important'}, + value: {notLabel: 'This is not a label', value: 'not important'}, } }); @@ -1725,7 +1725,7 @@ test('when getSelectionLabel contains HTML then render the HTML', async (t) => { const select = new Select({ target, props: { - selectedValue: items[0], + value: items[0], getSelectionLabel: (option) => `

${option.label}

`, } }); @@ -1751,7 +1751,7 @@ test('when getOptionLabel contains HTML then render the HTML', async (t) => { select.$destroy(); }); -test('when isMulti is true, selectedValue populated and arrowLeft is pressed then no items in list should be active', async (t) => { +test('when isMulti is true, value populated and arrowLeft is pressed then no items in list should be active', async (t) => { const selectMultiSelected = new SelectMultiSelected({ target: testTarget, }); @@ -1761,7 +1761,7 @@ test('when isMulti is true, selectedValue populated and arrowLeft is pressed the props: { isMulti: true, items, - selectedValue: [ + value: [ {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'}, ], @@ -1795,7 +1795,7 @@ test('when hideEmptyState true then do not show "no options" div ', async (t) => select.$destroy(); }); -test('when selectedValue changes then select event should fire', async (t) => { +test('when value changes then select event should fire', async (t) => { const select = new Select({ target, props: { @@ -1818,12 +1818,12 @@ test('when selectedValue changes then select event should fire', async (t) => { select.$destroy(); }); -test('when selectedValue is cleared the clear event is fired', async (t) => { +test('when value is cleared the clear event is fired', async (t) => { const select = new Select({ target, props: { items, - selectedValue: items[0], + value: items[0], } }); @@ -1846,7 +1846,7 @@ test('when multi item is cleared the clear event is fired with removed item', as props: { isMulti: true, items, - selectedValue: [itemToRemove] + value: [itemToRemove] } }); @@ -1882,12 +1882,12 @@ test('when items in list filter or update then first item in list should highlig select.$destroy(); }); -test('when item is selected or state changes then check selectedValue[optionIdentifier] has changed before firing "select" event', async (t) => { +test('when item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { const select = new Select({ target, props: { items, - selectedValue: {value: 'cake', label: 'Cake'} + value: {value: 'cake', label: 'Cake'} } }); @@ -1897,19 +1897,19 @@ test('when item is selected or state changes then check selectedValue[optionIden item = true; }); - await handleSet(select, {selectedValue: {value: 'cake', label: 'Cake'}}); + await handleSet(select, {value: {value: 'cake', label: 'Cake'}}); t.ok(!item) select.$destroy(); }); -test('when isMulti and item is selected or state changes then check selectedValue[optionIdentifier] has changed before firing "select" event', async (t) => { +test('when isMulti and item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: [ + value: [ {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'}, ], @@ -1922,10 +1922,10 @@ test('when isMulti and item is selected or state changes then check selectedValu item = true; }); - await handleSet(select, {selectedValue: [{value: 'pizza', label: 'Pizza'},{value: 'chips', label: 'Chips'}]}); + await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'},{value: 'chips', label: 'Chips'}]}); t.ok(!item); item = false; - await handleSet(select, {selectedValue: [{value: 'pizza', label: 'Pizza'}]}); + await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'}]}); t.ok(item); select.$destroy(); @@ -1960,7 +1960,7 @@ test('when isFocused turns to false then check Select is no longer in focus', as }) }); - await handleSet(select, {selectedValue: {value: 'pizza', label: 'Pizza'}}); + await handleSet(select, {value: {value: 'pizza', label: 'Pizza'}}); await wait(0); @@ -1989,7 +1989,7 @@ test('when items and loadOptions method are both supplied then fallback to items }); select.$on('state', ({current, changed}) => { - if (changed.filterText && current.filterText === '' && !current.selectedValue) { + if (changed.filterText && current.filterText === '' && !current.value) { select.$set({ items }) @@ -2024,14 +2024,14 @@ test('when items is just an array of strings then render list', async (t) => { select.$destroy(); }); -test('when items are just strings then selectedValue should render', async (t) => { +test('when items are just strings then value should render', async (t) => { const items = ['one', 'two', 'three']; const select = new Select({ target, props: { items, - selectedValue: {value: 'one', label: 'one', index: 0} + value: {value: 'one', label: 'one', index: 0} } }); @@ -2114,7 +2114,7 @@ test('when loadOptions method is supplied but filterText is empty then do not ru await wait(500); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); t.ok(document.querySelector('.customItem_name').innerHTML === 'Juniper Wheat Beer'); - select.$set({selectedValue: undefined, filterText: ''}); + select.$set({value: undefined, filterText: ''}); await wait(0); select.$set({listOpen: true}); await wait(0); @@ -2123,13 +2123,13 @@ test('when loadOptions method is supplied but filterText is empty then do not ru select.$destroy(); }); -test('when isMulti and selectedValue has items then check each item is unique', async (t) => { +test('when isMulti and value has items then check each item is unique', async (t) => { const select = new Select({ target, props: { isMulti: true, items, - selectedValue: [ + value: [ {value: 'pizza', label: 'Pizza'}, {value: 'pizza', label: 'Pizza'}, {value: 'cake', label: 'Cake'}, @@ -2137,7 +2137,7 @@ test('when isMulti and selectedValue has items then check each item is unique', } }); - t.ok(select.selectedValue.length === 2); + t.ok(select.value.length === 2); select.$destroy(); }); @@ -2156,7 +2156,7 @@ test('when isMulti and textFilter has length then enter should select item', asy await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.selectedValue[0].value === 'pizza'); + t.ok(select.value[0].value === 'pizza'); select.$destroy(); }); @@ -2174,7 +2174,7 @@ test('when isMulti and textFilter has length and no items in list then enter sho }); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.selectedValue === undefined); + t.ok(select.value === undefined); select.$destroy(); }); @@ -2211,7 +2211,7 @@ test('When list is open, filterText applied and Enter/Tab key pressed should sel await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(select.selectedValue.value, 'A5'); + t.equal(select.value.value, 'A5'); await wait(0); t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'A5'); @@ -2239,12 +2239,12 @@ test('When inputAttributes is supplied each attribute is placed on the Select in select.$destroy(); }); -test('when items and selectedValue supplied as just strings then selectedValue should render correctly', async (t) => { +test('when items and value supplied as just strings then value should render correctly', async (t) => { const select = new Select({ target, props: { items: ['Pizza', 'Chocolate', 'Crisps'], - selectedValue: 'Pizza' + value: 'Pizza' } }); @@ -2253,13 +2253,13 @@ test('when items and selectedValue supplied as just strings then selectedValue s select.$destroy(); }); -test('when isMulti with items and selectedValue supplied as just strings then selectedValue should render correctly', async (t) => { +test('when isMulti with items and value supplied as just strings then value should render correctly', async (t) => { const select = new Select({ target, props: { isMulti: true, items: ['Pizza', 'Chocolate', 'Crisps'], - selectedValue: ['Pizza'] + value: ['Pizza'] } }); @@ -2268,7 +2268,7 @@ test('when isMulti with items and selectedValue supplied as just strings then se select.$destroy(); }); -test('when isMulti, groupBy and selectedValue are supplied then list should be filtered', async (t) => { +test('when isMulti, groupBy and value are supplied then list should be filtered', async (t) => { let _items = [ { id: 1, name: "Foo", group: "first" }, { id: 2, name: "Bar", group: "second" }, @@ -2285,7 +2285,7 @@ test('when isMulti, groupBy and selectedValue are supplied then list should be f optionIdentifier: 'id', getSelectionLabel: (item) => item.name, getOptionLabel: (item) => item.name, - selectedValue: [{ id: 2, name: "Bar", group: "second" }], + value: [{ id: 2, name: "Bar", group: "second" }], listOpen: true } }); @@ -2389,9 +2389,9 @@ test('When creator selected, selected item is set to created item', async (t) => await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - const { selectedValue } = select; - t.ok(selectedValue.value === 'abc'); - t.ok(selectedValue.label === 'abc'); + const { value } = select; + t.ok(value.value === 'abc'); + t.ok(value.label === 'abc'); select.$destroy(); }); @@ -2415,9 +2415,9 @@ test('When creator is selected, created item it added to multi selection', async await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - const { selectedValue } = select; - t.ok(selectedValue[0].value === 'abc'); - t.ok(selectedValue[0].label === 'abc'); + const { value } = select; + t.ok(value[0].value === 'abc'); + t.ok(value[0].label === 'abc'); select.$destroy(); }); @@ -2441,24 +2441,24 @@ test('When creator is selected multiple times, items are all added to multi sele await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); await wait(0); - t.ok(select.selectedValue[0].value === 'abc'); + t.ok(select.value[0].value === 'abc'); select.$set({ filterText: filterTextForItem2 }); await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); await wait(0); - t.ok(select.selectedValue[1].value === 'def'); + t.ok(select.value[1].value === 'def'); select.$destroy(); }); -test('When isMulti and an items remove icon is clicked then item should be removed from selectedValue', async (t) => { +test('When isMulti and an items remove icon is clicked then item should be removed from value', async (t) => { const select = new Select({ target, props: { items, isCreatable: true, - selectedValue: [ + value: [ {value: 'pizza', label: 'Pizza'}, {value: 'cake', label: 'Cake'}, ], @@ -2467,9 +2467,9 @@ test('When isMulti and an items remove icon is clicked then item should be remov }); await querySelectorClick('.multiSelectItem_clear'); - t.ok(select.selectedValue[0].value === 'cake') + t.ok(select.value[0].value === 'cake') await querySelectorClick('.multiSelectItem_clear'); - t.ok(select.selectedValue === undefined); + t.ok(select.value === undefined); select.$destroy(); }); @@ -2583,8 +2583,8 @@ test('When isCreatable and isMulti and optionIdentifier is supplied multiple cre window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); await wait(0); - t.ok(select.selectedValue.length === 2); - t.ok(select.selectedValue[0].tag_name); + t.ok(select.value.length === 2); + t.ok(select.value[0].tag_name); select.$destroy(); }); @@ -2618,20 +2618,20 @@ test('When isCreatable and item is created then createItem method should only ru select.$destroy(); }); -test('When items are collection and selectedValue a string then lookup item using optionIdentifier and update value to match', async (t) => { +test('When items are collection and value a string then lookup item using optionIdentifier and update value to match', async (t) => { const select = new Select({ target, props: { items, - selectedValue: 'cake' + value: 'cake' } }); await wait(0); - t.ok(select.selectedValue.value === 'cake'); - select.$set({ selectedValue: 'pizza' }); + t.ok(select.value.value === 'cake'); + select.$set({ value: 'pizza' }); await wait(0); - t.ok(select.selectedValue.value === 'pizza'); + t.ok(select.value.value === 'pizza'); select.$destroy(); }); @@ -2658,14 +2658,14 @@ test('When item is already active and is selected from list then close list', as props: { items, listOpen: true, - selectedValue: 'pizza' + value: 'pizza' } }); await wait(0); await querySelectorClick('.listContainer > .listItem > .item.active'); await wait(0); - t.ok(select.selectedValue.value === 'pizza'); + t.ok(select.value.value === 'pizza'); select.$destroy(); }); @@ -2684,12 +2684,12 @@ test('When Icon prop is supplied then render on Select', async (t) => { select.$destroy(); }); -test('When showChevron prop is true only show chevron when there is no selectedValue on Select', async (t) => { +test('When showChevron prop is true only show chevron when there is no value on Select', async (t) => { const select = new Select({ target, props: { items, - selectedValue: {value: 'chocolate', label: 'Chocolate'}, + value: {value: 'chocolate', label: 'Chocolate'}, showChevron: true } }); @@ -2699,7 +2699,7 @@ test('When showChevron prop is true only show chevron when there is no selectedV select.$destroy(); }); -test('When showChevron prop is true and no selectedValue show chevron on Select', async (t) => { +test('When showChevron prop is true and no value show chevron on Select', async (t) => { const select = new Select({ target, props: { @@ -2718,7 +2718,7 @@ test('When showIndicator prop is true always show chevron on Select', async (t) target, props: { items, - selectedValue: {value: 'chocolate', label: 'Chocolate'}, + value: {value: 'chocolate', label: 'Chocolate'}, showIndicator: true } }); @@ -2754,7 +2754,7 @@ test('Select container classes can be injected', async (t) => { target, props: { items, - selectedValue: { name: 'Item #2' }, + value: { name: 'Item #2' }, containerClasses: 'testclass', }, }); @@ -2856,12 +2856,12 @@ test('When loadOptions promise is rejected then dispatch error', async (t) => { select.$destroy(); }); -test('When items change then selectedValue should also update', async (t) => { +test('When items change then value should also update', async (t) => { const select = new Select({ target, props: { items, - selectedValue: {value: 'chips', label: 'Chips'}, + value: {value: 'chips', label: 'Chips'}, }, }); @@ -2877,7 +2877,7 @@ test('When items change then selectedValue should also update', async (t) => { await wait(0); - t.ok(select.selectedValue.label === 'Loaded Fries'); + t.ok(select.value.label === 'Loaded Fries'); t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Loaded Fries'); select.$destroy(); @@ -2889,7 +2889,7 @@ test('When items change then selectedValue should also update', async (t) => { props: { isMulti: true, items, - selectedValue: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], + value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], }, }); @@ -2905,18 +2905,18 @@ test('When items change then selectedValue should also update', async (t) => { await wait(0); - t.ok(multiSelect.selectedValue[0].label === 'Loaded Fries'); - t.ok(multiSelect.selectedValue[1].label === 'Cheese Pizza'); + t.ok(multiSelect.value[0].label === 'Loaded Fries'); + t.ok(multiSelect.value[1].label === 'Cheese Pizza'); multiSelect.$destroy(); }); -test('When items change then selectedValue should also update but only if found in items', async (t) => { +test('When items change then value should also update but only if found in items', async (t) => { const select = new Select({ target, props: { items, - selectedValue: {value: 'chips', label: 'Chips'}, + value: {value: 'chips', label: 'Chips'}, }, }); @@ -2932,7 +2932,7 @@ test('When items change then selectedValue should also update but only if found await wait(0); - t.ok(select.selectedValue.label === 'Chips'); + t.ok(select.value.label === 'Chips'); t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); select.$destroy(); @@ -2945,14 +2945,14 @@ test('When isMulti and multiFullItemClearable then clicking anywhere on the item isMulti: true, items, multiFullItemClearable: true, - selectedValue: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], + value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], }, }); await wait(0); await querySelectorClick('.multiSelectItem'); await wait(0); - t.ok(multiSelect.selectedValue[0].label === 'Pizza'); + t.ok(multiSelect.value[0].label === 'Pizza'); multiSelect.$destroy(); }); @@ -3039,7 +3039,7 @@ test('when ClearItem replace clear icon', async (t) => { props: { items, ClearIcon: TestClearIcon, - selectedValue: {value: 'chips', label: 'Chips'} + value: {value: 'chips', label: 'Chips'} } }); diff --git a/yarn.lock b/yarn.lock index 8d055b7f..bfa0e23a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,11 +36,6 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" integrity sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw== -"@rollup/plugin-html@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-html/-/plugin-html-0.2.3.tgz#bed48fc18dbde345c0ef09b0b53a165d7bd3b7cd" - integrity sha512-efx8Ud1FWaHmj3Es5parp6uRt1DPyKq9A8t1GEZoNsYB4UTQQIL8PsjxcJOlH+P3QKRsSv1rIJhiMvuG4+kfwg== - "@rollup/pluginutils@4": version "4.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.0.tgz#0dcc61c780e39257554feb7f77207dceca13c838" @@ -329,16 +324,6 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globalyzer@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" - integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== - -globrex@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.1.tgz#cfe565cfa910707d0ef98eb0b9d78c3c055ca2ef" - integrity sha512-bqKcPhb+ZtrISivpu6oLmwIyINlPlzueO/BDCdfnzUeu7SYxnHTXmWP7uQI5PnQXc5yGXOscGBEGagloA2hcSw== - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -696,13 +681,12 @@ serialize-javascript@^4.0.0: randombytes "^2.1.0" sirv@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-0.2.2.tgz#334d86074c73008fda60129b2487ae94db1fbc7b" - integrity sha512-X0UjfTc32MeK+rkhgdQK/blQ5ysC0CfLF9OH9d8x2RnpaD2D5BDLMeox79utmhxai4T+/VCahK5pDgAEnG/tNQ== + version "0.2.5" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-0.2.5.tgz#da56a42e5f60b0822456cee7bf53e217305f4c3b" + integrity sha512-q7F1VElkj/WPrXwWsdHK9gqi2rd94oaMQc3VtN8N1TNHrKxlsd7hGsPFiOIodRxre8eHCV1XK1iqC1BDaZ+IKA== dependencies: "@polka/url" "^0.5.0" mime "^2.3.1" - tiny-glob "^0.2.0" source-map-support@~0.5.19: version "0.5.19" @@ -842,14 +826,6 @@ through@2: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tiny-glob@^0.2.0: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda" - integrity sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw== - dependencies: - globalyzer "^0.1.0" - globrex "^0.1.1" - traverse-chain@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" From 5a80e840cf01ad4fa793190689dbd5055d983630 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 23 Mar 2021 08:01:50 +1100 Subject: [PATCH 164/635] fixing up tests --- .gitignore | 3 +- rollup.config.js | 2 +- src/List.svelte | 2 +- src/Select.svelte | 71 +- test/public/bundle.css | 26 - test/public/index.js | 7231 ++++++++++++++++++++-------------------- test/src/index.js | 2 +- 7 files changed, 3636 insertions(+), 3701 deletions(-) delete mode 100644 test/public/bundle.css diff --git a/.gitignore b/.gitignore index 78a34c78..2d895478 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ node_modules .idea .nova /dist/ -/test/build \ No newline at end of file +# /test/public/index.js +# /test/public/bundle.js \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js index 2cf572ae..682735dd 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -31,7 +31,7 @@ export default [ }, plugins: [ svelte({ - emitCss: false, + emitCss: true, compilerOptions: { accessors: true, dev: true, diff --git a/src/List.svelte b/src/List.svelte index 66816818..9c2d5e63 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -5,7 +5,7 @@ const dispatch = createEventDispatcher(); export let container = undefined; - export let VirtualList; + export let VirtualList = null; export let Item = ItemComponent; export let isVirtualList = false; export let items = []; diff --git a/src/Select.svelte b/src/Select.svelte index bf962e48..bf8d18b9 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -7,11 +7,10 @@ tick, } from 'svelte'; - import List from './List.svelte'; import ItemComponent from './Item.svelte'; import SelectionComponent from './Selection.svelte'; import MultiSelectionComponent from './MultiSelection.svelte'; - + import isOutOfViewport from './utils/isOutOfViewport'; import debounce from './utils/debounce'; import DefaultClearIcon from './ClearIcon.svelte'; @@ -90,7 +89,6 @@ let target; let activeValue; let originalItemsClone; - let VirtualList; let prev_value; let prev_filterText; let prev_isFocused; @@ -133,11 +131,7 @@ [optionIdentifier]: value, label: value, }; - } else if ( - isMulti && - Array.isArray(value) && - value.length > 0 - ) { + } else if (isMulti && Array.isArray(value) && value.length > 0) { value = value.map((item) => typeof item === 'string' ? { value: item, label: item } : item ); @@ -234,10 +228,7 @@ function dispatchSelectedItem() { if (isMulti) { - if ( - JSON.stringify(value) !== - JSON.stringify(prev_value) - ) { + if (JSON.stringify(value) !== JSON.stringify(prev_value)) { if (checkvalueForDuplicates()) { dispatch('select', value); } @@ -289,10 +280,23 @@ } } - let VirtualListComponent; - async function setupVirtualList() { - VirtualListComponent = await import('./VirtualList.svelte'); - VirtualList = VirtualListComponent.default; + export let VirtualList = null; + export let List = null; + + async function importInternalComponent(componentName) { + let file; + + switch (componentName) { + case 'VirtualList': + file = await import(`./VirtualList.svelte`); + break; + + case 'List': + file = await import(`./List.svelte`); + break; + } + + return file.default; } $: { @@ -383,8 +387,7 @@ } ); } else if ( - value[optionIdentifier] === - itemToCreate[optionIdentifier] + value[optionIdentifier] === itemToCreate[optionIdentifier] ) { existingSelectionWithFilterValue = value; } @@ -462,9 +465,7 @@ return; if (Array.isArray(value)) { - value = value.map( - (selection) => findItem(selection) || selection - ); + value = value.map((selection) => findItem(selection) || selection); } else { value = findItem() || value; } @@ -479,8 +480,7 @@ function handleMultiItemClear(event) { const { detail } = event; - const itemToRemove = - value[detail ? detail.i : value.length - 1]; + const itemToRemove = value[detail ? detail.i : value.length - 1]; if (value.length === 1) { value = undefined; @@ -545,11 +545,7 @@ ? activeValue : value.length - 1 ); - if ( - activeValue === 0 || - activeValue === undefined - ) - break; + if (activeValue === 0 || activeValue === undefined) break; activeValue = value.length > activeValue ? activeValue - 1 @@ -562,10 +558,7 @@ if (activeValue === undefined) { activeValue = value.length - 1; - } else if ( - value.length > activeValue && - activeValue !== 0 - ) { + } else if (value.length > activeValue && activeValue !== 0) { activeValue -= 1; } break; @@ -635,7 +628,9 @@ await tick(); if (target && list) return; - if (isVirtualList && !VirtualListComponent) await setupVirtualList(); + if (isVirtualList && !VirtualList) { + VirtualList = await importInternalComponent('VirtualList'); + } const data = { Item, @@ -684,9 +679,7 @@ if (!item.isGroupHeader || item.isSelectable) { if (isMulti) { - value = value - ? value.concat([item]) - : [item]; + value = value ? value.concat([item]) : [item]; } else { value = item; } @@ -726,8 +719,10 @@ getPosition(); } - onMount(() => { - if (isFocused) input.focus(); + onMount(async () => { + if (!List) List = await importInternalComponent('List'); + + if (isFocused && input) input.focus(); if (listOpen) loadList(); if (items && items.length > 0) { diff --git a/test/public/bundle.css b/test/public/bundle.css deleted file mode 100644 index 4f278fed..00000000 --- a/test/public/bundle.css +++ /dev/null @@ -1,26 +0,0 @@ -html { - width: 100%; - height: 100%; - padding: 0; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; -} - -body { - font-size: 14px; - width: 100%; - height: 100%; - min-height: 100%; - min-width: 100%; - padding: 20px; - margin: 0; -} - -* { - box-sizing: border-box; - -webkit-font-smoothing: antialiased; -} - -.container { - width: 430px; -} diff --git a/test/public/index.js b/test/public/index.js index 17c13bf5..a7b49fc3 100644 --- a/test/public/index.js +++ b/test/public/index.js @@ -3075,13 +3075,6 @@ class SvelteComponentDev extends SvelteComponent { const file$d = "test/src/CustomItem.svelte"; -function add_css$8() { - var style = element("style"); - style.id = "svelte-1vo37vn-style"; - style.textContent = ".customItem.svelte-1vo37vn{display:flex;align-items:center;cursor:default;height:40px;line-height:40px;padding:0 16px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.customItem.svelte-1vo37vn:active{background:#b9daff}.customItem.active.svelte-1vo37vn{background:#007aff;color:#fff}.customItem.first.svelte-1vo37vn{border-radius:4px 4px 0 0}.customItem.hover.svelte-1vo37vn:not(.active){background:#e7f2ff}img.svelte-1vo37vn{width:5px;padding:5px 0;margin:0 10px}.customItem_title.svelte-1vo37vn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.customItem_name.svelte-1vo37vn{display:inline-block;font-weight:700;margin-right:10px}.customItem_tagline.svelte-1vo37vn{display:inline-block}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VzdG9tSXRlbS5zdmVsdGUiLCJzb3VyY2VzIjpbIkN1c3RvbUl0ZW0uc3ZlbHRlIl0sInNvdXJjZXNDb250ZW50IjpbIjxzY3JpcHQ+XG4gIGV4cG9ydCBsZXQgaXNBY3RpdmUgPSBmYWxzZTtcbiAgZXhwb3J0IGxldCBpc0ZpcnN0ID0gZmFsc2U7XG4gIGV4cG9ydCBsZXQgaXNIb3ZlciA9IGZhbHNlO1xuICBleHBvcnQgbGV0IGl0ZW0gPSB1bmRlZmluZWQ7XG5cbiAgbGV0IGl0ZW1DbGFzc2VzID0gJyc7XG5cbiAgJDoge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbXTtcbiAgICBpZiAoaXNBY3RpdmUpIHsgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnKTsgfVxuICAgIGlmIChpc0ZpcnN0KSB7IGNsYXNzZXMucHVzaCgnZmlyc3QnKTsgfVxuICAgIGlmIChpc0hvdmVyKSB7IGNsYXNzZXMucHVzaCgnaG92ZXInKTsgfVxuICAgIGl0ZW1DbGFzc2VzID0gY2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuPC9zY3JpcHQ+XG5cbjxkaXYgY2xhc3M9XCJjdXN0b21JdGVtIHtpdGVtQ2xhc3Nlc31cIj5cbiAgPGltZyBzcmM9XCJ7aXRlbS5pbWFnZV91cmx9XCIgYWx0PVwie2l0ZW0ubmFtZX1cIj5cbiAgPGRpdiBjbGFzcz1cImN1c3RvbUl0ZW1fdGl0bGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tSXRlbV9uYW1lXCI+e2l0ZW0ubmFtZX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tSXRlbV90YWdsaW5lXCI+e2l0ZW0udGFnbGluZX08L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPHN0eWxlPlxuICAuY3VzdG9tSXRlbSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICBoZWlnaHQ6IDQwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gICAgcGFkZGluZzogMCAxNnB4O1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuXG4gIC5jdXN0b21JdGVtOmFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZDogI2I5ZGFmZjtcbiAgfVxuXG4gIC5jdXN0b21JdGVtLmFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZDogIzAwN2FmZjtcbiAgICBjb2xvcjogI2ZmZjtcbiAgfVxuXG4gIC5jdXN0b21JdGVtLmZpcnN0IHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDtcbiAgfVxuXG4gIC5jdXN0b21JdGVtLmhvdmVyOm5vdCguYWN0aXZlKSB7XG4gICAgYmFja2dyb3VuZDogI2U3ZjJmZjtcbiAgfVxuXG4gIGltZyB7XG4gICAgd2lkdGg6IDVweDtcbiAgICBwYWRkaW5nOiA1cHggMDtcbiAgICBtYXJnaW46IDAgMTBweDtcbiAgfVxuXG4gIC5jdXN0b21JdGVtX3RpdGxlIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cblxuICAuY3VzdG9tSXRlbV9uYW1lIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gIH1cblxuICAuY3VzdG9tSXRlbV90YWdsaW5lIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbjwvc3R5bGU+XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkJFLFdBQVcsZUFBQyxDQUFDLEFBQ1gsT0FBTyxDQUFFLElBQUksQ0FDYixXQUFXLENBQUUsTUFBTSxDQUNuQixNQUFNLENBQUUsT0FBTyxDQUNmLE1BQU0sQ0FBRSxJQUFJLENBQ1osV0FBVyxDQUFFLElBQUksQ0FDakIsT0FBTyxDQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2YsYUFBYSxDQUFFLFFBQVEsQ0FDdkIsUUFBUSxDQUFFLE1BQU0sQ0FDaEIsV0FBVyxDQUFFLE1BQU0sQUFDckIsQ0FBQyxBQUVELDBCQUFXLE9BQU8sQUFBQyxDQUFDLEFBQ2xCLFVBQVUsQ0FBRSxPQUFPLEFBQ3JCLENBQUMsQUFFRCxXQUFXLE9BQU8sZUFBQyxDQUFDLEFBQ2xCLFVBQVUsQ0FBRSxPQUFPLENBQ25CLEtBQUssQ0FBRSxJQUFJLEFBQ2IsQ0FBQyxBQUVELFdBQVcsTUFBTSxlQUFDLENBQUMsQUFDakIsYUFBYSxDQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFDNUIsQ0FBQyxBQUVELFdBQVcscUJBQU0sS0FBSyxPQUFPLENBQUMsQUFBQyxDQUFDLEFBQzlCLFVBQVUsQ0FBRSxPQUFPLEFBQ3JCLENBQUMsQUFFRCxHQUFHLGVBQUMsQ0FBQyxBQUNILEtBQUssQ0FBRSxHQUFHLENBQ1YsT0FBTyxDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ2QsTUFBTSxDQUFFLENBQUMsQ0FBQyxJQUFJLEFBQ2hCLENBQUMsQUFFRCxpQkFBaUIsZUFBQyxDQUFDLEFBQ2pCLFFBQVEsQ0FBRSxNQUFNLENBQ2hCLGFBQWEsQ0FBRSxRQUFRLENBQ3ZCLFdBQVcsQ0FBRSxNQUFNLEFBQ3JCLENBQUMsQUFFRCxnQkFBZ0IsZUFBQyxDQUFDLEFBQ2hCLE9BQU8sQ0FBRSxZQUFZLENBQ3JCLFdBQVcsQ0FBRSxHQUFHLENBQ2hCLFlBQVksQ0FBRSxJQUFJLEFBQ3BCLENBQUMsQUFFRCxtQkFBbUIsZUFBQyxDQUFDLEFBQ25CLE9BQU8sQ0FBRSxZQUFZLEFBQ3ZCLENBQUMifQ== */"; - append_dev(document.head, style); -} - function create_fragment$d(ctx) { let div3; let img; @@ -3239,7 +3232,6 @@ function instance$d($$self, $$props, $$invalidate) { class CustomItem extends SvelteComponentDev { constructor(options) { super(options); - if (!document.getElementById("svelte-1vo37vn-style")) add_css$8(); init(this, options, instance$d, create_fragment$d, safe_not_equal, { isActive: 2, @@ -3297,13 +3289,6 @@ class CustomItem extends SvelteComponentDev { const file$c = "src/Item.svelte"; -function add_css$7() { - var style = element("style"); - style.id = "svelte-1imzpmp-style"; - style.textContent = ".item.svelte-1imzpmp{cursor:default;height:var(--height, 42px);line-height:var(--height, 42px);padding:var(--itemPadding, 0 20px);color:var(--itemColor, inherit);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.groupHeader.svelte-1imzpmp{text-transform:var(--groupTitleTextTransform, uppercase)}.groupItem.svelte-1imzpmp{padding-left:var(--groupItemPaddingLeft, 40px)}.item.svelte-1imzpmp:active{background:var(--itemActiveBackground, #b9daff)}.item.active.svelte-1imzpmp{background:var(--itemIsActiveBG, #007aff);color:var(--itemIsActiveColor, #fff)}.item.first.svelte-1imzpmp{border-radius:var(--itemFirstBorderRadius, 4px 4px 0 0)}.item.hover.svelte-1imzpmp:not(.active){background:var(--itemHoverBG, #e7f2ff)}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXRlbS5zdmVsdGUiLCJzb3VyY2VzIjpbIkl0ZW0uc3ZlbHRlIl0sInNvdXJjZXNDb250ZW50IjpbIjxzY3JpcHQ+XG4gICAgZXhwb3J0IGxldCBpc0FjdGl2ZSA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgaXNGaXJzdCA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgaXNIb3ZlciA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgZ2V0T3B0aW9uTGFiZWwgPSB1bmRlZmluZWQ7XG4gICAgZXhwb3J0IGxldCBpdGVtID0gdW5kZWZpbmVkO1xuICAgIGV4cG9ydCBsZXQgZmlsdGVyVGV4dCA9ICcnO1xuXG4gICAgbGV0IGl0ZW1DbGFzc2VzID0gJyc7XG5cbiAgICAkOiB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBbXTtcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2ZpcnN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSG92ZXIpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaG92ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5pc0dyb3VwSGVhZGVyKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2dyb3VwSGVhZGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0uaXNHcm91cEl0ZW0pIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnZ3JvdXBJdGVtJyk7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbUNsYXNzZXMgPSBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9XG48L3NjcmlwdD5cblxuPHN0eWxlPlxuICAgIC5pdGVtIHtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCwgNDJweCk7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1oZWlnaHQsIDQycHgpO1xuICAgICAgICBwYWRkaW5nOiB2YXIoLS1pdGVtUGFkZGluZywgMCAyMHB4KTtcbiAgICAgICAgY29sb3I6IHZhcigtLWl0ZW1Db2xvciwgaW5oZXJpdCk7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cblxuICAgIC5ncm91cEhlYWRlciB7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB2YXIoLS1ncm91cFRpdGxlVGV4dFRyYW5zZm9ybSwgdXBwZXJjYXNlKTtcbiAgICB9XG5cbiAgICAuZ3JvdXBJdGVtIHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1ncm91cEl0ZW1QYWRkaW5nTGVmdCwgNDBweCk7XG4gICAgfVxuXG4gICAgLml0ZW06YWN0aXZlIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taXRlbUFjdGl2ZUJhY2tncm91bmQsICNiOWRhZmYpO1xuICAgIH1cblxuICAgIC5pdGVtLmFjdGl2ZSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWl0ZW1Jc0FjdGl2ZUJHLCAjMDA3YWZmKTtcbiAgICAgICAgY29sb3I6IHZhcigtLWl0ZW1Jc0FjdGl2ZUNvbG9yLCAjZmZmKTtcbiAgICB9XG5cbiAgICAuaXRlbS5maXJzdCB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWl0ZW1GaXJzdEJvcmRlclJhZGl1cywgNHB4IDRweCAwIDApO1xuICAgIH1cblxuICAgIC5pdGVtLmhvdmVyOm5vdCguYWN0aXZlKSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWl0ZW1Ib3ZlckJHLCAjZTdmMmZmKTtcbiAgICB9XG48L3N0eWxlPlxuXG48ZGl2IGNsYXNzPVwiaXRlbSB7aXRlbUNsYXNzZXN9XCI+XG4gICAge0BodG1sIGdldE9wdGlvbkxhYmVsKGl0ZW0sIGZpbHRlclRleHQpfVxuPC9kaXY+XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0NJLEtBQUssZUFBQyxDQUFDLEFBQ0gsTUFBTSxDQUFFLE9BQU8sQ0FDZixNQUFNLENBQUUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQzNCLFdBQVcsQ0FBRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDaEMsT0FBTyxDQUFFLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUNuQyxLQUFLLENBQUUsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQ2hDLGFBQWEsQ0FBRSxRQUFRLENBQ3ZCLFFBQVEsQ0FBRSxNQUFNLENBQ2hCLFdBQVcsQ0FBRSxNQUFNLEFBQ3ZCLENBQUMsQUFFRCxZQUFZLGVBQUMsQ0FBQyxBQUNWLGNBQWMsQ0FBRSxJQUFJLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxBQUM3RCxDQUFDLEFBRUQsVUFBVSxlQUFDLENBQUMsQUFDUixZQUFZLENBQUUsSUFBSSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQUFDbkQsQ0FBQyxBQUVELG9CQUFLLE9BQU8sQUFBQyxDQUFDLEFBQ1YsVUFBVSxDQUFFLElBQUksc0JBQXNCLENBQUMsUUFBUSxDQUFDLEFBQ3BELENBQUMsQUFFRCxLQUFLLE9BQU8sZUFBQyxDQUFDLEFBQ1YsVUFBVSxDQUFFLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQzFDLEtBQUssQ0FBRSxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxBQUN6QyxDQUFDLEFBRUQsS0FBSyxNQUFNLGVBQUMsQ0FBQyxBQUNULGFBQWEsQ0FBRSxJQUFJLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxBQUM1RCxDQUFDLEFBRUQsS0FBSyxxQkFBTSxLQUFLLE9BQU8sQ0FBQyxBQUFDLENBQUMsQUFDdEIsVUFBVSxDQUFFLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxBQUMzQyxDQUFDIn0= */"; - append_dev(document.head, style); -} - function create_fragment$c(ctx) { let div; let raw_value = /*getOptionLabel*/ ctx[0](/*item*/ ctx[1], /*filterText*/ ctx[2]) + ""; @@ -3431,7 +3416,6 @@ function instance$c($$self, $$props, $$invalidate) { class Item extends SvelteComponentDev { constructor(options) { super(options); - if (!document.getElementById("svelte-1imzpmp-style")) add_css$7(); init(this, options, instance$c, create_fragment$c, safe_not_equal, { isActive: 4, @@ -3505,256 +3489,262 @@ class Item extends SvelteComponentDev { } } -/* src/List.svelte generated by Svelte v3.35.0 */ -const file$b = "src/List.svelte"; - -function add_css$6() { - var style = element("style"); - style.id = "svelte-1wmovev-style"; - style.textContent = ".listContainer.svelte-1wmovev{box-shadow:var(--listShadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24));border-radius:var(--listBorderRadius, 4px);max-height:var(--listMaxHeight, 250px);overflow-y:auto;background:var(--listBackground, #fff)}.virtualList.svelte-1wmovev{height:var(--virtualListHeight, 200px)}.listGroupTitle.svelte-1wmovev{color:var(--groupTitleColor, #8f8f8f);cursor:default;font-size:var(--groupTitleFontSize, 12px);font-weight:var(--groupTitleFontWeight, 600);height:var(--height, 42px);line-height:var(--height, 42px);padding:var(--groupTitlePadding, 0 20px);text-overflow:ellipsis;overflow-x:hidden;white-space:nowrap;text-transform:var(--groupTitleTextTransform, uppercase)}.empty.svelte-1wmovev{text-align:var(--listEmptyTextAlign, center);padding:var(--listEmptyPadding, 20px 0);color:var(--listEmptyColor, #78848f)}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGlzdC5zdmVsdGUiLCJzb3VyY2VzIjpbIkxpc3Quc3ZlbHRlIl0sInNvdXJjZXNDb250ZW50IjpbIjxzY3JpcHQ+XG4gICAgaW1wb3J0IHsgYmVmb3JlVXBkYXRlLCBjcmVhdGVFdmVudERpc3BhdGNoZXIsIG9uTW91bnQsIHRpY2sgfSBmcm9tICdzdmVsdGUnO1xuICAgIGltcG9ydCBJdGVtQ29tcG9uZW50IGZyb20gJy4vSXRlbS5zdmVsdGUnO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBjcmVhdGVFdmVudERpc3BhdGNoZXIoKTtcblxuICAgIGV4cG9ydCBsZXQgY29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgIGV4cG9ydCBsZXQgVmlydHVhbExpc3Q7XG4gICAgZXhwb3J0IGxldCBJdGVtID0gSXRlbUNvbXBvbmVudDtcbiAgICBleHBvcnQgbGV0IGlzVmlydHVhbExpc3QgPSBmYWxzZTtcbiAgICBleHBvcnQgbGV0IGl0ZW1zID0gW107XG4gICAgZXhwb3J0IGxldCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb24sIGZpbHRlclRleHQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbilcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uaXNDcmVhdG9yID8gYENyZWF0ZSBcXFwiJHtmaWx0ZXJUZXh0fVxcXCJgIDogb3B0aW9uLmxhYmVsO1xuICAgIH07XG4gICAgZXhwb3J0IGxldCBnZXRHcm91cEhlYWRlckxhYmVsID0gKG9wdGlvbikgPT4ge1xuICAgICAgICByZXR1cm4gb3B0aW9uLmxhYmVsO1xuICAgIH07XG4gICAgZXhwb3J0IGxldCBpdGVtSGVpZ2h0ID0gNDA7XG4gICAgZXhwb3J0IGxldCBob3Zlckl0ZW1JbmRleCA9IDA7XG4gICAgZXhwb3J0IGxldCB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBleHBvcnQgbGV0IG9wdGlvbklkZW50aWZpZXIgPSAndmFsdWUnO1xuICAgIGV4cG9ydCBsZXQgaGlkZUVtcHR5U3RhdGUgPSBmYWxzZTtcbiAgICBleHBvcnQgbGV0IG5vT3B0aW9uc01lc3NhZ2UgPSAnTm8gb3B0aW9ucyc7XG4gICAgZXhwb3J0IGxldCBpc011bHRpID0gZmFsc2U7XG4gICAgZXhwb3J0IGxldCBhY3RpdmVJdGVtSW5kZXggPSAwO1xuICAgIGV4cG9ydCBsZXQgZmlsdGVyVGV4dCA9ICcnO1xuXG4gICAgbGV0IGlzU2Nyb2xsaW5nVGltZXIgPSAwO1xuICAgIGxldCBpc1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIGxldCBwcmV2X2l0ZW1zO1xuXG4gICAgb25Nb3VudCgoKSA9PiB7XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwICYmICFpc011bHRpICYmIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBfaG92ZXJJdGVtSW5kZXggPSBpdGVtcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1bb3B0aW9uSWRlbnRpZmllcl0gPT09IHZhbHVlW29wdGlvbklkZW50aWZpZXJdXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoX2hvdmVySXRlbUluZGV4KSB7XG4gICAgICAgICAgICAgICAgaG92ZXJJdGVtSW5kZXggPSBfaG92ZXJJdGVtSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY3JvbGxUb0FjdGl2ZUl0ZW0oJ2FjdGl2ZScpO1xuXG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgJ3Njcm9sbCcsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGlzU2Nyb2xsaW5nVGltZXIpO1xuXG4gICAgICAgICAgICAgICAgaXNTY3JvbGxpbmdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpc1Njcm9sbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGJlZm9yZVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGlmIChpdGVtcyAhPT0gcHJldl9pdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBob3Zlckl0ZW1JbmRleCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2X2l0ZW1zID0gaXRlbXM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTZWxlY3QoaXRlbSkge1xuICAgICAgICBpZiAoaXRlbS5pc0NyZWF0b3IpIHJldHVybjtcbiAgICAgICAgZGlzcGF0Y2goJ2l0ZW1TZWxlY3RlZCcsIGl0ZW0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUhvdmVyKGkpIHtcbiAgICAgICAgaWYgKGlzU2Nyb2xsaW5nKSByZXR1cm47XG4gICAgICAgIGhvdmVySXRlbUluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVDbGljayhhcmdzKSB7XG4gICAgICAgIGNvbnN0IHsgaXRlbSwgaSwgZXZlbnQgfSA9IGFyZ3M7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAhaXNNdWx0aSAmJlxuICAgICAgICAgICAgdmFsdWVbb3B0aW9uSWRlbnRpZmllcl0gPT09IGl0ZW1bb3B0aW9uSWRlbnRpZmllcl1cbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGNsb3NlTGlzdCgpO1xuXG4gICAgICAgIGlmIChpdGVtLmlzQ3JlYXRvcikge1xuICAgICAgICAgICAgZGlzcGF0Y2goJ2l0ZW1DcmVhdGVkJywgZmlsdGVyVGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXggPSBpO1xuICAgICAgICAgICAgaG92ZXJJdGVtSW5kZXggPSBpO1xuICAgICAgICAgICAgaGFuZGxlU2VsZWN0KGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvc2VMaXN0KCkge1xuICAgICAgICBkaXNwYXRjaCgnY2xvc2VMaXN0Jyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlSG92ZXJJdGVtKGluY3JlbWVudCkge1xuICAgICAgICBpZiAoaXNWaXJ0dWFsTGlzdCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBpc05vblNlbGVjdGFibGVJdGVtID0gdHJ1ZTtcblxuICAgICAgICB3aGlsZSAoaXNOb25TZWxlY3RhYmxlSXRlbSkge1xuICAgICAgICAgICAgaWYgKGluY3JlbWVudCA+IDAgJiYgaG92ZXJJdGVtSW5kZXggPT09IGl0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBob3Zlckl0ZW1JbmRleCA9IDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluY3JlbWVudCA8IDAgJiYgaG92ZXJJdGVtSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICBob3Zlckl0ZW1JbmRleCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhvdmVySXRlbUluZGV4ID0gaG92ZXJJdGVtSW5kZXggKyBpbmNyZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlzTm9uU2VsZWN0YWJsZUl0ZW0gPVxuICAgICAgICAgICAgICAgIGl0ZW1zW2hvdmVySXRlbUluZGV4XS5pc0dyb3VwSGVhZGVyICYmXG4gICAgICAgICAgICAgICAgIWl0ZW1zW2hvdmVySXRlbUluZGV4XS5pc1NlbGVjdGFibGU7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aWNrKCk7XG5cbiAgICAgICAgc2Nyb2xsVG9BY3RpdmVJdGVtKCdob3ZlcicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpdGVtcy5sZW5ndGggJiYgdXBkYXRlSG92ZXJJdGVtKDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGl0ZW1zLmxlbmd0aCAmJiB1cGRhdGVIb3Zlckl0ZW0oLTEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSBicmVhaztcbiAgICAgICAgICAgICAgICBjb25zdCBob3Zlckl0ZW0gPSBpdGVtc1tob3Zlckl0ZW1JbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAhaXNNdWx0aSAmJlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvcHRpb25JZGVudGlmaWVyXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVySXRlbVtvcHRpb25JZGVudGlmaWVyXVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjbG9zZUxpc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhvdmVySXRlbS5pc0NyZWF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goJ2l0ZW1DcmVhdGVkJywgZmlsdGVyVGV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4ID0gaG92ZXJJdGVtSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdChpdGVtc1tob3Zlckl0ZW1JbmRleF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbb3B0aW9uSWRlbnRpZmllcl0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tob3Zlckl0ZW1JbmRleF1bb3B0aW9uSWRlbnRpZmllcl1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9zZUxpc3QoKTtcbiAgICAgICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXggPSBob3Zlckl0ZW1JbmRleDtcbiAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3QoaXRlbXNbaG92ZXJJdGVtSW5kZXhdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvQWN0aXZlSXRlbShjbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbExpc3QgfHwgIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvZmZzZXRCb3VuZGluZztcbiAgICAgICAgY29uc3QgZm9jdXNlZEVsZW1Cb3VuZGluZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYC5saXN0SXRlbSAuJHtjbGFzc05hbWV9YFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChmb2N1c2VkRWxlbUJvdW5kaW5nKSB7XG4gICAgICAgICAgICBvZmZzZXRCb3VuZGluZyA9XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtXG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1Cb3VuZGluZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wIC09IG9mZnNldEJvdW5kaW5nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSXRlbUFjdGl2ZShpdGVtLCB2YWx1ZSwgb3B0aW9uSWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgIHZhbHVlW29wdGlvbklkZW50aWZpZXJdID09PSBpdGVtW29wdGlvbklkZW50aWZpZXJdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJdGVtRmlyc3QoaXRlbUluZGV4KSB7XG4gICAgICAgIHJldHVybiBpdGVtSW5kZXggPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJdGVtSG92ZXIoaG92ZXJJdGVtSW5kZXgsIGl0ZW0sIGl0ZW1JbmRleCwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGhvdmVySXRlbUluZGV4ID09PSBpdGVtSW5kZXggfHwgaXRlbXMubGVuZ3RoID09PSAxO1xuICAgIH1cbjwvc2NyaXB0PlxuXG48c3R5bGU+XG4gICAgLmxpc3RDb250YWluZXIge1xuICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1saXN0U2hhZG93LCAwIDJweCAzcHggMCByZ2JhKDQ0LCA2MiwgODAsIDAuMjQpKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbGlzdEJvcmRlclJhZGl1cywgNHB4KTtcbiAgICAgICAgbWF4LWhlaWdodDogdmFyKC0tbGlzdE1heEhlaWdodCwgMjUwcHgpO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1saXN0QmFja2dyb3VuZCwgI2ZmZik7XG4gICAgfVxuXG4gICAgLnZpcnR1YWxMaXN0IHtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS12aXJ0dWFsTGlzdEhlaWdodCwgMjAwcHgpO1xuICAgIH1cblxuICAgIC5saXN0R3JvdXBUaXRsZSB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1ncm91cFRpdGxlQ29sb3IsICM4ZjhmOGYpO1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tZ3JvdXBUaXRsZUZvbnRTaXplLCAxMnB4KTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IHZhcigtLWdyb3VwVGl0bGVGb250V2VpZ2h0LCA2MDApO1xuICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCwgNDJweCk7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1oZWlnaHQsIDQycHgpO1xuICAgICAgICBwYWRkaW5nOiB2YXIoLS1ncm91cFRpdGxlUGFkZGluZywgMCAyMHB4KTtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHZhcigtLWdyb3VwVGl0bGVUZXh0VHJhbnNmb3JtLCB1cHBlcmNhc2UpO1xuICAgIH1cblxuICAgIC5lbXB0eSB7XG4gICAgICAgIHRleHQtYWxpZ246IHZhcigtLWxpc3RFbXB0eVRleHRBbGlnbiwgY2VudGVyKTtcbiAgICAgICAgcGFkZGluZzogdmFyKC0tbGlzdEVtcHR5UGFkZGluZywgMjBweCAwKTtcbiAgICAgICAgY29sb3I6IHZhcigtLWxpc3RFbXB0eUNvbG9yLCAjNzg4NDhmKTtcbiAgICB9XG48L3N0eWxlPlxuXG48c3ZlbHRlOndpbmRvdyBvbjprZXlkb3duPXtoYW5kbGVLZXlEb3dufSAvPlxuXG57I2lmIGlzVmlydHVhbExpc3R9XG4gICAgPGRpdiBjbGFzcz1cImxpc3RDb250YWluZXIgdmlydHVhbExpc3RcIiBiaW5kOnRoaXM9e2NvbnRhaW5lcn0+XG4gICAgICAgIDxzdmVsdGU6Y29tcG9uZW50XG4gICAgICAgICAgICB0aGlzPXtWaXJ0dWFsTGlzdH1cbiAgICAgICAgICAgIHtpdGVtc31cbiAgICAgICAgICAgIHtpdGVtSGVpZ2h0fVxuICAgICAgICAgICAgbGV0Oml0ZW1cbiAgICAgICAgICAgIGxldDppXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBvbjptb3VzZW92ZXI9eygpID0+IGhhbmRsZUhvdmVyKGkpfVxuICAgICAgICAgICAgICAgIG9uOmNsaWNrPXsoZXZlbnQpID0+IGhhbmRsZUNsaWNrKHsgaXRlbSwgaSwgZXZlbnQgfSl9XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0SXRlbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHN2ZWx0ZTpjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcz17SXRlbX1cbiAgICAgICAgICAgICAgICAgICAge2l0ZW19XG4gICAgICAgICAgICAgICAgICAgIHtmaWx0ZXJUZXh0fVxuICAgICAgICAgICAgICAgICAgICB7Z2V0T3B0aW9uTGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIGlzRmlyc3Q9e2lzSXRlbUZpcnN0KGkpfVxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17aXNJdGVtQWN0aXZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uSWRlbnRpZmllclxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBpc0hvdmVyPXtpc0l0ZW1Ib3Zlcihob3Zlckl0ZW1JbmRleCwgaXRlbSwgaSwgaXRlbXMpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zdmVsdGU6Y29tcG9uZW50PlxuICAgIDwvZGl2Plxuey9pZn1cblxueyNpZiAhaXNWaXJ0dWFsTGlzdH1cbiAgICA8ZGl2IGNsYXNzPVwibGlzdENvbnRhaW5lclwiIGJpbmQ6dGhpcz17Y29udGFpbmVyfT5cbiAgICAgICAgeyNlYWNoIGl0ZW1zIGFzIGl0ZW0sIGl9XG4gICAgICAgICAgICB7I2lmIGl0ZW0uaXNHcm91cEhlYWRlciAmJiAhaXRlbS5pc1NlbGVjdGFibGV9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RHcm91cFRpdGxlXCI+e2dldEdyb3VwSGVhZGVyTGFiZWwoaXRlbSl9PC9kaXY+XG4gICAgICAgICAgICB7OmVsc2V9XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBvbjptb3VzZW92ZXI9eygpID0+IGhhbmRsZUhvdmVyKGkpfVxuICAgICAgICAgICAgICAgICAgICBvbjpjbGljaz17KGV2ZW50KSA9PiBoYW5kbGVDbGljayh7IGl0ZW0sIGksIGV2ZW50IH0pfVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3RJdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzdmVsdGU6Y29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzPXtJdGVtfVxuICAgICAgICAgICAgICAgICAgICAgICAge2l0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZmlsdGVyVGV4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtnZXRPcHRpb25MYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3Q9e2lzSXRlbUZpcnN0KGkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU9e2lzSXRlbUFjdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbklkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0hvdmVyPXtpc0l0ZW1Ib3Zlcihob3Zlckl0ZW1JbmRleCwgaXRlbSwgaSwgaXRlbXMpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgey9pZn1cbiAgICAgICAgezplbHNlfVxuICAgICAgICAgICAgeyNpZiAhaGlkZUVtcHR5U3RhdGV9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5XCI+e25vT3B0aW9uc01lc3NhZ2V9PC9kaXY+XG4gICAgICAgICAgICB7L2lmfVxuICAgICAgICB7L2VhY2h9XG4gICAgPC9kaXY+XG57L2lmfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTZNSSxjQUFjLGVBQUMsQ0FBQyxBQUNaLFVBQVUsQ0FBRSxJQUFJLFlBQVksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUNqRSxhQUFhLENBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FDM0MsVUFBVSxDQUFFLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUN2QyxVQUFVLENBQUUsSUFBSSxDQUNoQixVQUFVLENBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQUFDM0MsQ0FBQyxBQUVELFlBQVksZUFBQyxDQUFDLEFBQ1YsTUFBTSxDQUFFLElBQUksbUJBQW1CLENBQUMsTUFBTSxDQUFDLEFBQzNDLENBQUMsQUFFRCxlQUFlLGVBQUMsQ0FBQyxBQUNiLEtBQUssQ0FBRSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUN0QyxNQUFNLENBQUUsT0FBTyxDQUNmLFNBQVMsQ0FBRSxJQUFJLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUMxQyxXQUFXLENBQUUsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FDN0MsTUFBTSxDQUFFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUMzQixXQUFXLENBQUUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ2hDLE9BQU8sQ0FBRSxJQUFJLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUN6QyxhQUFhLENBQUUsUUFBUSxDQUN2QixVQUFVLENBQUUsTUFBTSxDQUNsQixXQUFXLENBQUUsTUFBTSxDQUNuQixjQUFjLENBQUUsSUFBSSx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQUFDN0QsQ0FBQyxBQUVELE1BQU0sZUFBQyxDQUFDLEFBQ0osVUFBVSxDQUFFLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQzdDLE9BQU8sQ0FBRSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUN4QyxLQUFLLENBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQUFDekMsQ0FBQyJ9 */"; - append_dev(document.head, style); -} +/* src/Selection.svelte generated by Svelte v3.35.0 */ -function get_each_context$2(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[33] = list[i]; - child_ctx[35] = i; - return child_ctx; -} +const file$b = "src/Selection.svelte"; -// (241:0) {#if isVirtualList} -function create_if_block_3$1(ctx) { +function create_fragment$b(ctx) { let div; - let switch_instance; - let current; - var switch_value = /*VirtualList*/ ctx[2]; - - function switch_props(ctx) { - return { - props: { - items: /*items*/ ctx[5], - itemHeight: /*itemHeight*/ ctx[8], - $$slots: { - default: [ - create_default_slot, - ({ item, i }) => ({ 33: item, 35: i }), - ({ item, i }) => [0, (item ? 4 : 0) | (i ? 16 : 0)] - ] - }, - $$scope: { ctx } - }, - $$inline: true - }; - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - } + let raw_value = /*getSelectionLabel*/ ctx[0](/*item*/ ctx[1]) + ""; const block = { c: function create() { div = element("div"); - if (switch_instance) create_component(switch_instance.$$.fragment); - attr_dev(div, "class", "listContainer virtualList svelte-1wmovev"); - add_location(div, file$b, 241, 4, 6870); + attr_dev(div, "class", "selection svelte-pu1q1n"); + add_location(div, file$b, 13, 0, 230); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); }, m: function mount(target, anchor) { insert_dev(target, div, anchor); - - if (switch_instance) { - mount_component(switch_instance, div, null); - } - - /*div_binding*/ ctx[21](div); - current = true; - }, - p: function update(ctx, dirty) { - const switch_instance_changes = {}; - if (dirty[0] & /*items*/ 32) switch_instance_changes.items = /*items*/ ctx[5]; - if (dirty[0] & /*itemHeight*/ 256) switch_instance_changes.itemHeight = /*itemHeight*/ ctx[8]; - - if (dirty[0] & /*Item, filterText, getOptionLabel, value, optionIdentifier, hoverItemIndex, items*/ 9834 | dirty[1] & /*$$scope, item, i*/ 52) { - switch_instance_changes.$$scope = { dirty, ctx }; - } - - if (switch_value !== (switch_value = /*VirtualList*/ ctx[2])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; - - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); - - check_outros(); - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, div, null); - } else { - switch_instance = null; - } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; + div.innerHTML = raw_value; }, + p: function update(ctx, [dirty]) { + if (dirty & /*getSelectionLabel, item*/ 3 && raw_value !== (raw_value = /*getSelectionLabel*/ ctx[0](/*item*/ ctx[1]) + "")) div.innerHTML = raw_value; }, + i: noop, + o: noop, d: function destroy(detaching) { if (detaching) detach_dev(div); - if (switch_instance) destroy_component(switch_instance); - /*div_binding*/ ctx[21](null); } }; dispatch_dev("SvelteRegisterBlock", { block, - id: create_if_block_3$1.name, - type: "if", - source: "(241:0) {#if isVirtualList}", + id: create_fragment$b.name, + type: "component", + source: "", ctx }); return block; } -// (243:8) -function create_default_slot(ctx) { - let div; - let switch_instance; - let current; - let mounted; - let dispose; - var switch_value = /*Item*/ ctx[3]; +function instance$b($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Selection", slots, []); + let { getSelectionLabel = undefined } = $$props; + let { item = undefined } = $$props; + const writable_props = ["getSelectionLabel", "item"]; - function switch_props(ctx) { - return { - props: { - item: /*item*/ ctx[33], - filterText: /*filterText*/ ctx[13], - getOptionLabel: /*getOptionLabel*/ ctx[6], - isFirst: isItemFirst(/*i*/ ctx[35]), - isActive: isItemActive(/*item*/ ctx[33], /*value*/ ctx[9], /*optionIdentifier*/ ctx[10]), - isHover: isItemHover(/*hoverItemIndex*/ ctx[1], /*item*/ ctx[33], /*i*/ ctx[35], /*items*/ ctx[5]) - }, - $$inline: true - }; + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + $$self.$$set = $$props => { + if ("getSelectionLabel" in $$props) $$invalidate(0, getSelectionLabel = $$props.getSelectionLabel); + if ("item" in $$props) $$invalidate(1, item = $$props.item); + }; + + $$self.$capture_state = () => ({ getSelectionLabel, item }); + + $$self.$inject_state = $$props => { + if ("getSelectionLabel" in $$props) $$invalidate(0, getSelectionLabel = $$props.getSelectionLabel); + if ("item" in $$props) $$invalidate(1, item = $$props.item); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); } - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); + return [getSelectionLabel, item]; +} + +class Selection extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$b, create_fragment$b, safe_not_equal, { getSelectionLabel: 0, item: 1 }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Selection", + options, + id: create_fragment$b.name + }); } - function mouseover_handler() { - return /*mouseover_handler*/ ctx[19](/*i*/ ctx[35]); + get getSelectionLabel() { + return this.$$.ctx[0]; + } + + set getSelectionLabel(getSelectionLabel) { + this.$set({ getSelectionLabel }); + flush(); + } + + get item() { + return this.$$.ctx[1]; + } + + set item(item) { + this.$set({ item }); + flush(); } +} + +/* src/MultiSelection.svelte generated by Svelte v3.35.0 */ +const file$a = "src/MultiSelection.svelte"; + +function get_each_context$2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[4] = list[i]; + child_ctx[10] = i; + return child_ctx; +} + +// (88:8) {#if !isDisabled && !multiFullItemClearable} +function create_if_block$2(ctx) { + let div; + let svg; + let path; + let mounted; + let dispose; function click_handler(...args) { - return /*click_handler*/ ctx[20](/*item*/ ctx[33], /*i*/ ctx[35], ...args); + return /*click_handler*/ ctx[6](/*i*/ ctx[10], ...args); } const block = { c: function create() { div = element("div"); - if (switch_instance) create_component(switch_instance.$$.fragment); - attr_dev(div, "class", "listItem"); - add_location(div, file$b, 249, 12, 7095); + svg = svg_element("svg"); + path = svg_element("path"); + attr_dev(path, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124 l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); + add_location(path, file$a, 99, 20, 3025); + attr_dev(svg, "width", "100%"); + attr_dev(svg, "height", "100%"); + attr_dev(svg, "viewBox", "-2 -2 50 50"); + attr_dev(svg, "focusable", "false"); + attr_dev(svg, "role", "presentation"); + attr_dev(svg, "class", "svelte-liu9pa"); + add_location(svg, file$a, 92, 16, 2795); + attr_dev(div, "class", "multiSelectItem_clear svelte-liu9pa"); + add_location(div, file$a, 88, 12, 2654); }, m: function mount(target, anchor) { insert_dev(target, div, anchor); - - if (switch_instance) { - mount_component(switch_instance, div, null); - } - - current = true; + append_dev(div, svg); + append_dev(svg, path); if (!mounted) { - dispose = [ - listen_dev(div, "mouseover", mouseover_handler, false, false, false), - listen_dev(div, "click", click_handler, false, false, false) - ]; - + dispose = listen_dev(div, "click", click_handler, false, false, false); mounted = true; } }, p: function update(new_ctx, dirty) { ctx = new_ctx; - const switch_instance_changes = {}; - if (dirty[1] & /*item*/ 4) switch_instance_changes.item = /*item*/ ctx[33]; - if (dirty[0] & /*filterText*/ 8192) switch_instance_changes.filterText = /*filterText*/ ctx[13]; - if (dirty[0] & /*getOptionLabel*/ 64) switch_instance_changes.getOptionLabel = /*getOptionLabel*/ ctx[6]; - if (dirty[1] & /*i*/ 16) switch_instance_changes.isFirst = isItemFirst(/*i*/ ctx[35]); - if (dirty[0] & /*value, optionIdentifier*/ 1536 | dirty[1] & /*item*/ 4) switch_instance_changes.isActive = isItemActive(/*item*/ ctx[33], /*value*/ ctx[9], /*optionIdentifier*/ ctx[10]); - if (dirty[0] & /*hoverItemIndex, items*/ 34 | dirty[1] & /*item, i*/ 20) switch_instance_changes.isHover = isItemHover(/*hoverItemIndex*/ ctx[1], /*item*/ ctx[33], /*i*/ ctx[35], /*items*/ ctx[5]); - - if (switch_value !== (switch_value = /*Item*/ ctx[3])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + mounted = false; + dispose(); + } + }; - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$2.name, + type: "if", + source: "(88:8) {#if !isDisabled && !multiFullItemClearable}", + ctx + }); - check_outros(); - } + return block; +} - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, div, null); +// (77:0) {#each value as value, i} +function create_each_block$2(ctx) { + let div1; + let div0; + let raw_value = /*getSelectionLabel*/ ctx[3](/*value*/ ctx[4]) + ""; + let t0; + let t1; + let div1_class_value; + let mounted; + let dispose; + let if_block = !/*isDisabled*/ ctx[1] && !/*multiFullItemClearable*/ ctx[2] && create_if_block$2(ctx); + + function click_handler_1(...args) { + return /*click_handler_1*/ ctx[7](/*i*/ ctx[10], ...args); + } + + const block = { + c: function create() { + div1 = element("div"); + div0 = element("div"); + t0 = space(); + if (if_block) if_block.c(); + t1 = space(); + attr_dev(div0, "class", "multiSelectItem_label svelte-liu9pa"); + add_location(div0, file$a, 84, 8, 2493); + attr_dev(div1, "class", div1_class_value = "multiSelectItem " + (/*activeValue*/ ctx[0] === /*i*/ ctx[10] ? "active" : "") + " " + (/*isDisabled*/ ctx[1] ? "disabled" : "") + " svelte-liu9pa"); + add_location(div1, file$a, 77, 4, 2257); + }, + m: function mount(target, anchor) { + insert_dev(target, div1, anchor); + append_dev(div1, div0); + div0.innerHTML = raw_value; + append_dev(div1, t0); + if (if_block) if_block.m(div1, null); + append_dev(div1, t1); + + if (!mounted) { + dispose = listen_dev(div1, "click", click_handler_1, false, false, false); + mounted = true; + } + }, + p: function update(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & /*getSelectionLabel, value*/ 24 && raw_value !== (raw_value = /*getSelectionLabel*/ ctx[3](/*value*/ ctx[4]) + "")) div0.innerHTML = raw_value; + if (!/*isDisabled*/ ctx[1] && !/*multiFullItemClearable*/ ctx[2]) { + if (if_block) { + if_block.p(ctx, dirty); } else { - switch_instance = null; + if_block = create_if_block$2(ctx); + if_block.c(); + if_block.m(div1, t1); } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); + } else if (if_block) { + if_block.d(1); + if_block = null; + } + + if (dirty & /*activeValue, isDisabled*/ 3 && div1_class_value !== (div1_class_value = "multiSelectItem " + (/*activeValue*/ ctx[0] === /*i*/ ctx[10] ? "active" : "") + " " + (/*isDisabled*/ ctx[1] ? "disabled" : "") + " svelte-liu9pa")) { + attr_dev(div1, "class", div1_class_value); } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; }, d: function destroy(detaching) { - if (detaching) detach_dev(div); - if (switch_instance) destroy_component(switch_instance); + if (detaching) detach_dev(div1); + if (if_block) if_block.d(); mounted = false; - run_all(dispose); + dispose(); } }; dispatch_dev("SvelteRegisterBlock", { block, - id: create_default_slot.name, - type: "slot", - source: "(243:8) ", + id: create_each_block$2.name, + type: "each", + source: "(77:0) {#each value as value, i}", ctx }); return block; } -// (273:0) {#if !isVirtualList} -function create_if_block$2(ctx) { - let div; - let current; - let each_value = /*items*/ ctx[5]; +function create_fragment$a(ctx) { + let each_1_anchor; + let each_value = /*value*/ ctx[4]; validate_each_argument(each_value); let each_blocks = []; @@ -3762,48 +3752,27 @@ function create_if_block$2(ctx) { each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); } - const out = i => transition_out(each_blocks[i], 1, 1, () => { - each_blocks[i] = null; - }); - - let each_1_else = null; - - if (!each_value.length) { - each_1_else = create_else_block_1$1(ctx); - } - const block = { c: function create() { - div = element("div"); - for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - if (each_1_else) { - each_1_else.c(); - } - - attr_dev(div, "class", "listContainer svelte-1wmovev"); - add_location(div, file$b, 273, 4, 7829); + each_1_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); }, m: function mount(target, anchor) { - insert_dev(target, div, anchor); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div, null); - } - - if (each_1_else) { - each_1_else.m(div, null); + each_blocks[i].m(target, anchor); } - /*div_binding_1*/ ctx[24](div); - current = true; + insert_dev(target, each_1_anchor, anchor); }, - p: function update(ctx, dirty) { - if (dirty[0] & /*getGroupHeaderLabel, items, handleHover, handleClick, Item, filterText, getOptionLabel, value, optionIdentifier, hoverItemIndex, noOptionsMessage, hideEmptyState*/ 65258) { - each_value = /*items*/ ctx[5]; + p: function update(ctx, [dirty]) { + if (dirty & /*activeValue, isDisabled, multiFullItemClearable, handleClear, getSelectionLabel, value*/ 63) { + each_value = /*value*/ ctx[4]; validate_each_argument(each_value); let i; @@ -3812,225 +3781,340 @@ function create_if_block$2(ctx) { if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); - transition_in(each_blocks[i], 1); } else { each_blocks[i] = create_each_block$2(child_ctx); each_blocks[i].c(); - transition_in(each_blocks[i], 1); - each_blocks[i].m(div, null); + each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); } } - group_outros(); - - for (i = each_value.length; i < each_blocks.length; i += 1) { - out(i); - } - - check_outros(); - - if (!each_value.length && each_1_else) { - each_1_else.p(ctx, dirty); - } else if (!each_value.length) { - each_1_else = create_else_block_1$1(ctx); - each_1_else.c(); - each_1_else.m(div, null); - } else if (each_1_else) { - each_1_else.d(1); - each_1_else = null; + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); } - } - }, - i: function intro(local) { - if (current) return; - - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o: function outro(local) { - each_blocks = each_blocks.filter(Boolean); - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); + each_blocks.length = each_value.length; } - - current = false; }, + i: noop, + o: noop, d: function destroy(detaching) { - if (detaching) detach_dev(div); destroy_each(each_blocks, detaching); - if (each_1_else) each_1_else.d(); - /*div_binding_1*/ ctx[24](null); + if (detaching) detach_dev(each_1_anchor); } }; dispatch_dev("SvelteRegisterBlock", { block, - id: create_if_block$2.name, - type: "if", - source: "(273:0) {#if !isVirtualList}", + id: create_fragment$a.name, + type: "component", + source: "", ctx }); return block; } -// (299:8) {:else} -function create_else_block_1$1(ctx) { - let if_block_anchor; - let if_block = !/*hideEmptyState*/ ctx[11] && create_if_block_2$1(ctx); +function instance$a($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("MultiSelection", slots, []); + const dispatch = createEventDispatcher(); + let { value = [] } = $$props; + let { activeValue = undefined } = $$props; + let { isDisabled = false } = $$props; + let { multiFullItemClearable = false } = $$props; + let { getSelectionLabel = undefined } = $$props; - const block = { - c: function create() { - if (if_block) if_block.c(); - if_block_anchor = empty(); - }, - m: function mount(target, anchor) { - if (if_block) if_block.m(target, anchor); - insert_dev(target, if_block_anchor, anchor); - }, - p: function update(ctx, dirty) { - if (!/*hideEmptyState*/ ctx[11]) { - if (if_block) { - if_block.p(ctx, dirty); - } else { - if_block = create_if_block_2$1(ctx); - if_block.c(); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - }, - d: function destroy(detaching) { - if (if_block) if_block.d(detaching); - if (detaching) detach_dev(if_block_anchor); - } - }; + function handleClear(i, event) { + event.stopPropagation(); + dispatch("multiItemClear", { i }); + } - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block_1$1.name, - type: "else", - source: "(299:8) {:else}", - ctx - }); + const writable_props = [ + "value", + "activeValue", + "isDisabled", + "multiFullItemClearable", + "getSelectionLabel" + ]; - return block; -} + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); -// (300:12) {#if !hideEmptyState} -function create_if_block_2$1(ctx) { - let div; - let t; + const click_handler = (i, event) => handleClear(i, event); + const click_handler_1 = (i, event) => multiFullItemClearable ? handleClear(i, event) : {}; - const block = { - c: function create() { - div = element("div"); - t = text(/*noOptionsMessage*/ ctx[12]); - attr_dev(div, "class", "empty svelte-1wmovev"); - add_location(div, file$b, 300, 16, 8904); + $$self.$$set = $$props => { + if ("value" in $$props) $$invalidate(4, value = $$props.value); + if ("activeValue" in $$props) $$invalidate(0, activeValue = $$props.activeValue); + if ("isDisabled" in $$props) $$invalidate(1, isDisabled = $$props.isDisabled); + if ("multiFullItemClearable" in $$props) $$invalidate(2, multiFullItemClearable = $$props.multiFullItemClearable); + if ("getSelectionLabel" in $$props) $$invalidate(3, getSelectionLabel = $$props.getSelectionLabel); + }; + + $$self.$capture_state = () => ({ + createEventDispatcher, + dispatch, + value, + activeValue, + isDisabled, + multiFullItemClearable, + getSelectionLabel, + handleClear + }); + + $$self.$inject_state = $$props => { + if ("value" in $$props) $$invalidate(4, value = $$props.value); + if ("activeValue" in $$props) $$invalidate(0, activeValue = $$props.activeValue); + if ("isDisabled" in $$props) $$invalidate(1, isDisabled = $$props.isDisabled); + if ("multiFullItemClearable" in $$props) $$invalidate(2, multiFullItemClearable = $$props.multiFullItemClearable); + if ("getSelectionLabel" in $$props) $$invalidate(3, getSelectionLabel = $$props.getSelectionLabel); + }; + + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } + + return [ + activeValue, + isDisabled, + multiFullItemClearable, + getSelectionLabel, + value, + handleClear, + click_handler, + click_handler_1 + ]; +} + +class MultiSelection extends SvelteComponentDev { + constructor(options) { + super(options); + + init(this, options, instance$a, create_fragment$a, safe_not_equal, { + value: 4, + activeValue: 0, + isDisabled: 1, + multiFullItemClearable: 2, + getSelectionLabel: 3 + }); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "MultiSelection", + options, + id: create_fragment$a.name + }); + } + + get value() { + return this.$$.ctx[4]; + } + + set value(value) { + this.$set({ value }); + flush(); + } + + get activeValue() { + return this.$$.ctx[0]; + } + + set activeValue(activeValue) { + this.$set({ activeValue }); + flush(); + } + + get isDisabled() { + return this.$$.ctx[1]; + } + + set isDisabled(isDisabled) { + this.$set({ isDisabled }); + flush(); + } + + get multiFullItemClearable() { + return this.$$.ctx[2]; + } + + set multiFullItemClearable(multiFullItemClearable) { + this.$set({ multiFullItemClearable }); + flush(); + } + + get getSelectionLabel() { + return this.$$.ctx[3]; + } + + set getSelectionLabel(getSelectionLabel) { + this.$set({ getSelectionLabel }); + flush(); + } +} + +function isOutOfViewport (elem) { + const bounding = elem.getBoundingClientRect(); + const out = {}; + + out.top = bounding.top < 0; + out.left = bounding.left < 0; + out.bottom = + bounding.bottom > + (window.innerHeight || document.documentElement.clientHeight); + out.right = + bounding.right > + (window.innerWidth || document.documentElement.clientWidth); + out.any = out.top || out.left || out.bottom || out.right; + + return out; +} + +function debounce(func, wait, immediate) { + let timeout; + + return function executedFunction() { + let context = this; + let args = arguments; + + let later = function () { + timeout = null; + if (!immediate) func.apply(context, args); + }; + + let callNow = immediate && !timeout; + + clearTimeout(timeout); + + timeout = setTimeout(later, wait); + + if (callNow) func.apply(context, args); + }; +} + +/* src/ClearIcon.svelte generated by Svelte v3.35.0 */ + +const file$9 = "src/ClearIcon.svelte"; + +function create_fragment$9(ctx) { + let svg; + let path; + + const block = { + c: function create() { + svg = svg_element("svg"); + path = svg_element("path"); + attr_dev(path, "fill", "currentColor"); + attr_dev(path, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124\n l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); + add_location(path, file$9, 7, 4, 118); + attr_dev(svg, "width", "100%"); + attr_dev(svg, "height", "100%"); + attr_dev(svg, "viewBox", "-2 -2 50 50"); + attr_dev(svg, "focusable", "false"); + attr_dev(svg, "role", "presentation"); + add_location(svg, file$9, 0, 0, 0); }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, t); + l: function claim(nodes) { + throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); }, - p: function update(ctx, dirty) { - if (dirty[0] & /*noOptionsMessage*/ 4096) set_data_dev(t, /*noOptionsMessage*/ ctx[12]); + m: function mount(target, anchor) { + insert_dev(target, svg, anchor); + append_dev(svg, path); }, + p: noop, + i: noop, + o: noop, d: function destroy(detaching) { - if (detaching) detach_dev(div); + if (detaching) detach_dev(svg); } }; dispatch_dev("SvelteRegisterBlock", { block, - id: create_if_block_2$1.name, - type: "if", - source: "(300:12) {#if !hideEmptyState}", + id: create_fragment$9.name, + type: "component", + source: "", ctx }); return block; } -// (278:12) {:else} -function create_else_block$1(ctx) { - let div; +function instance$9($$self, $$props) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("ClearIcon", slots, []); + const writable_props = []; + + Object.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); + }); + + return []; +} + +class ClearIcon extends SvelteComponentDev { + constructor(options) { + super(options); + init(this, options, instance$9, create_fragment$9, safe_not_equal, {}); + + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "ClearIcon", + options, + id: create_fragment$9.name + }); + } +} + +/* src/Select.svelte generated by Svelte v3.35.0 */ + +const { Object: Object_1, console: console_1 } = globals; +const file$8 = "src/Select.svelte"; + +// (918:4) {#if Icon} +function create_if_block_7(ctx) { let switch_instance; - let t; + let switch_instance_anchor; let current; - let mounted; - let dispose; - var switch_value = /*Item*/ ctx[3]; + const switch_instance_spread_levels = [/*iconProps*/ ctx[18]]; + var switch_value = /*Icon*/ ctx[17]; function switch_props(ctx) { + let switch_instance_props = {}; + + for (let i = 0; i < switch_instance_spread_levels.length; i += 1) { + switch_instance_props = assign(switch_instance_props, switch_instance_spread_levels[i]); + } + return { - props: { - item: /*item*/ ctx[33], - filterText: /*filterText*/ ctx[13], - getOptionLabel: /*getOptionLabel*/ ctx[6], - isFirst: isItemFirst(/*i*/ ctx[35]), - isActive: isItemActive(/*item*/ ctx[33], /*value*/ ctx[9], /*optionIdentifier*/ ctx[10]), - isHover: isItemHover(/*hoverItemIndex*/ ctx[1], /*item*/ ctx[33], /*i*/ ctx[35], /*items*/ ctx[5]) - }, + props: switch_instance_props, $$inline: true }; } if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - } - - function mouseover_handler_1() { - return /*mouseover_handler_1*/ ctx[22](/*i*/ ctx[35]); - } - - function click_handler_1(...args) { - return /*click_handler_1*/ ctx[23](/*item*/ ctx[33], /*i*/ ctx[35], ...args); + switch_instance = new switch_value(switch_props()); } const block = { c: function create() { - div = element("div"); if (switch_instance) create_component(switch_instance.$$.fragment); - t = space(); - attr_dev(div, "class", "listItem"); - add_location(div, file$b, 278, 16, 8085); + switch_instance_anchor = empty(); }, m: function mount(target, anchor) { - insert_dev(target, div, anchor); - if (switch_instance) { - mount_component(switch_instance, div, null); + mount_component(switch_instance, target, anchor); } - append_dev(div, t); + insert_dev(target, switch_instance_anchor, anchor); current = true; - - if (!mounted) { - dispose = [ - listen_dev(div, "mouseover", mouseover_handler_1, false, false, false), - listen_dev(div, "click", click_handler_1, false, false, false) - ]; - - mounted = true; - } }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - const switch_instance_changes = {}; - if (dirty[0] & /*items*/ 32) switch_instance_changes.item = /*item*/ ctx[33]; - if (dirty[0] & /*filterText*/ 8192) switch_instance_changes.filterText = /*filterText*/ ctx[13]; - if (dirty[0] & /*getOptionLabel*/ 64) switch_instance_changes.getOptionLabel = /*getOptionLabel*/ ctx[6]; - if (dirty[0] & /*items, value, optionIdentifier*/ 1568) switch_instance_changes.isActive = isItemActive(/*item*/ ctx[33], /*value*/ ctx[9], /*optionIdentifier*/ ctx[10]); - if (dirty[0] & /*hoverItemIndex, items*/ 34) switch_instance_changes.isHover = isItemHover(/*hoverItemIndex*/ ctx[1], /*item*/ ctx[33], /*i*/ ctx[35], /*items*/ ctx[5]); + p: function update(ctx, dirty) { + const switch_instance_changes = (dirty[0] & /*iconProps*/ 262144) + ? get_spread_update(switch_instance_spread_levels, [get_spread_object(/*iconProps*/ ctx[18])]) + : {}; - if (switch_value !== (switch_value = /*Item*/ ctx[3])) { + if (switch_value !== (switch_value = /*Icon*/ ctx[17])) { if (switch_instance) { group_outros(); const old_component = switch_instance; @@ -4043,10 +4127,10 @@ function create_else_block$1(ctx) { } if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); + switch_instance = new switch_value(switch_props()); create_component(switch_instance.$$.fragment); transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, div, t); + mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); } else { switch_instance = null; } @@ -4064,3810 +4148,3736 @@ function create_else_block$1(ctx) { current = false; }, d: function destroy(detaching) { - if (detaching) detach_dev(div); - if (switch_instance) destroy_component(switch_instance); - mounted = false; - run_all(dispose); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block$1.name, - type: "else", - source: "(278:12) {:else}", - ctx - }); - - return block; -} - -// (276:12) {#if item.isGroupHeader && !item.isSelectable} -function create_if_block_1$1(ctx) { - let div; - let t_value = /*getGroupHeaderLabel*/ ctx[7](/*item*/ ctx[33]) + ""; - let t; - - const block = { - c: function create() { - div = element("div"); - t = text(t_value); - attr_dev(div, "class", "listGroupTitle svelte-1wmovev"); - add_location(div, file$b, 276, 16, 7987); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, t); - }, - p: function update(ctx, dirty) { - if (dirty[0] & /*getGroupHeaderLabel, items*/ 160 && t_value !== (t_value = /*getGroupHeaderLabel*/ ctx[7](/*item*/ ctx[33]) + "")) set_data_dev(t, t_value); - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div); + if (detaching) detach_dev(switch_instance_anchor); + if (switch_instance) destroy_component(switch_instance, detaching); } }; dispatch_dev("SvelteRegisterBlock", { block, - id: create_if_block_1$1.name, + id: create_if_block_7.name, type: "if", - source: "(276:12) {#if item.isGroupHeader && !item.isSelectable}", + source: "(918:4) {#if Icon}", ctx }); return block; } -// (275:8) {#each items as item, i} -function create_each_block$2(ctx) { - let current_block_type_index; - let if_block; - let if_block_anchor; +// (922:4) {#if isMulti && value && value.length > 0} +function create_if_block_6(ctx) { + let switch_instance; + let switch_instance_anchor; let current; - const if_block_creators = [create_if_block_1$1, create_else_block$1]; - const if_blocks = []; + var switch_value = /*MultiSelection*/ ctx[7]; - function select_block_type(ctx, dirty) { - if (/*item*/ ctx[33].isGroupHeader && !/*item*/ ctx[33].isSelectable) return 0; - return 1; + function switch_props(ctx) { + return { + props: { + value: /*value*/ ctx[2], + getSelectionLabel: /*getSelectionLabel*/ ctx[13], + activeValue: /*activeValue*/ ctx[25], + isDisabled: /*isDisabled*/ ctx[10], + multiFullItemClearable: /*multiFullItemClearable*/ ctx[9] + }, + $$inline: true + }; } - current_block_type_index = select_block_type(ctx); - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + switch_instance.$on("multiItemClear", /*handleMultiItemClear*/ ctx[29]); + switch_instance.$on("focus", /*handleFocus*/ ctx[32]); + } const block = { c: function create() { - if_block.c(); - if_block_anchor = empty(); + if (switch_instance) create_component(switch_instance.$$.fragment); + switch_instance_anchor = empty(); }, m: function mount(target, anchor) { - if_blocks[current_block_type_index].m(target, anchor); - insert_dev(target, if_block_anchor, anchor); + if (switch_instance) { + mount_component(switch_instance, target, anchor); + } + + insert_dev(target, switch_instance_anchor, anchor); current = true; }, p: function update(ctx, dirty) { - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type(ctx); + const switch_instance_changes = {}; + if (dirty[0] & /*value*/ 4) switch_instance_changes.value = /*value*/ ctx[2]; + if (dirty[0] & /*getSelectionLabel*/ 8192) switch_instance_changes.getSelectionLabel = /*getSelectionLabel*/ ctx[13]; + if (dirty[0] & /*activeValue*/ 33554432) switch_instance_changes.activeValue = /*activeValue*/ ctx[25]; + if (dirty[0] & /*isDisabled*/ 1024) switch_instance_changes.isDisabled = /*isDisabled*/ ctx[10]; + if (dirty[0] & /*multiFullItemClearable*/ 512) switch_instance_changes.multiFullItemClearable = /*multiFullItemClearable*/ ctx[9]; - if (current_block_type_index === previous_block_index) { - if_blocks[current_block_type_index].p(ctx, dirty); - } else { - group_outros(); + if (switch_value !== (switch_value = /*MultiSelection*/ ctx[7])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; - transition_out(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); - check_outros(); - if_block = if_blocks[current_block_type_index]; + check_outros(); + } - if (!if_block) { - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block.c(); + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + switch_instance.$on("multiItemClear", /*handleMultiItemClear*/ ctx[29]); + switch_instance.$on("focus", /*handleFocus*/ ctx[32]); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); } else { - if_block.p(ctx, dirty); + switch_instance = null; } - - transition_in(if_block, 1); - if_block.m(if_block_anchor.parentNode, if_block_anchor); + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); } }, i: function intro(local) { if (current) return; - transition_in(if_block); + if (switch_instance) transition_in(switch_instance.$$.fragment, local); current = true; }, o: function outro(local) { - transition_out(if_block); + if (switch_instance) transition_out(switch_instance.$$.fragment, local); current = false; }, d: function destroy(detaching) { - if_blocks[current_block_type_index].d(detaching); - if (detaching) detach_dev(if_block_anchor); + if (detaching) detach_dev(switch_instance_anchor); + if (switch_instance) destroy_component(switch_instance, detaching); } }; dispatch_dev("SvelteRegisterBlock", { block, - id: create_each_block$2.name, - type: "each", - source: "(275:8) {#each items as item, i}", + id: create_if_block_6.name, + type: "if", + source: "(922:4) {#if isMulti && value && value.length > 0}", ctx }); return block; } -function create_fragment$b(ctx) { - let t; - let if_block1_anchor; - let current; +// (945:4) {:else} +function create_else_block_1$1(ctx) { + let input_1; let mounted; let dispose; - let if_block0 = /*isVirtualList*/ ctx[4] && create_if_block_3$1(ctx); - let if_block1 = !/*isVirtualList*/ ctx[4] && create_if_block$2(ctx); + + let input_1_levels = [ + /*_inputAttributes*/ ctx[26], + { placeholder: /*placeholderText*/ ctx[28] }, + { style: /*inputStyles*/ ctx[15] } + ]; + + let input_1_data = {}; + + for (let i = 0; i < input_1_levels.length; i += 1) { + input_1_data = assign(input_1_data, input_1_levels[i]); + } const block = { c: function create() { - if (if_block0) if_block0.c(); - t = space(); - if (if_block1) if_block1.c(); - if_block1_anchor = empty(); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); + input_1 = element("input"); + set_attributes(input_1, input_1_data); + toggle_class(input_1, "svelte-1ri8kk0", true); + add_location(input_1, file$8, 945, 8, 25497); }, m: function mount(target, anchor) { - if (if_block0) if_block0.m(target, anchor); - insert_dev(target, t, anchor); - if (if_block1) if_block1.m(target, anchor); - insert_dev(target, if_block1_anchor, anchor); - current = true; + insert_dev(target, input_1, anchor); + /*input_1_binding_1*/ ctx[68](input_1); + set_input_value(input_1, /*filterText*/ ctx[3]); if (!mounted) { - dispose = listen_dev(window, "keydown", /*handleKeyDown*/ ctx[16], false, false, false); + dispose = [ + listen_dev(input_1, "focus", /*handleFocus*/ ctx[32], false, false, false), + listen_dev(input_1, "input", /*input_1_input_handler_1*/ ctx[69]) + ]; + mounted = true; } }, p: function update(ctx, dirty) { - if (/*isVirtualList*/ ctx[4]) { - if (if_block0) { - if_block0.p(ctx, dirty); + set_attributes(input_1, input_1_data = get_spread_update(input_1_levels, [ + dirty[0] & /*_inputAttributes*/ 67108864 && /*_inputAttributes*/ ctx[26], + dirty[0] & /*placeholderText*/ 268435456 && { placeholder: /*placeholderText*/ ctx[28] }, + dirty[0] & /*inputStyles*/ 32768 && { style: /*inputStyles*/ ctx[15] } + ])); - if (dirty[0] & /*isVirtualList*/ 16) { - transition_in(if_block0, 1); - } - } else { - if_block0 = create_if_block_3$1(ctx); - if_block0.c(); - transition_in(if_block0, 1); - if_block0.m(t.parentNode, t); - } - } else if (if_block0) { - group_outros(); + if (dirty[0] & /*filterText*/ 8 && input_1.value !== /*filterText*/ ctx[3]) { + set_input_value(input_1, /*filterText*/ ctx[3]); + } - transition_out(if_block0, 1, 1, () => { - if_block0 = null; - }); + toggle_class(input_1, "svelte-1ri8kk0", true); + }, + d: function destroy(detaching) { + if (detaching) detach_dev(input_1); + /*input_1_binding_1*/ ctx[68](null); + mounted = false; + run_all(dispose); + } + }; - check_outros(); - } + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_else_block_1$1.name, + type: "else", + source: "(945:4) {:else}", + ctx + }); - if (!/*isVirtualList*/ ctx[4]) { - if (if_block1) { - if_block1.p(ctx, dirty); + return block; +} - if (dirty[0] & /*isVirtualList*/ 16) { - transition_in(if_block1, 1); - } - } else { - if_block1 = create_if_block$2(ctx); - if_block1.c(); - transition_in(if_block1, 1); - if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); - } - } else if (if_block1) { - group_outros(); +// (935:4) {#if isDisabled} +function create_if_block_5(ctx) { + let input_1; + let mounted; + let dispose; - transition_out(if_block1, 1, 1, () => { - if_block1 = null; - }); + let input_1_levels = [ + /*_inputAttributes*/ ctx[26], + { placeholder: /*placeholderText*/ ctx[28] }, + { style: /*inputStyles*/ ctx[15] }, + { disabled: true } + ]; - check_outros(); - } + let input_1_data = {}; + + for (let i = 0; i < input_1_levels.length; i += 1) { + input_1_data = assign(input_1_data, input_1_levels[i]); + } + + const block = { + c: function create() { + input_1 = element("input"); + set_attributes(input_1, input_1_data); + toggle_class(input_1, "svelte-1ri8kk0", true); + add_location(input_1, file$8, 935, 8, 25229); }, - i: function intro(local) { - if (current) return; - transition_in(if_block0); - transition_in(if_block1); - current = true; + m: function mount(target, anchor) { + insert_dev(target, input_1, anchor); + /*input_1_binding*/ ctx[66](input_1); + set_input_value(input_1, /*filterText*/ ctx[3]); + + if (!mounted) { + dispose = [ + listen_dev(input_1, "focus", /*handleFocus*/ ctx[32], false, false, false), + listen_dev(input_1, "input", /*input_1_input_handler*/ ctx[67]) + ]; + + mounted = true; + } }, - o: function outro(local) { - transition_out(if_block0); - transition_out(if_block1); - current = false; + p: function update(ctx, dirty) { + set_attributes(input_1, input_1_data = get_spread_update(input_1_levels, [ + dirty[0] & /*_inputAttributes*/ 67108864 && /*_inputAttributes*/ ctx[26], + dirty[0] & /*placeholderText*/ 268435456 && { placeholder: /*placeholderText*/ ctx[28] }, + dirty[0] & /*inputStyles*/ 32768 && { style: /*inputStyles*/ ctx[15] }, + { disabled: true } + ])); + + if (dirty[0] & /*filterText*/ 8 && input_1.value !== /*filterText*/ ctx[3]) { + set_input_value(input_1, /*filterText*/ ctx[3]); + } + + toggle_class(input_1, "svelte-1ri8kk0", true); }, d: function destroy(detaching) { - if (if_block0) if_block0.d(detaching); - if (detaching) detach_dev(t); - if (if_block1) if_block1.d(detaching); - if (detaching) detach_dev(if_block1_anchor); + if (detaching) detach_dev(input_1); + /*input_1_binding*/ ctx[66](null); mounted = false; - dispose(); + run_all(dispose); } }; dispatch_dev("SvelteRegisterBlock", { block, - id: create_fragment$b.name, - type: "component", - source: "", + id: create_if_block_5.name, + type: "if", + source: "(935:4) {#if isDisabled}", ctx }); return block; } -function isItemActive(item, value, optionIdentifier) { - return value && value[optionIdentifier] === item[optionIdentifier]; -} - -function isItemFirst(itemIndex) { - return itemIndex === 0; -} - -function isItemHover(hoverItemIndex, item, itemIndex, items) { - return hoverItemIndex === itemIndex || items.length === 1; -} +// (956:4) {#if !isMulti && showSelectedItem} +function create_if_block_4(ctx) { + let div; + let switch_instance; + let current; + let mounted; + let dispose; + var switch_value = /*Selection*/ ctx[6]; -function instance$b($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("List", slots, []); - const dispatch = createEventDispatcher(); - let { container = undefined } = $$props; - let { VirtualList } = $$props; - let { Item: Item$1 = Item } = $$props; - let { isVirtualList = false } = $$props; - let { items = [] } = $$props; + function switch_props(ctx) { + return { + props: { + item: /*value*/ ctx[2], + getSelectionLabel: /*getSelectionLabel*/ ctx[13] + }, + $$inline: true + }; + } - let { getOptionLabel = (option, filterText) => { - if (option) return option.isCreator - ? `Create \"${filterText}\"` - : option.label; - } } = $$props; + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + } - let { getGroupHeaderLabel = option => { - return option.label; - } } = $$props; + const block = { + c: function create() { + div = element("div"); + if (switch_instance) create_component(switch_instance.$$.fragment); + attr_dev(div, "class", "selectedItem svelte-1ri8kk0"); + add_location(div, file$8, 956, 8, 25782); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); - let { itemHeight = 40 } = $$props; - let { hoverItemIndex = 0 } = $$props; - let { value = undefined } = $$props; - let { optionIdentifier = "value" } = $$props; - let { hideEmptyState = false } = $$props; - let { noOptionsMessage = "No options" } = $$props; - let { isMulti = false } = $$props; - let { activeItemIndex = 0 } = $$props; - let { filterText = "" } = $$props; - let isScrollingTimer = 0; - let isScrolling = false; - let prev_items; + if (switch_instance) { + mount_component(switch_instance, div, null); + } - onMount(() => { - if (items.length > 0 && !isMulti && value) { - const _hoverItemIndex = items.findIndex(item => item[optionIdentifier] === value[optionIdentifier]); + current = true; - if (_hoverItemIndex) { - $$invalidate(1, hoverItemIndex = _hoverItemIndex); + if (!mounted) { + dispose = listen_dev(div, "focus", /*handleFocus*/ ctx[32], false, false, false); + mounted = true; } - } + }, + p: function update(ctx, dirty) { + const switch_instance_changes = {}; + if (dirty[0] & /*value*/ 4) switch_instance_changes.item = /*value*/ ctx[2]; + if (dirty[0] & /*getSelectionLabel*/ 8192) switch_instance_changes.getSelectionLabel = /*getSelectionLabel*/ ctx[13]; - scrollToActiveItem("active"); + if (switch_value !== (switch_value = /*Selection*/ ctx[6])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; - container.addEventListener( - "scroll", - () => { - clearTimeout(isScrollingTimer); + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); - isScrollingTimer = setTimeout( - () => { - isScrolling = false; - }, - 100 - ); - }, - false - ); - }); + check_outros(); + } - beforeUpdate(() => { - if (items !== prev_items && items.length > 0) { - $$invalidate(1, hoverItemIndex = 0); + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, div, null); + } else { + switch_instance = null; + } + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); + } + }, + i: function intro(local) { + if (current) return; + if (switch_instance) transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o: function outro(local) { + if (switch_instance) transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if (switch_instance) destroy_component(switch_instance); + mounted = false; + dispose(); } + }; - prev_items = items; + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_4.name, + type: "if", + source: "(956:4) {#if !isMulti && showSelectedItem}", + ctx }); - function handleSelect(item) { - if (item.isCreator) return; - dispatch("itemSelected", item); - } - - function handleHover(i) { - if (isScrolling) return; - $$invalidate(1, hoverItemIndex = i); - } + return block; +} - function handleClick(args) { - const { item, i, event } = args; - event.stopPropagation(); - if (value && !isMulti && value[optionIdentifier] === item[optionIdentifier]) return closeList(); +// (966:4) {#if showSelectedItem && isClearable && !isDisabled && !isWaiting} +function create_if_block_3$1(ctx) { + let div; + let switch_instance; + let current; + let mounted; + let dispose; + var switch_value = /*ClearIcon*/ ctx[23]; - if (item.isCreator) { - dispatch("itemCreated", filterText); - } else { - $$invalidate(17, activeItemIndex = i); - $$invalidate(1, hoverItemIndex = i); - handleSelect(item); - } + function switch_props(ctx) { + return { $$inline: true }; } - function closeList() { - dispatch("closeList"); + if (switch_value) { + switch_instance = new switch_value(switch_props()); } - async function updateHoverItem(increment) { - if (isVirtualList) return; - let isNonSelectableItem = true; + const block = { + c: function create() { + div = element("div"); + if (switch_instance) create_component(switch_instance.$$.fragment); + attr_dev(div, "class", "clearSelect svelte-1ri8kk0"); + add_location(div, file$8, 966, 8, 26080); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); - while (isNonSelectableItem) { - if (increment > 0 && hoverItemIndex === items.length - 1) { - $$invalidate(1, hoverItemIndex = 0); - } else if (increment < 0 && hoverItemIndex === 0) { - $$invalidate(1, hoverItemIndex = items.length - 1); - } else { - $$invalidate(1, hoverItemIndex = hoverItemIndex + increment); + if (switch_instance) { + mount_component(switch_instance, div, null); } - isNonSelectableItem = items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable; - } + current = true; - await tick(); - scrollToActiveItem("hover"); - } + if (!mounted) { + dispose = listen_dev(div, "click", prevent_default(/*handleClear*/ ctx[24]), false, true, false); + mounted = true; + } + }, + p: function update(ctx, dirty) { + if (switch_value !== (switch_value = /*ClearIcon*/ ctx[23])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; - function handleKeyDown(e) { - switch (e.key) { - case "ArrowDown": - e.preventDefault(); - items.length && updateHoverItem(1); - break; - case "ArrowUp": - e.preventDefault(); - items.length && updateHoverItem(-1); - break; - case "Enter": - e.preventDefault(); - if (items.length === 0) break; - const hoverItem = items[hoverItemIndex]; - if (value && !isMulti && value[optionIdentifier] === hoverItem[optionIdentifier]) { - closeList(); - break; + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); + + check_outros(); } - if (hoverItem.isCreator) { - dispatch("itemCreated", filterText); + + if (switch_value) { + switch_instance = new switch_value(switch_props()); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, div, null); } else { - $$invalidate(17, activeItemIndex = hoverItemIndex); - handleSelect(items[hoverItemIndex]); + switch_instance = null; } - break; - case "Tab": - e.preventDefault(); - if (items.length === 0) break; - if (value && value[optionIdentifier] === items[hoverItemIndex][optionIdentifier]) return closeList(); - $$invalidate(17, activeItemIndex = hoverItemIndex); - handleSelect(items[hoverItemIndex]); - break; + } + }, + i: function intro(local) { + if (current) return; + if (switch_instance) transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o: function outro(local) { + if (switch_instance) transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if (switch_instance) destroy_component(switch_instance); + mounted = false; + dispose(); } - } + }; - function scrollToActiveItem(className) { - if (isVirtualList || !container) return; - let offsetBounding; - const focusedElemBounding = container.querySelector(`.listItem .${className}`); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_3$1.name, + type: "if", + source: "(966:4) {#if showSelectedItem && isClearable && !isDisabled && !isWaiting}", + ctx + }); - if (focusedElemBounding) { - offsetBounding = container.getBoundingClientRect().bottom - focusedElemBounding.getBoundingClientRect().bottom; - } + return block; +} - $$invalidate(0, container.scrollTop -= offsetBounding, container); +// (972:4) {#if showIndicator || (showChevron && !value) || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem))} +function create_if_block_1$1(ctx) { + let div; + + function select_block_type_1(ctx, dirty) { + if (/*indicatorSvg*/ ctx[22]) return create_if_block_2$1; + return create_else_block$1; } - const writable_props = [ - "container", - "VirtualList", - "Item", - "isVirtualList", - "items", - "getOptionLabel", - "getGroupHeaderLabel", - "itemHeight", - "hoverItemIndex", - "value", - "optionIdentifier", - "hideEmptyState", - "noOptionsMessage", - "isMulti", - "activeItemIndex", - "filterText" - ]; + let current_block_type = select_block_type_1(ctx); + let if_block = current_block_type(ctx); - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); + const block = { + c: function create() { + div = element("div"); + if_block.c(); + attr_dev(div, "class", "indicator svelte-1ri8kk0"); + add_location(div, file$8, 972, 8, 26388); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + if_block.m(div, null); + }, + p: function update(ctx, dirty) { + if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); - const mouseover_handler = i => handleHover(i); - const click_handler = (item, i, event) => handleClick({ item, i, event }); + if (if_block) { + if_block.c(); + if_block.m(div, null); + } + } + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if_block.d(); + } + }; - function div_binding($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - container = $$value; - $$invalidate(0, container); - }); - } + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_1$1.name, + type: "if", + source: "(972:4) {#if showIndicator || (showChevron && !value) || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem))}", + ctx + }); - const mouseover_handler_1 = i => handleHover(i); - const click_handler_1 = (item, i, event) => handleClick({ item, i, event }); + return block; +} - function div_binding_1($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - container = $$value; - $$invalidate(0, container); - }); - } +// (976:12) {:else} +function create_else_block$1(ctx) { + let svg; + let path; - $$self.$$set = $$props => { - if ("container" in $$props) $$invalidate(0, container = $$props.container); - if ("VirtualList" in $$props) $$invalidate(2, VirtualList = $$props.VirtualList); - if ("Item" in $$props) $$invalidate(3, Item$1 = $$props.Item); - if ("isVirtualList" in $$props) $$invalidate(4, isVirtualList = $$props.isVirtualList); - if ("items" in $$props) $$invalidate(5, items = $$props.items); - if ("getOptionLabel" in $$props) $$invalidate(6, getOptionLabel = $$props.getOptionLabel); - if ("getGroupHeaderLabel" in $$props) $$invalidate(7, getGroupHeaderLabel = $$props.getGroupHeaderLabel); - if ("itemHeight" in $$props) $$invalidate(8, itemHeight = $$props.itemHeight); - if ("hoverItemIndex" in $$props) $$invalidate(1, hoverItemIndex = $$props.hoverItemIndex); - if ("value" in $$props) $$invalidate(9, value = $$props.value); - if ("optionIdentifier" in $$props) $$invalidate(10, optionIdentifier = $$props.optionIdentifier); - if ("hideEmptyState" in $$props) $$invalidate(11, hideEmptyState = $$props.hideEmptyState); - if ("noOptionsMessage" in $$props) $$invalidate(12, noOptionsMessage = $$props.noOptionsMessage); - if ("isMulti" in $$props) $$invalidate(18, isMulti = $$props.isMulti); - if ("activeItemIndex" in $$props) $$invalidate(17, activeItemIndex = $$props.activeItemIndex); - if ("filterText" in $$props) $$invalidate(13, filterText = $$props.filterText); + const block = { + c: function create() { + svg = svg_element("svg"); + path = svg_element("path"); + attr_dev(path, "d", "M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747\n 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0\n 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502\n 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0\n 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"); + add_location(path, file$8, 982, 20, 26704); + attr_dev(svg, "width", "100%"); + attr_dev(svg, "height", "100%"); + attr_dev(svg, "viewBox", "0 0 20 20"); + attr_dev(svg, "focusable", "false"); + attr_dev(svg, "class", "svelte-1ri8kk0"); + add_location(svg, file$8, 976, 16, 26516); + }, + m: function mount(target, anchor) { + insert_dev(target, svg, anchor); + append_dev(svg, path); + }, + p: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(svg); + } }; - $$self.$capture_state = () => ({ - beforeUpdate, - createEventDispatcher, - onMount, - tick, - ItemComponent: Item, - dispatch, - container, - VirtualList, - Item: Item$1, - isVirtualList, - items, - getOptionLabel, - getGroupHeaderLabel, - itemHeight, - hoverItemIndex, - value, - optionIdentifier, - hideEmptyState, - noOptionsMessage, - isMulti, - activeItemIndex, - filterText, - isScrollingTimer, - isScrolling, - prev_items, - handleSelect, - handleHover, - handleClick, - closeList, - updateHoverItem, - handleKeyDown, - scrollToActiveItem, - isItemActive, - isItemFirst, - isItemHover + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_else_block$1.name, + type: "else", + source: "(976:12) {:else}", + ctx }); - $$self.$inject_state = $$props => { - if ("container" in $$props) $$invalidate(0, container = $$props.container); - if ("VirtualList" in $$props) $$invalidate(2, VirtualList = $$props.VirtualList); - if ("Item" in $$props) $$invalidate(3, Item$1 = $$props.Item); - if ("isVirtualList" in $$props) $$invalidate(4, isVirtualList = $$props.isVirtualList); - if ("items" in $$props) $$invalidate(5, items = $$props.items); - if ("getOptionLabel" in $$props) $$invalidate(6, getOptionLabel = $$props.getOptionLabel); - if ("getGroupHeaderLabel" in $$props) $$invalidate(7, getGroupHeaderLabel = $$props.getGroupHeaderLabel); - if ("itemHeight" in $$props) $$invalidate(8, itemHeight = $$props.itemHeight); - if ("hoverItemIndex" in $$props) $$invalidate(1, hoverItemIndex = $$props.hoverItemIndex); - if ("value" in $$props) $$invalidate(9, value = $$props.value); - if ("optionIdentifier" in $$props) $$invalidate(10, optionIdentifier = $$props.optionIdentifier); - if ("hideEmptyState" in $$props) $$invalidate(11, hideEmptyState = $$props.hideEmptyState); - if ("noOptionsMessage" in $$props) $$invalidate(12, noOptionsMessage = $$props.noOptionsMessage); - if ("isMulti" in $$props) $$invalidate(18, isMulti = $$props.isMulti); - if ("activeItemIndex" in $$props) $$invalidate(17, activeItemIndex = $$props.activeItemIndex); - if ("filterText" in $$props) $$invalidate(13, filterText = $$props.filterText); - if ("isScrollingTimer" in $$props) isScrollingTimer = $$props.isScrollingTimer; - if ("isScrolling" in $$props) isScrolling = $$props.isScrolling; - if ("prev_items" in $$props) prev_items = $$props.prev_items; - }; - - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } - - return [ - container, - hoverItemIndex, - VirtualList, - Item$1, - isVirtualList, - items, - getOptionLabel, - getGroupHeaderLabel, - itemHeight, - value, - optionIdentifier, - hideEmptyState, - noOptionsMessage, - filterText, - handleHover, - handleClick, - handleKeyDown, - activeItemIndex, - isMulti, - mouseover_handler, - click_handler, - div_binding, - mouseover_handler_1, - click_handler_1, - div_binding_1 - ]; + return block; } -class List extends SvelteComponentDev { - constructor(options) { - super(options); - if (!document.getElementById("svelte-1wmovev-style")) add_css$6(); - - init( - this, - options, - instance$b, - create_fragment$b, - safe_not_equal, - { - container: 0, - VirtualList: 2, - Item: 3, - isVirtualList: 4, - items: 5, - getOptionLabel: 6, - getGroupHeaderLabel: 7, - itemHeight: 8, - hoverItemIndex: 1, - value: 9, - optionIdentifier: 10, - hideEmptyState: 11, - noOptionsMessage: 12, - isMulti: 18, - activeItemIndex: 17, - filterText: 13 - }, - [-1, -1] - ); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "List", - options, - id: create_fragment$b.name - }); - - const { ctx } = this.$$; - const props = options.props || {}; +// (974:12) {#if indicatorSvg} +function create_if_block_2$1(ctx) { + let html_tag; + let html_anchor; - if (/*VirtualList*/ ctx[2] === undefined && !("VirtualList" in props)) { - console.warn(" was created without expected prop 'VirtualList'"); + const block = { + c: function create() { + html_anchor = empty(); + html_tag = new HtmlTag(html_anchor); + }, + m: function mount(target, anchor) { + html_tag.m(/*indicatorSvg*/ ctx[22], target, anchor); + insert_dev(target, html_anchor, anchor); + }, + p: function update(ctx, dirty) { + if (dirty[0] & /*indicatorSvg*/ 4194304) html_tag.p(/*indicatorSvg*/ ctx[22]); + }, + d: function destroy(detaching) { + if (detaching) detach_dev(html_anchor); + if (detaching) html_tag.d(); } - } - - get container() { - return this.$$.ctx[0]; - } - - set container(container) { - this.$set({ container }); - flush(); - } - - get VirtualList() { - return this.$$.ctx[2]; - } - - set VirtualList(VirtualList) { - this.$set({ VirtualList }); - flush(); - } - - get Item() { - return this.$$.ctx[3]; - } - - set Item(Item) { - this.$set({ Item }); - flush(); - } - - get isVirtualList() { - return this.$$.ctx[4]; - } - - set isVirtualList(isVirtualList) { - this.$set({ isVirtualList }); - flush(); - } + }; - get items() { - return this.$$.ctx[5]; - } + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_2$1.name, + type: "if", + source: "(974:12) {#if indicatorSvg}", + ctx + }); - set items(items) { - this.$set({ items }); - flush(); - } + return block; +} - get getOptionLabel() { - return this.$$.ctx[6]; - } +// (995:4) {#if isWaiting} +function create_if_block$1(ctx) { + let div; + let svg; + let circle; - set getOptionLabel(getOptionLabel) { - this.$set({ getOptionLabel }); - flush(); - } + const block = { + c: function create() { + div = element("div"); + svg = svg_element("svg"); + circle = svg_element("circle"); + attr_dev(circle, "class", "spinner_path svelte-1ri8kk0"); + attr_dev(circle, "cx", "50"); + attr_dev(circle, "cy", "50"); + attr_dev(circle, "r", "20"); + attr_dev(circle, "fill", "none"); + attr_dev(circle, "stroke", "currentColor"); + attr_dev(circle, "stroke-width", "5"); + attr_dev(circle, "stroke-miterlimit", "10"); + add_location(circle, file$8, 997, 16, 27273); + attr_dev(svg, "class", "spinner_icon svelte-1ri8kk0"); + attr_dev(svg, "viewBox", "25 25 50 50"); + add_location(svg, file$8, 996, 12, 27208); + attr_dev(div, "class", "spinner svelte-1ri8kk0"); + add_location(div, file$8, 995, 8, 27174); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + append_dev(div, svg); + append_dev(svg, circle); + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + } + }; - get getGroupHeaderLabel() { - return this.$$.ctx[7]; - } + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$1.name, + type: "if", + source: "(995:4) {#if isWaiting}", + ctx + }); - set getGroupHeaderLabel(getGroupHeaderLabel) { - this.$set({ getGroupHeaderLabel }); - flush(); - } + return block; +} - get itemHeight() { - return this.$$.ctx[8]; - } +function create_fragment$8(ctx) { + let div; + let t0; + let t1; + let t2; + let t3; + let t4; + let t5; + let div_class_value; + let current; + let mounted; + let dispose; + let if_block0 = /*Icon*/ ctx[17] && create_if_block_7(ctx); + let if_block1 = /*isMulti*/ ctx[8] && /*value*/ ctx[2] && /*value*/ ctx[2].length > 0 && create_if_block_6(ctx); - set itemHeight(itemHeight) { - this.$set({ itemHeight }); - flush(); + function select_block_type(ctx, dirty) { + if (/*isDisabled*/ ctx[10]) return create_if_block_5; + return create_else_block_1$1; } - get hoverItemIndex() { - return this.$$.ctx[1]; - } - - set hoverItemIndex(hoverItemIndex) { - this.$set({ hoverItemIndex }); - flush(); - } - - get value() { - return this.$$.ctx[9]; - } - - set value(value) { - this.$set({ value }); - flush(); - } - - get optionIdentifier() { - return this.$$.ctx[10]; - } - - set optionIdentifier(optionIdentifier) { - this.$set({ optionIdentifier }); - flush(); - } - - get hideEmptyState() { - return this.$$.ctx[11]; - } - - set hideEmptyState(hideEmptyState) { - this.$set({ hideEmptyState }); - flush(); - } - - get noOptionsMessage() { - return this.$$.ctx[12]; - } - - set noOptionsMessage(noOptionsMessage) { - this.$set({ noOptionsMessage }); - flush(); - } - - get isMulti() { - return this.$$.ctx[18]; - } - - set isMulti(isMulti) { - this.$set({ isMulti }); - flush(); - } - - get activeItemIndex() { - return this.$$.ctx[17]; - } - - set activeItemIndex(activeItemIndex) { - this.$set({ activeItemIndex }); - flush(); - } - - get filterText() { - return this.$$.ctx[13]; - } - - set filterText(filterText) { - this.$set({ filterText }); - flush(); - } -} - -/* src/Selection.svelte generated by Svelte v3.35.0 */ - -const file$a = "src/Selection.svelte"; - -function add_css$5() { - var style = element("style"); - style.id = "svelte-pu1q1n-style"; - style.textContent = ".selection.svelte-pu1q1n{text-overflow:ellipsis;overflow-x:hidden;white-space:nowrap}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0aW9uLnN2ZWx0ZSIsInNvdXJjZXMiOlsiU2VsZWN0aW9uLnN2ZWx0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8c2NyaXB0PlxuICAgIGV4cG9ydCBsZXQgZ2V0U2VsZWN0aW9uTGFiZWwgPSB1bmRlZmluZWQ7XG4gICAgZXhwb3J0IGxldCBpdGVtID0gdW5kZWZpbmVkO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZT5cbiAgICAuc2VsZWN0aW9uIHtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG48L3N0eWxlPlxuXG48ZGl2IGNsYXNzPVwic2VsZWN0aW9uXCI+XG4gICAge0BodG1sIGdldFNlbGVjdGlvbkxhYmVsKGl0ZW0pfVxuPC9kaXY+XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUksVUFBVSxjQUFDLENBQUMsQUFDUixhQUFhLENBQUUsUUFBUSxDQUN2QixVQUFVLENBQUUsTUFBTSxDQUNsQixXQUFXLENBQUUsTUFBTSxBQUN2QixDQUFDIn0= */"; - append_dev(document.head, style); -} - -function create_fragment$a(ctx) { - let div; - let raw_value = /*getSelectionLabel*/ ctx[0](/*item*/ ctx[1]) + ""; + let current_block_type = select_block_type(ctx); + let if_block2 = current_block_type(ctx); + let if_block3 = !/*isMulti*/ ctx[8] && /*showSelectedItem*/ ctx[27] && create_if_block_4(ctx); + let if_block4 = /*showSelectedItem*/ ctx[27] && /*isClearable*/ ctx[16] && !/*isDisabled*/ ctx[10] && !/*isWaiting*/ ctx[5] && create_if_block_3$1(ctx); + let if_block5 = (/*showIndicator*/ ctx[20] || /*showChevron*/ ctx[19] && !/*value*/ ctx[2] || !/*isSearchable*/ ctx[14] && !/*isDisabled*/ ctx[10] && !/*isWaiting*/ ctx[5] && (/*showSelectedItem*/ ctx[27] && !/*isClearable*/ ctx[16] || !/*showSelectedItem*/ ctx[27])) && create_if_block_1$1(ctx); + let if_block6 = /*isWaiting*/ ctx[5] && create_if_block$1(ctx); const block = { c: function create() { div = element("div"); - attr_dev(div, "class", "selection svelte-pu1q1n"); - add_location(div, file$a, 13, 0, 230); + if (if_block0) if_block0.c(); + t0 = space(); + if (if_block1) if_block1.c(); + t1 = space(); + if_block2.c(); + t2 = space(); + if (if_block3) if_block3.c(); + t3 = space(); + if (if_block4) if_block4.c(); + t4 = space(); + if (if_block5) if_block5.c(); + t5 = space(); + if (if_block6) if_block6.c(); + attr_dev(div, "class", div_class_value = "selectContainer " + /*containerClasses*/ ctx[21] + " svelte-1ri8kk0"); + attr_dev(div, "style", /*containerStyles*/ ctx[12]); + toggle_class(div, "hasError", /*hasError*/ ctx[11]); + toggle_class(div, "multiSelect", /*isMulti*/ ctx[8]); + toggle_class(div, "disabled", /*isDisabled*/ ctx[10]); + toggle_class(div, "focused", /*isFocused*/ ctx[1]); + add_location(div, file$8, 907, 0, 24513); }, l: function claim(nodes) { throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); }, m: function mount(target, anchor) { insert_dev(target, div, anchor); - div.innerHTML = raw_value; - }, - p: function update(ctx, [dirty]) { - if (dirty & /*getSelectionLabel, item*/ 3 && raw_value !== (raw_value = /*getSelectionLabel*/ ctx[0](/*item*/ ctx[1]) + "")) div.innerHTML = raw_value; }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; + if (if_block0) if_block0.m(div, null); + append_dev(div, t0); + if (if_block1) if_block1.m(div, null); + append_dev(div, t1); + if_block2.m(div, null); + append_dev(div, t2); + if (if_block3) if_block3.m(div, null); + append_dev(div, t3); + if (if_block4) if_block4.m(div, null); + append_dev(div, t4); + if (if_block5) if_block5.m(div, null); + append_dev(div, t5); + if (if_block6) if_block6.m(div, null); + /*div_binding*/ ctx[70](div); + current = true; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$a.name, - type: "component", - source: "", - ctx - }); + if (!mounted) { + dispose = [ + listen_dev(window, "click", /*handleWindowClick*/ ctx[33], false, false, false), + listen_dev(window, "keydown", /*handleKeyDown*/ ctx[31], false, false, false), + listen_dev(window, "resize", /*getPosition*/ ctx[30], false, false, false), + listen_dev(div, "click", /*handleClick*/ ctx[34], false, false, false) + ]; - return block; -} + mounted = true; + } + }, + p: function update(ctx, dirty) { + if (/*Icon*/ ctx[17]) { + if (if_block0) { + if_block0.p(ctx, dirty); -function instance$a($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("Selection", slots, []); - let { getSelectionLabel = undefined } = $$props; - let { item = undefined } = $$props; - const writable_props = ["getSelectionLabel", "item"]; + if (dirty[0] & /*Icon*/ 131072) { + transition_in(if_block0, 1); + } + } else { + if_block0 = create_if_block_7(ctx); + if_block0.c(); + transition_in(if_block0, 1); + if_block0.m(div, t0); + } + } else if (if_block0) { + group_outros(); - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); + transition_out(if_block0, 1, 1, () => { + if_block0 = null; + }); - $$self.$$set = $$props => { - if ("getSelectionLabel" in $$props) $$invalidate(0, getSelectionLabel = $$props.getSelectionLabel); - if ("item" in $$props) $$invalidate(1, item = $$props.item); - }; + check_outros(); + } - $$self.$capture_state = () => ({ getSelectionLabel, item }); + if (/*isMulti*/ ctx[8] && /*value*/ ctx[2] && /*value*/ ctx[2].length > 0) { + if (if_block1) { + if_block1.p(ctx, dirty); - $$self.$inject_state = $$props => { - if ("getSelectionLabel" in $$props) $$invalidate(0, getSelectionLabel = $$props.getSelectionLabel); - if ("item" in $$props) $$invalidate(1, item = $$props.item); - }; + if (dirty[0] & /*isMulti, value*/ 260) { + transition_in(if_block1, 1); + } + } else { + if_block1 = create_if_block_6(ctx); + if_block1.c(); + transition_in(if_block1, 1); + if_block1.m(div, t1); + } + } else if (if_block1) { + group_outros(); - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + transition_out(if_block1, 1, 1, () => { + if_block1 = null; + }); - return [getSelectionLabel, item]; -} + check_outros(); + } -class Selection extends SvelteComponentDev { - constructor(options) { - super(options); - if (!document.getElementById("svelte-pu1q1n-style")) add_css$5(); - init(this, options, instance$a, create_fragment$a, safe_not_equal, { getSelectionLabel: 0, item: 1 }); + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block2) { + if_block2.p(ctx, dirty); + } else { + if_block2.d(1); + if_block2 = current_block_type(ctx); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "Selection", - options, - id: create_fragment$a.name - }); - } + if (if_block2) { + if_block2.c(); + if_block2.m(div, t2); + } + } - get getSelectionLabel() { - return this.$$.ctx[0]; - } + if (!/*isMulti*/ ctx[8] && /*showSelectedItem*/ ctx[27]) { + if (if_block3) { + if_block3.p(ctx, dirty); - set getSelectionLabel(getSelectionLabel) { - this.$set({ getSelectionLabel }); - flush(); - } + if (dirty[0] & /*isMulti, showSelectedItem*/ 134217984) { + transition_in(if_block3, 1); + } + } else { + if_block3 = create_if_block_4(ctx); + if_block3.c(); + transition_in(if_block3, 1); + if_block3.m(div, t3); + } + } else if (if_block3) { + group_outros(); - get item() { - return this.$$.ctx[1]; - } + transition_out(if_block3, 1, 1, () => { + if_block3 = null; + }); - set item(item) { - this.$set({ item }); - flush(); - } -} + check_outros(); + } -/* src/MultiSelection.svelte generated by Svelte v3.35.0 */ -const file$9 = "src/MultiSelection.svelte"; - -function add_css$4() { - var style = element("style"); - style.id = "svelte-liu9pa-style"; - style.textContent = ".multiSelectItem.svelte-liu9pa.svelte-liu9pa{background:var(--multiItemBG, #ebedef);margin:var(--multiItemMargin, 5px 5px 0 0);border-radius:var(--multiItemBorderRadius, 16px);height:var(--multiItemHeight, 32px);line-height:var(--multiItemHeight, 32px);display:flex;cursor:default;padding:var(--multiItemPadding, 0 10px 0 15px);max-width:100%}.multiSelectItem_label.svelte-liu9pa.svelte-liu9pa{margin:var(--multiLabelMargin, 0 5px 0 0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.multiSelectItem.svelte-liu9pa.svelte-liu9pa:hover,.multiSelectItem.active.svelte-liu9pa.svelte-liu9pa{background-color:var(--multiItemActiveBG, #006fff);color:var(--multiItemActiveColor, #fff)}.multiSelectItem.disabled.svelte-liu9pa.svelte-liu9pa:hover{background:var(--multiItemDisabledHoverBg, #ebedef);color:var(--multiItemDisabledHoverColor, #c1c6cc)}.multiSelectItem_clear.svelte-liu9pa.svelte-liu9pa{border-radius:var(--multiClearRadius, 50%);background:var(--multiClearBG, #52616f);min-width:var(--multiClearWidth, 16px);max-width:var(--multiClearWidth, 16px);height:var(--multiClearHeight, 16px);position:relative;top:var(--multiClearTop, 8px);text-align:var(--multiClearTextAlign, center);padding:var(--multiClearPadding, 1px)}.multiSelectItem_clear.svelte-liu9pa.svelte-liu9pa:hover,.active.svelte-liu9pa .multiSelectItem_clear.svelte-liu9pa{background:var(--multiClearHoverBG, #fff)}.multiSelectItem_clear.svelte-liu9pa:hover svg.svelte-liu9pa,.active.svelte-liu9pa .multiSelectItem_clear svg.svelte-liu9pa{fill:var(--multiClearHoverFill, #006fff)}.multiSelectItem_clear.svelte-liu9pa svg.svelte-liu9pa{fill:var(--multiClearFill, #ebedef);vertical-align:top}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlTZWxlY3Rpb24uc3ZlbHRlIiwic291cmNlcyI6WyJNdWx0aVNlbGVjdGlvbi5zdmVsdGUiXSwic291cmNlc0NvbnRlbnQiOlsiPHNjcmlwdD5cbiAgICBpbXBvcnQgeyBjcmVhdGVFdmVudERpc3BhdGNoZXIgfSBmcm9tICdzdmVsdGUnO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBjcmVhdGVFdmVudERpc3BhdGNoZXIoKTtcblxuICAgIGV4cG9ydCBsZXQgdmFsdWUgPSBbXTtcbiAgICBleHBvcnQgbGV0IGFjdGl2ZXZhbHVlID0gdW5kZWZpbmVkO1xuICAgIGV4cG9ydCBsZXQgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgbXVsdGlGdWxsSXRlbUNsZWFyYWJsZSA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgZ2V0U2VsZWN0aW9uTGFiZWwgPSB1bmRlZmluZWQ7XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVDbGVhcihpLCBldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZGlzcGF0Y2goJ211bHRpSXRlbUNsZWFyJywgeyBpIH0pO1xuICAgIH1cbjwvc2NyaXB0PlxuXG48c3R5bGU+XG4gICAgLm11bHRpU2VsZWN0SXRlbSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLW11bHRpSXRlbUJHLCAjZWJlZGVmKTtcbiAgICAgICAgbWFyZ2luOiB2YXIoLS1tdWx0aUl0ZW1NYXJnaW4sIDVweCA1cHggMCAwKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbXVsdGlJdGVtQm9yZGVyUmFkaXVzLCAxNnB4KTtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1tdWx0aUl0ZW1IZWlnaHQsIDMycHgpO1xuICAgICAgICBsaW5lLWhlaWdodDogdmFyKC0tbXVsdGlJdGVtSGVpZ2h0LCAzMnB4KTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICBwYWRkaW5nOiB2YXIoLS1tdWx0aUl0ZW1QYWRkaW5nLCAwIDEwcHggMCAxNXB4KTtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgIC5tdWx0aVNlbGVjdEl0ZW1fbGFiZWwge1xuICAgICAgICBtYXJnaW46IHZhcigtLW11bHRpTGFiZWxNYXJnaW4sIDAgNXB4IDAgMCk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cblxuICAgIC5tdWx0aVNlbGVjdEl0ZW06aG92ZXIsXG4gICAgLm11bHRpU2VsZWN0SXRlbS5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tdWx0aUl0ZW1BY3RpdmVCRywgIzAwNmZmZik7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdWx0aUl0ZW1BY3RpdmVDb2xvciwgI2ZmZik7XG4gICAgfVxuXG4gICAgLm11bHRpU2VsZWN0SXRlbS5kaXNhYmxlZDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLW11bHRpSXRlbURpc2FibGVkSG92ZXJCZywgI2ViZWRlZik7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdWx0aUl0ZW1EaXNhYmxlZEhvdmVyQ29sb3IsICNjMWM2Y2MpO1xuICAgIH1cblxuICAgIC5tdWx0aVNlbGVjdEl0ZW1fY2xlYXIge1xuICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tdWx0aUNsZWFyUmFkaXVzLCA1MCUpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tdWx0aUNsZWFyQkcsICM1MjYxNmYpO1xuICAgICAgICBtaW4td2lkdGg6IHZhcigtLW11bHRpQ2xlYXJXaWR0aCwgMTZweCk7XG4gICAgICAgIG1heC13aWR0aDogdmFyKC0tbXVsdGlDbGVhcldpZHRoLCAxNnB4KTtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1tdWx0aUNsZWFySGVpZ2h0LCAxNnB4KTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB0b3A6IHZhcigtLW11bHRpQ2xlYXJUb3AsIDhweCk7XG4gICAgICAgIHRleHQtYWxpZ246IHZhcigtLW11bHRpQ2xlYXJUZXh0QWxpZ24sIGNlbnRlcik7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLW11bHRpQ2xlYXJQYWRkaW5nLCAxcHgpO1xuICAgIH1cblxuICAgIC5tdWx0aVNlbGVjdEl0ZW1fY2xlYXI6aG92ZXIsXG4gICAgLmFjdGl2ZSAubXVsdGlTZWxlY3RJdGVtX2NsZWFyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbXVsdGlDbGVhckhvdmVyQkcsICNmZmYpO1xuICAgIH1cblxuICAgIC5tdWx0aVNlbGVjdEl0ZW1fY2xlYXI6aG92ZXIgc3ZnLFxuICAgIC5hY3RpdmUgLm11bHRpU2VsZWN0SXRlbV9jbGVhciBzdmcge1xuICAgICAgICBmaWxsOiB2YXIoLS1tdWx0aUNsZWFySG92ZXJGaWxsLCAjMDA2ZmZmKTtcbiAgICB9XG5cbiAgICAubXVsdGlTZWxlY3RJdGVtX2NsZWFyIHN2ZyB7XG4gICAgICAgIGZpbGw6IHZhcigtLW11bHRpQ2xlYXJGaWxsLCAjZWJlZGVmKTtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICB9XG48L3N0eWxlPlxuXG57I2VhY2ggdmFsdWUgYXMgdmFsdWUsIGl9XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm11bHRpU2VsZWN0SXRlbSB7YWN0aXZldmFsdWUgPT09IGlcbiAgICAgICAgICAgID8gJ2FjdGl2ZSdcbiAgICAgICAgICAgIDogJyd9IHtpc0Rpc2FibGVkID8gJ2Rpc2FibGVkJyA6ICcnfVwiXG4gICAgICAgIG9uOmNsaWNrPXsoZXZlbnQpID0+XG4gICAgICAgICAgICBtdWx0aUZ1bGxJdGVtQ2xlYXJhYmxlID8gaGFuZGxlQ2xlYXIoaSwgZXZlbnQpIDoge319XG4gICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGlTZWxlY3RJdGVtX2xhYmVsXCI+XG4gICAgICAgICAgICB7QGh0bWwgZ2V0U2VsZWN0aW9uTGFiZWwodmFsdWUpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgeyNpZiAhaXNEaXNhYmxlZCAmJiAhbXVsdGlGdWxsSXRlbUNsZWFyYWJsZX1cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm11bHRpU2VsZWN0SXRlbV9jbGVhclwiXG4gICAgICAgICAgICAgICAgb246Y2xpY2s9eyhldmVudCkgPT4gaGFuZGxlQ2xlYXIoaSwgZXZlbnQpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCItMiAtMiA1MCA1MFwiXG4gICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zNC45MjMsMzcuMjUxTDI0LDI2LjMyOEwxMy4wNzcsMzcuMjUxTDkuNDM2LDMzLjYxbDEwLjkyMy0xMC45MjNMOS40MzYsMTEuNzY1bDMuNjQxLTMuNjQxTDI0LDE5LjA0N0wzNC45MjMsOC4xMjQgbDMuNjQxLDMuNjQxTDI3LjY0MSwyMi42ODhMMzguNTY0LDMzLjYxTDM0LjkyMywzNy4yNTF6XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB7L2lmfVxuICAgIDwvZGl2Plxuey9lYWNofVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCSSxnQkFBZ0IsNEJBQUMsQ0FBQyxBQUNkLFVBQVUsQ0FBRSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FDdkMsTUFBTSxDQUFFLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQzNDLGFBQWEsQ0FBRSxJQUFJLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUNqRCxNQUFNLENBQUUsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FDcEMsV0FBVyxDQUFFLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQ3pDLE9BQU8sQ0FBRSxJQUFJLENBQ2IsTUFBTSxDQUFFLE9BQU8sQ0FDZixPQUFPLENBQUUsSUFBSSxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FDL0MsU0FBUyxDQUFFLElBQUksQUFDbkIsQ0FBQyxBQUVELHNCQUFzQiw0QkFBQyxDQUFDLEFBQ3BCLE1BQU0sQ0FBRSxJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUMxQyxRQUFRLENBQUUsTUFBTSxDQUNoQixhQUFhLENBQUUsUUFBUSxDQUN2QixXQUFXLENBQUUsTUFBTSxBQUN2QixDQUFDLEFBRUQsNENBQWdCLE1BQU0sQ0FDdEIsZ0JBQWdCLE9BQU8sNEJBQUMsQ0FBQyxBQUNyQixnQkFBZ0IsQ0FBRSxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUNuRCxLQUFLLENBQUUsSUFBSSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQUFDNUMsQ0FBQyxBQUVELGdCQUFnQixxQ0FBUyxNQUFNLEFBQUMsQ0FBQyxBQUM3QixVQUFVLENBQUUsSUFBSSwwQkFBMEIsQ0FBQyxRQUFRLENBQUMsQ0FDcEQsS0FBSyxDQUFFLElBQUksNkJBQTZCLENBQUMsUUFBUSxDQUFDLEFBQ3RELENBQUMsQUFFRCxzQkFBc0IsNEJBQUMsQ0FBQyxBQUNwQixhQUFhLENBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FDM0MsVUFBVSxDQUFFLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUN4QyxTQUFTLENBQUUsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FDdkMsU0FBUyxDQUFFLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQ3ZDLE1BQU0sQ0FBRSxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUNyQyxRQUFRLENBQUUsUUFBUSxDQUNsQixHQUFHLENBQUUsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQzlCLFVBQVUsQ0FBRSxJQUFJLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUM5QyxPQUFPLENBQUUsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQUFDMUMsQ0FBQyxBQUVELGtEQUFzQixNQUFNLENBQzVCLHFCQUFPLENBQUMsc0JBQXNCLGNBQUMsQ0FBQyxBQUM1QixVQUFVLENBQUUsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQUFDOUMsQ0FBQyxBQUVELG9DQUFzQixNQUFNLENBQUMsaUJBQUcsQ0FDaEMscUJBQU8sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLGNBQUMsQ0FBQyxBQUNoQyxJQUFJLENBQUUsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQUFDN0MsQ0FBQyxBQUVELG9DQUFzQixDQUFDLEdBQUcsY0FBQyxDQUFDLEFBQ3hCLElBQUksQ0FBRSxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUNwQyxjQUFjLENBQUUsR0FBRyxBQUN2QixDQUFDIn0= */"; - append_dev(document.head, style); -} - -function get_each_context$1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[4] = list[i]; - child_ctx[10] = i; - return child_ctx; -} - -// (88:8) {#if !isDisabled && !multiFullItemClearable} -function create_if_block$1(ctx) { - let div; - let svg; - let path; - let mounted; - let dispose; + if (/*showSelectedItem*/ ctx[27] && /*isClearable*/ ctx[16] && !/*isDisabled*/ ctx[10] && !/*isWaiting*/ ctx[5]) { + if (if_block4) { + if_block4.p(ctx, dirty); - function click_handler(...args) { - return /*click_handler*/ ctx[6](/*i*/ ctx[10], ...args); - } + if (dirty[0] & /*showSelectedItem, isClearable, isDisabled, isWaiting*/ 134284320) { + transition_in(if_block4, 1); + } + } else { + if_block4 = create_if_block_3$1(ctx); + if_block4.c(); + transition_in(if_block4, 1); + if_block4.m(div, t4); + } + } else if (if_block4) { + group_outros(); - const block = { - c: function create() { - div = element("div"); - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124 l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); - add_location(path, file$9, 99, 20, 3025); - attr_dev(svg, "width", "100%"); - attr_dev(svg, "height", "100%"); - attr_dev(svg, "viewBox", "-2 -2 50 50"); - attr_dev(svg, "focusable", "false"); - attr_dev(svg, "role", "presentation"); - attr_dev(svg, "class", "svelte-liu9pa"); - add_location(svg, file$9, 92, 16, 2795); - attr_dev(div, "class", "multiSelectItem_clear svelte-liu9pa"); - add_location(div, file$9, 88, 12, 2654); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, svg); - append_dev(svg, path); + transition_out(if_block4, 1, 1, () => { + if_block4 = null; + }); - if (!mounted) { - dispose = listen_dev(div, "click", click_handler, false, false, false); - mounted = true; + check_outros(); } - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - mounted = false; - dispose(); - } - }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block$1.name, - type: "if", - source: "(88:8) {#if !isDisabled && !multiFullItemClearable}", - ctx - }); + if (/*showIndicator*/ ctx[20] || /*showChevron*/ ctx[19] && !/*value*/ ctx[2] || !/*isSearchable*/ ctx[14] && !/*isDisabled*/ ctx[10] && !/*isWaiting*/ ctx[5] && (/*showSelectedItem*/ ctx[27] && !/*isClearable*/ ctx[16] || !/*showSelectedItem*/ ctx[27])) { + if (if_block5) { + if_block5.p(ctx, dirty); + } else { + if_block5 = create_if_block_1$1(ctx); + if_block5.c(); + if_block5.m(div, t5); + } + } else if (if_block5) { + if_block5.d(1); + if_block5 = null; + } - return block; -} + if (/*isWaiting*/ ctx[5]) { + if (if_block6) ; else { + if_block6 = create_if_block$1(ctx); + if_block6.c(); + if_block6.m(div, null); + } + } else if (if_block6) { + if_block6.d(1); + if_block6 = null; + } -// (77:0) {#each value as value, i} -function create_each_block$1(ctx) { - let div1; - let div0; - let raw_value = /*getSelectionLabel*/ ctx[3](/*value*/ ctx[4]) + ""; - let t0; - let t1; - let div1_class_value; - let mounted; - let dispose; - let if_block = !/*isDisabled*/ ctx[1] && !/*multiFullItemClearable*/ ctx[2] && create_if_block$1(ctx); + if (!current || dirty[0] & /*containerClasses*/ 2097152 && div_class_value !== (div_class_value = "selectContainer " + /*containerClasses*/ ctx[21] + " svelte-1ri8kk0")) { + attr_dev(div, "class", div_class_value); + } - function click_handler_1(...args) { - return /*click_handler_1*/ ctx[7](/*i*/ ctx[10], ...args); - } + if (!current || dirty[0] & /*containerStyles*/ 4096) { + attr_dev(div, "style", /*containerStyles*/ ctx[12]); + } - const block = { - c: function create() { - div1 = element("div"); - div0 = element("div"); - t0 = space(); - if (if_block) if_block.c(); - t1 = space(); - attr_dev(div0, "class", "multiSelectItem_label svelte-liu9pa"); - add_location(div0, file$9, 84, 8, 2493); - attr_dev(div1, "class", div1_class_value = "multiSelectItem " + (/*activevalue*/ ctx[0] === /*i*/ ctx[10] ? "active" : "") + " " + (/*isDisabled*/ ctx[1] ? "disabled" : "") + " svelte-liu9pa"); - add_location(div1, file$9, 77, 4, 2257); - }, - m: function mount(target, anchor) { - insert_dev(target, div1, anchor); - append_dev(div1, div0); - div0.innerHTML = raw_value; - append_dev(div1, t0); - if (if_block) if_block.m(div1, null); - append_dev(div1, t1); + if (dirty[0] & /*containerClasses, hasError*/ 2099200) { + toggle_class(div, "hasError", /*hasError*/ ctx[11]); + } - if (!mounted) { - dispose = listen_dev(div1, "click", click_handler_1, false, false, false); - mounted = true; + if (dirty[0] & /*containerClasses, isMulti*/ 2097408) { + toggle_class(div, "multiSelect", /*isMulti*/ ctx[8]); } - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - if (dirty & /*getSelectionLabel, value*/ 24 && raw_value !== (raw_value = /*getSelectionLabel*/ ctx[3](/*value*/ ctx[4]) + "")) div0.innerHTML = raw_value; - if (!/*isDisabled*/ ctx[1] && !/*multiFullItemClearable*/ ctx[2]) { - if (if_block) { - if_block.p(ctx, dirty); - } else { - if_block = create_if_block$1(ctx); - if_block.c(); - if_block.m(div1, t1); - } - } else if (if_block) { - if_block.d(1); - if_block = null; + + if (dirty[0] & /*containerClasses, isDisabled*/ 2098176) { + toggle_class(div, "disabled", /*isDisabled*/ ctx[10]); } - if (dirty & /*activevalue, isDisabled*/ 3 && div1_class_value !== (div1_class_value = "multiSelectItem " + (/*activevalue*/ ctx[0] === /*i*/ ctx[10] ? "active" : "") + " " + (/*isDisabled*/ ctx[1] ? "disabled" : "") + " svelte-liu9pa")) { - attr_dev(div1, "class", div1_class_value); + if (dirty[0] & /*containerClasses, isFocused*/ 2097154) { + toggle_class(div, "focused", /*isFocused*/ ctx[1]); } }, + i: function intro(local) { + if (current) return; + transition_in(if_block0); + transition_in(if_block1); + transition_in(if_block3); + transition_in(if_block4); + current = true; + }, + o: function outro(local) { + transition_out(if_block0); + transition_out(if_block1); + transition_out(if_block3); + transition_out(if_block4); + current = false; + }, d: function destroy(detaching) { - if (detaching) detach_dev(div1); - if (if_block) if_block.d(); + if (detaching) detach_dev(div); + if (if_block0) if_block0.d(); + if (if_block1) if_block1.d(); + if_block2.d(); + if (if_block3) if_block3.d(); + if (if_block4) if_block4.d(); + if (if_block5) if_block5.d(); + if (if_block6) if_block6.d(); + /*div_binding*/ ctx[70](null); mounted = false; - dispose(); + run_all(dispose); } }; dispatch_dev("SvelteRegisterBlock", { block, - id: create_each_block$1.name, - type: "each", - source: "(77:0) {#each value as value, i}", + id: create_fragment$8.name, + type: "component", + source: "", ctx }); return block; } -function create_fragment$9(ctx) { - let each_1_anchor; - let each_value = /*value*/ ctx[4]; - validate_each_argument(each_value); - let each_blocks = []; +async function importInternalComponent(componentName) { + let file; - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); + switch (componentName) { + case "VirtualList": + file = await Promise.resolve().then(function () { return VirtualList$1; }); + break; + case "List": + file = await Promise.resolve().then(function () { return List$1; }); + break; } - const block = { - c: function create() { - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } + return file.default; +} - each_1_anchor = empty(); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(target, anchor); - } +function instance$8($$self, $$props, $$invalidate) { + let showSelectedItem; + let placeholderText; + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Select", slots, []); + const dispatch = createEventDispatcher(); + let { container = undefined } = $$props; + let { input = undefined } = $$props; + let { Item: Item$1 = Item } = $$props; + let { Selection: Selection$1 = Selection } = $$props; + let { MultiSelection: MultiSelection$1 = MultiSelection } = $$props; + let { isMulti = false } = $$props; + let { multiFullItemClearable = false } = $$props; + let { isDisabled = false } = $$props; + let { isCreatable = false } = $$props; + let { isFocused = false } = $$props; + let { value = undefined } = $$props; + let { filterText = "" } = $$props; + let { placeholder = "Select..." } = $$props; + let { items = [] } = $$props; + let { itemFilter = (label, filterText, option) => label.toLowerCase().includes(filterText.toLowerCase()) } = $$props; + let { groupBy = undefined } = $$props; + let { groupFilter = groups => groups } = $$props; + let { isGroupHeaderSelectable = false } = $$props; - insert_dev(target, each_1_anchor, anchor); - }, - p: function update(ctx, [dirty]) { - if (dirty & /*activevalue, isDisabled, multiFullItemClearable, handleClear, getSelectionLabel, value*/ 63) { - each_value = /*value*/ ctx[4]; - validate_each_argument(each_value); - let i; + let { getGroupHeaderLabel = option => { + return option.label; + } } = $$props; - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$1(ctx, each_value, i); + let { getOptionLabel = (option, filterText) => { + return option.isCreator + ? `Create \"${filterText}\"` + : option.label; + } } = $$props; - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$1(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } + let { optionIdentifier = "value" } = $$props; + let { loadOptions = undefined } = $$props; + let { hasError = false } = $$props; + let { containerStyles = "" } = $$props; - each_blocks.length = each_value.length; - } - }, - i: noop, - o: noop, - d: function destroy(detaching) { - destroy_each(each_blocks, detaching); - if (detaching) detach_dev(each_1_anchor); - } - }; + let { getSelectionLabel = option => { + if (option) return option.label; + } } = $$props; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$9.name, - type: "component", - source: "", - ctx - }); + let { createGroupHeaderItem = groupValue => { + return { value: groupValue, label: groupValue }; + } } = $$props; - return block; -} + let { createItem = filterText => { + return { value: filterText, label: filterText }; + } } = $$props; -function instance$9($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("MultiSelection", slots, []); - const dispatch = createEventDispatcher(); - let { value = [] } = $$props; - let { activevalue = undefined } = $$props; - let { isDisabled = false } = $$props; - let { multiFullItemClearable = false } = $$props; - let { getSelectionLabel = undefined } = $$props; + let { isSearchable = true } = $$props; + let { inputStyles = "" } = $$props; + let { isClearable = true } = $$props; + let { isWaiting = false } = $$props; + let { listPlacement = "auto" } = $$props; + let { listOpen = false } = $$props; + let { list = undefined } = $$props; + let { isVirtualList = false } = $$props; + let { loadOptionsInterval = 300 } = $$props; + let { noOptionsMessage = "No options" } = $$props; + let { hideEmptyState = false } = $$props; + let { filteredItems = [] } = $$props; + let { inputAttributes = {} } = $$props; + let { listAutoWidth = true } = $$props; + let { itemHeight = 40 } = $$props; + let { Icon = undefined } = $$props; + let { iconProps = {} } = $$props; + let { showChevron = false } = $$props; + let { showIndicator = false } = $$props; + let { containerClasses = "" } = $$props; + let { indicatorSvg = undefined } = $$props; + let { ClearIcon: ClearIcon$1 = ClearIcon } = $$props; + let target; + let activeValue; + let originalItemsClone; + let prev_value; + let prev_filterText; + let prev_isFocused; + let prev_filteredItems; - function handleClear(i, event) { - event.stopPropagation(); - dispatch("multiItemClear", { i }); + async function resetFilter() { + await tick(); + $$invalidate(3, filterText = ""); } - const writable_props = [ - "value", - "activevalue", - "isDisabled", - "multiFullItemClearable", - "getSelectionLabel" - ]; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); + let getItemsHasInvoked = false; - const click_handler = (i, event) => handleClear(i, event); - const click_handler_1 = (i, event) => multiFullItemClearable ? handleClear(i, event) : {}; + const getItems = debounce( + async () => { + getItemsHasInvoked = true; + $$invalidate(5, isWaiting = true); - $$self.$$set = $$props => { - if ("value" in $$props) $$invalidate(4, value = $$props.value); - if ("activevalue" in $$props) $$invalidate(0, activevalue = $$props.activevalue); - if ("isDisabled" in $$props) $$invalidate(1, isDisabled = $$props.isDisabled); - if ("multiFullItemClearable" in $$props) $$invalidate(2, multiFullItemClearable = $$props.multiFullItemClearable); - if ("getSelectionLabel" in $$props) $$invalidate(3, getSelectionLabel = $$props.getSelectionLabel); - }; + let res = await loadOptions(filterText).catch(err => { + console.warn("svelte-select loadOptions error :>> ", err); + dispatch("error", { type: "loadOptions", details: err }); + }); - $$self.$capture_state = () => ({ - createEventDispatcher, - dispatch, - value, - activevalue, - isDisabled, - multiFullItemClearable, - getSelectionLabel, - handleClear - }); + if (res && !res.cancelled) { + if (res) { + $$invalidate(35, items = [...res]); + dispatch("loaded", { items }); + } else { + $$invalidate(35, items = []); + } - $$self.$inject_state = $$props => { - if ("value" in $$props) $$invalidate(4, value = $$props.value); - if ("activevalue" in $$props) $$invalidate(0, activevalue = $$props.activevalue); - if ("isDisabled" in $$props) $$invalidate(1, isDisabled = $$props.isDisabled); - if ("multiFullItemClearable" in $$props) $$invalidate(2, multiFullItemClearable = $$props.multiFullItemClearable); - if ("getSelectionLabel" in $$props) $$invalidate(3, getSelectionLabel = $$props.getSelectionLabel); - }; + $$invalidate(5, isWaiting = false); + $$invalidate(1, isFocused = true); + $$invalidate(36, listOpen = true); + } + }, + loadOptionsInterval + ); - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); + function setvalue() { + if (typeof value === "string") { + $$invalidate(2, value = { [optionIdentifier]: value, label: value }); + } else if (isMulti && Array.isArray(value) && value.length > 0) { + $$invalidate(2, value = value.map(item => typeof item === "string" + ? { value: item, label: item } + : item)); + } } - return [ - activevalue, - isDisabled, - multiFullItemClearable, - getSelectionLabel, - value, - handleClear, - click_handler, - click_handler_1 - ]; -} - -class MultiSelection extends SvelteComponentDev { - constructor(options) { - super(options); - if (!document.getElementById("svelte-liu9pa-style")) add_css$4(); + let _inputAttributes; - init(this, options, instance$9, create_fragment$9, safe_not_equal, { - value: 4, - activevalue: 0, - isDisabled: 1, - multiFullItemClearable: 2, - getSelectionLabel: 3 - }); + function assignInputAttributes() { + $$invalidate(26, _inputAttributes = Object.assign( + { + autocomplete: "off", + autocorrect: "off", + spellcheck: false + }, + inputAttributes + )); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "MultiSelection", - options, - id: create_fragment$9.name - }); + if (!isSearchable) { + $$invalidate(26, _inputAttributes.readonly = true, _inputAttributes); + } } - get value() { - return this.$$.ctx[4]; + function convertStringItemsToObjects() { + $$invalidate(35, items = items.map((item, index) => { + return { index, value: item, label: item }; + })); } - set value(value) { - this.$set({ value }); - flush(); + function resetFilteredItems() { + $$invalidate(38, filteredItems = JSON.parse(originalItemsClone)); } - get activevalue() { - return this.$$.ctx[0]; - } + function filterItem(item) { + let keepItem = true; - set activevalue(activevalue) { - this.$set({ activevalue }); - flush(); - } + if (isMulti && value) { + keepItem = !value.some(x => { + return x[optionIdentifier] === item[optionIdentifier]; + }); + } - get isDisabled() { - return this.$$.ctx[1]; + if (!keepItem) return false; + if (filterText.length < 1) return true; + return itemFilter(getOptionLabel(item, filterText), filterText, item); } - set isDisabled(isDisabled) { - this.$set({ isDisabled }); - flush(); + function setupFilteredItems() { + $$invalidate(38, filteredItems = loadOptions + ? filterText.length === 0 ? [] : items + : items.filter(item => filterItem(item))); } - get multiFullItemClearable() { - return this.$$.ctx[2]; - } + function filterGroupedItems() { + const groupValues = []; + const groups = {}; - set multiFullItemClearable(multiFullItemClearable) { - this.$set({ multiFullItemClearable }); - flush(); - } + filteredItems.forEach(item => { + const groupValue = groupBy(item); - get getSelectionLabel() { - return this.$$.ctx[3]; - } + if (!groupValues.includes(groupValue)) { + groupValues.push(groupValue); + groups[groupValue] = []; - set getSelectionLabel(getSelectionLabel) { - this.$set({ getSelectionLabel }); - flush(); - } -} + if (groupValue) { + groups[groupValue].push(Object.assign(createGroupHeaderItem(groupValue, item), { + id: groupValue, + isGroupHeader: true, + isSelectable: isGroupHeaderSelectable + })); + } + } -function isOutOfViewport (elem) { - const bounding = elem.getBoundingClientRect(); - const out = {}; - - out.top = bounding.top < 0; - out.left = bounding.left < 0; - out.bottom = - bounding.bottom > - (window.innerHeight || document.documentElement.clientHeight); - out.right = - bounding.right > - (window.innerWidth || document.documentElement.clientWidth); - out.any = out.top || out.left || out.bottom || out.right; - - return out; -} + groups[groupValue].push(Object.assign({ isGroupItem: !!groupValue }, item)); + }); -function debounce(func, wait, immediate) { - let timeout; + const sortedGroupedItems = []; - return function executedFunction() { - let context = this; - let args = arguments; + groupFilter(groupValues).forEach(groupValue => { + sortedGroupedItems.push(...groups[groupValue]); + }); - let later = function () { - timeout = null; - if (!immediate) func.apply(context, args); - }; + $$invalidate(38, filteredItems = sortedGroupedItems); + } - let callNow = immediate && !timeout; + function dispatchSelectedItem() { + if (isMulti) { + if (JSON.stringify(value) !== JSON.stringify(prev_value)) { + if (checkvalueForDuplicates()) { + dispatch("select", value); + } + } - clearTimeout(timeout); + return; + } - timeout = setTimeout(later, wait); + if (!prev_value || JSON.stringify(value[optionIdentifier]) !== JSON.stringify(prev_value[optionIdentifier])) { + dispatch("select", value); + } + } - if (callNow) func.apply(context, args); - }; -} + function setupFilterText() { + if (filterText.length > 0) { + $$invalidate(1, isFocused = true); + $$invalidate(36, listOpen = true); -/* src/ClearIcon.svelte generated by Svelte v3.35.0 */ + if (loadOptions) { + getItems(); + } else { + loadList(); + $$invalidate(36, listOpen = true); -const file$8 = "src/ClearIcon.svelte"; + if (isMulti) { + $$invalidate(25, activeValue = undefined); + } + } + } else { + setList([]); + } -function create_fragment$8(ctx) { - let svg; - let path; + if (list) { + list.$set({ filterText }); + } + } - const block = { - c: function create() { - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "fill", "currentColor"); - attr_dev(path, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124\n l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); - add_location(path, file$8, 7, 4, 118); - attr_dev(svg, "width", "100%"); - attr_dev(svg, "height", "100%"); - attr_dev(svg, "viewBox", "-2 -2 50 50"); - attr_dev(svg, "focusable", "false"); - attr_dev(svg, "role", "presentation"); - add_location(svg, file$8, 0, 0, 0); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, svg, anchor); - append_dev(svg, path); - }, - p: noop, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(svg); + function setupFocus() { + if (isFocused || listOpen) { + handleFocus(); + } else { + resetFilter(); + if (input) input.blur(); } - }; + } - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$8.name, - type: "component", - source: "", - ctx - }); + let { VirtualList = null } = $$props; + let { List = null } = $$props; - return block; -} + function setupFilteredItem() { + let _filteredItems = [...filteredItems]; -function instance$8($$self, $$props) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("ClearIcon", slots, []); - const writable_props = []; + if (isCreatable && filterText) { + const itemToCreate = createItem(filterText); + itemToCreate.isCreator = true; - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); + const existingItemWithFilterValue = _filteredItems.find(item => { + return item[optionIdentifier] === itemToCreate[optionIdentifier]; + }); - return []; -} + let existingSelectionWithFilterValue; -class ClearIcon extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$8, create_fragment$8, safe_not_equal, {}); + if (value) { + if (isMulti) { + existingSelectionWithFilterValue = value.find(selection => { + return selection[optionIdentifier] === itemToCreate[optionIdentifier]; + }); + } else if (value[optionIdentifier] === itemToCreate[optionIdentifier]) { + existingSelectionWithFilterValue = value; + } + } - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "ClearIcon", - options, - id: create_fragment$8.name - }); - } -} + if (!existingItemWithFilterValue && !existingSelectionWithFilterValue) { + _filteredItems = [..._filteredItems, itemToCreate]; + } + } -/* src/Select.svelte generated by Svelte v3.35.0 */ + setList(_filteredItems); + } -const { Object: Object_1, console: console_1, document: document_1 } = globals; -const file$7 = "src/Select.svelte"; + beforeUpdate(() => { + prev_value = value; + $$invalidate(63, prev_filterText = filterText); + $$invalidate(64, prev_isFocused = isFocused); + $$invalidate(65, prev_filteredItems = filteredItems); + }); -function add_css$3() { - var style = element("style"); - style.id = "svelte-1ri8kk0-style"; - style.textContent = ".selectContainer.svelte-1ri8kk0.svelte-1ri8kk0{--padding:0 16px;border:var(--border, 1px solid #d8dbdf);border-radius:var(--borderRadius, 3px);height:var(--height, 42px);position:relative;display:flex;align-items:center;padding:var(--padding);background:var(--background, #fff);margin:var(--margin, 0)}.selectContainer.svelte-1ri8kk0 input.svelte-1ri8kk0{cursor:default;border:none;color:var(--inputColor, #3f4f5f);height:var(--height, 42px);line-height:var(--height, 42px);padding:var(--inputPadding, var(--padding));width:100%;background:transparent;font-size:var(--inputFontSize, 14px);letter-spacing:var(--inputLetterSpacing, -0.08px);position:absolute;left:var(--inputLeft, 0);margin:var(--inputMargin, 0)}.selectContainer.svelte-1ri8kk0 input.svelte-1ri8kk0::placeholder{color:var(--placeholderColor, #78848f);opacity:var(--placeholderOpacity, 1)}.selectContainer.svelte-1ri8kk0 input.svelte-1ri8kk0:focus{outline:none}.selectContainer.svelte-1ri8kk0.svelte-1ri8kk0:hover{border-color:var(--borderHoverColor, #b2b8bf)}.selectContainer.focused.svelte-1ri8kk0.svelte-1ri8kk0{border-color:var(--borderFocusColor, #006fe8)}.selectContainer.disabled.svelte-1ri8kk0.svelte-1ri8kk0{background:var(--disabledBackground, #ebedef);border-color:var(--disabledBorderColor, #ebedef);color:var(--disabledColor, #c1c6cc)}.selectContainer.disabled.svelte-1ri8kk0 input.svelte-1ri8kk0::placeholder{color:var(--disabledPlaceholderColor, #c1c6cc);opacity:var(--disabledPlaceholderOpacity, 1)}.selectedItem.svelte-1ri8kk0.svelte-1ri8kk0{line-height:var(--height, 42px);height:var(--height, 42px);overflow-x:hidden;padding:var(--selectedItemPadding, 0 20px 0 0)}.selectedItem.svelte-1ri8kk0.svelte-1ri8kk0:focus{outline:none}.clearSelect.svelte-1ri8kk0.svelte-1ri8kk0{position:absolute;right:var(--clearSelectRight, 10px);top:var(--clearSelectTop, 11px);bottom:var(--clearSelectBottom, 11px);width:var(--clearSelectWidth, 20px);color:var(--clearSelectColor, #c5cacf);flex:none !important}.clearSelect.svelte-1ri8kk0.svelte-1ri8kk0:hover{color:var(--clearSelectHoverColor, #2c3e50)}.selectContainer.focused.svelte-1ri8kk0 .clearSelect.svelte-1ri8kk0{color:var(--clearSelectFocusColor, #3f4f5f)}.indicator.svelte-1ri8kk0.svelte-1ri8kk0{position:absolute;right:var(--indicatorRight, 10px);top:var(--indicatorTop, 11px);width:var(--indicatorWidth, 20px);height:var(--indicatorHeight, 20px);color:var(--indicatorColor, #c5cacf)}.indicator.svelte-1ri8kk0 svg.svelte-1ri8kk0{display:inline-block;fill:var(--indicatorFill, currentcolor);line-height:1;stroke:var(--indicatorStroke, currentcolor);stroke-width:0}.spinner.svelte-1ri8kk0.svelte-1ri8kk0{position:absolute;right:var(--spinnerRight, 10px);top:var(--spinnerLeft, 11px);width:var(--spinnerWidth, 20px);height:var(--spinnerHeight, 20px);color:var(--spinnerColor, #51ce6c);animation:svelte-1ri8kk0-rotate 0.75s linear infinite}.spinner_icon.svelte-1ri8kk0.svelte-1ri8kk0{display:block;height:100%;transform-origin:center center;width:100%;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;-webkit-transform:none}.spinner_path.svelte-1ri8kk0.svelte-1ri8kk0{stroke-dasharray:90;stroke-linecap:round}.multiSelect.svelte-1ri8kk0.svelte-1ri8kk0{display:flex;padding:var(--multiSelectPadding, 0 35px 0 16px);height:auto;flex-wrap:wrap;align-items:stretch}.multiSelect.svelte-1ri8kk0>.svelte-1ri8kk0{flex:1 1 50px}.selectContainer.multiSelect.svelte-1ri8kk0 input.svelte-1ri8kk0{padding:var(--multiSelectInputPadding, 0);position:relative;margin:var(--multiSelectInputMargin, 0)}.hasError.svelte-1ri8kk0.svelte-1ri8kk0{border:var(--errorBorder, 1px solid #ff2d55);background:var(--errorBackground, #fff)}@keyframes svelte-1ri8kk0-rotate{100%{transform:rotate(360deg)}}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0LnN2ZWx0ZSIsInNvdXJjZXMiOlsiU2VsZWN0LnN2ZWx0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8c2NyaXB0PlxuICAgIGltcG9ydCB7XG4gICAgICAgIGJlZm9yZVVwZGF0ZSxcbiAgICAgICAgY3JlYXRlRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBvbkRlc3Ryb3ksXG4gICAgICAgIG9uTW91bnQsXG4gICAgICAgIHRpY2ssXG4gICAgfSBmcm9tICdzdmVsdGUnO1xuICAgIGltcG9ydCBMaXN0IGZyb20gJy4vTGlzdC5zdmVsdGUnO1xuICAgIGltcG9ydCBJdGVtQ29tcG9uZW50IGZyb20gJy4vSXRlbS5zdmVsdGUnO1xuICAgIGltcG9ydCBTZWxlY3Rpb25Db21wb25lbnQgZnJvbSAnLi9TZWxlY3Rpb24uc3ZlbHRlJztcbiAgICBpbXBvcnQgTXVsdGlTZWxlY3Rpb25Db21wb25lbnQgZnJvbSAnLi9NdWx0aVNlbGVjdGlvbi5zdmVsdGUnO1xuICAgIGltcG9ydCBpc091dE9mVmlld3BvcnQgZnJvbSAnLi91dGlscy9pc091dE9mVmlld3BvcnQnO1xuICAgIGltcG9ydCBkZWJvdW5jZSBmcm9tICcuL3V0aWxzL2RlYm91bmNlJztcbiAgICBpbXBvcnQgRGVmYXVsdENsZWFySWNvbiBmcm9tICcuL0NsZWFySWNvbi5zdmVsdGUnO1xuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBjcmVhdGVFdmVudERpc3BhdGNoZXIoKTtcbiAgICBleHBvcnQgbGV0IGNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICBleHBvcnQgbGV0IGlucHV0ID0gdW5kZWZpbmVkO1xuICAgIGV4cG9ydCBsZXQgSXRlbSA9IEl0ZW1Db21wb25lbnQ7XG4gICAgZXhwb3J0IGxldCBTZWxlY3Rpb24gPSBTZWxlY3Rpb25Db21wb25lbnQ7XG4gICAgZXhwb3J0IGxldCBNdWx0aVNlbGVjdGlvbiA9IE11bHRpU2VsZWN0aW9uQ29tcG9uZW50O1xuICAgIGV4cG9ydCBsZXQgaXNNdWx0aSA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgbXVsdGlGdWxsSXRlbUNsZWFyYWJsZSA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgaXNDcmVhdGFibGUgPSBmYWxzZTtcbiAgICBleHBvcnQgbGV0IGlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgZXhwb3J0IGxldCBmaWx0ZXJUZXh0ID0gJyc7XG4gICAgZXhwb3J0IGxldCBwbGFjZWhvbGRlciA9ICdTZWxlY3QuLi4nO1xuICAgIGV4cG9ydCBsZXQgaXRlbXMgPSBbXTtcbiAgICBleHBvcnQgbGV0IGl0ZW1GaWx0ZXIgPSAobGFiZWwsIGZpbHRlclRleHQsIG9wdGlvbikgPT5cbiAgICAgICAgbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCkpO1xuICAgIGV4cG9ydCBsZXQgZ3JvdXBCeSA9IHVuZGVmaW5lZDtcbiAgICBleHBvcnQgbGV0IGdyb3VwRmlsdGVyID0gKGdyb3VwcykgPT4gZ3JvdXBzO1xuICAgIGV4cG9ydCBsZXQgaXNHcm91cEhlYWRlclNlbGVjdGFibGUgPSBmYWxzZTtcbiAgICBleHBvcnQgbGV0IGdldEdyb3VwSGVhZGVyTGFiZWwgPSAob3B0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBvcHRpb24ubGFiZWw7XG4gICAgfTtcbiAgICBleHBvcnQgbGV0IGdldE9wdGlvbkxhYmVsID0gKG9wdGlvbiwgZmlsdGVyVGV4dCkgPT4ge1xuICAgICAgICByZXR1cm4gb3B0aW9uLmlzQ3JlYXRvciA/IGBDcmVhdGUgXFxcIiR7ZmlsdGVyVGV4dH1cXFwiYCA6IG9wdGlvbi5sYWJlbDtcbiAgICB9O1xuICAgIGV4cG9ydCBsZXQgb3B0aW9uSWRlbnRpZmllciA9ICd2YWx1ZSc7XG4gICAgZXhwb3J0IGxldCBsb2FkT3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICBleHBvcnQgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgZXhwb3J0IGxldCBjb250YWluZXJTdHlsZXMgPSAnJztcbiAgICBleHBvcnQgbGV0IGdldFNlbGVjdGlvbkxhYmVsID0gKG9wdGlvbikgPT4ge1xuICAgICAgICBpZiAob3B0aW9uKSByZXR1cm4gb3B0aW9uLmxhYmVsO1xuICAgIH07XG5cbiAgICBleHBvcnQgbGV0IGNyZWF0ZUdyb3VwSGVhZGVySXRlbSA9IChncm91cFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogZ3JvdXBWYWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiBncm91cFZhbHVlLFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBleHBvcnQgbGV0IGNyZWF0ZUl0ZW0gPSAoZmlsdGVyVGV4dCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IGZpbHRlclRleHQsXG4gICAgICAgICAgICBsYWJlbDogZmlsdGVyVGV4dCxcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgZXhwb3J0IGxldCBpc1NlYXJjaGFibGUgPSB0cnVlO1xuICAgIGV4cG9ydCBsZXQgaW5wdXRTdHlsZXMgPSAnJztcbiAgICBleHBvcnQgbGV0IGlzQ2xlYXJhYmxlID0gdHJ1ZTtcbiAgICBleHBvcnQgbGV0IGlzV2FpdGluZyA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgbGlzdFBsYWNlbWVudCA9ICdhdXRvJztcbiAgICBleHBvcnQgbGV0IGxpc3RPcGVuID0gZmFsc2U7XG4gICAgZXhwb3J0IGxldCBsaXN0ID0gdW5kZWZpbmVkO1xuICAgIGV4cG9ydCBsZXQgaXNWaXJ0dWFsTGlzdCA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgbG9hZE9wdGlvbnNJbnRlcnZhbCA9IDMwMDtcbiAgICBleHBvcnQgbGV0IG5vT3B0aW9uc01lc3NhZ2UgPSAnTm8gb3B0aW9ucyc7XG4gICAgZXhwb3J0IGxldCBoaWRlRW1wdHlTdGF0ZSA9IGZhbHNlO1xuICAgIGV4cG9ydCBsZXQgZmlsdGVyZWRJdGVtcyA9IFtdO1xuICAgIGV4cG9ydCBsZXQgaW5wdXRBdHRyaWJ1dGVzID0ge307XG4gICAgZXhwb3J0IGxldCBsaXN0QXV0b1dpZHRoID0gdHJ1ZTtcbiAgICBleHBvcnQgbGV0IGl0ZW1IZWlnaHQgPSA0MDtcbiAgICBleHBvcnQgbGV0IEljb24gPSB1bmRlZmluZWQ7XG4gICAgZXhwb3J0IGxldCBpY29uUHJvcHMgPSB7fTtcbiAgICBleHBvcnQgbGV0IHNob3dDaGV2cm9uID0gZmFsc2U7XG4gICAgZXhwb3J0IGxldCBzaG93SW5kaWNhdG9yID0gZmFsc2U7XG4gICAgZXhwb3J0IGxldCBjb250YWluZXJDbGFzc2VzID0gJyc7XG4gICAgZXhwb3J0IGxldCBpbmRpY2F0b3JTdmcgPSB1bmRlZmluZWQ7XG4gICAgZXhwb3J0IGxldCBDbGVhckljb24gPSBEZWZhdWx0Q2xlYXJJY29uO1xuXG4gICAgbGV0IHRhcmdldDtcbiAgICBsZXQgYWN0aXZldmFsdWU7XG4gICAgbGV0IG9yaWdpbmFsSXRlbXNDbG9uZTtcbiAgICBsZXQgVmlydHVhbExpc3Q7XG4gICAgbGV0IHByZXZfdmFsdWU7XG4gICAgbGV0IHByZXZfZmlsdGVyVGV4dDtcbiAgICBsZXQgcHJldl9pc0ZvY3VzZWQ7XG4gICAgbGV0IHByZXZfZmlsdGVyZWRJdGVtcztcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlc2V0RmlsdGVyKCkge1xuICAgICAgICBhd2FpdCB0aWNrKCk7XG4gICAgICAgIGZpbHRlclRleHQgPSAnJztcbiAgICB9XG5cbiAgICBsZXQgZ2V0SXRlbXNIYXNJbnZva2VkID0gZmFsc2U7XG4gICAgY29uc3QgZ2V0SXRlbXMgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XG4gICAgICAgIGdldEl0ZW1zSGFzSW52b2tlZCA9IHRydWU7XG4gICAgICAgIGlzV2FpdGluZyA9IHRydWU7XG5cbiAgICAgICAgbGV0IHJlcyA9IGF3YWl0IGxvYWRPcHRpb25zKGZpbHRlclRleHQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybignc3ZlbHRlLXNlbGVjdCBsb2FkT3B0aW9ucyBlcnJvciA6Pj4gJywgZXJyKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKCdlcnJvcicsIHsgdHlwZTogJ2xvYWRPcHRpb25zJywgZGV0YWlsczogZXJyIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzICYmICFyZXMuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgaXRlbXMgPSBbLi4ucmVzXTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCgnbG9hZGVkJywgeyBpdGVtcyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbXMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXNXYWl0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGlzdE9wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSwgbG9hZE9wdGlvbnNJbnRlcnZhbCk7XG5cbiAgICAkOiB1cGRhdGV2YWx1ZURpc3BsYXkoaXRlbXMpO1xuXG4gICAgZnVuY3Rpb24gc2V0dmFsdWUoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBbb3B0aW9uSWRlbnRpZmllcl06IHZhbHVlLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBpc011bHRpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgICAgICAgdmFsdWUubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IHsgdmFsdWU6IGl0ZW0sIGxhYmVsOiBpdGVtIH0gOiBpdGVtXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IF9pbnB1dEF0dHJpYnV0ZXM7XG4gICAgZnVuY3Rpb24gYXNzaWduSW5wdXRBdHRyaWJ1dGVzKCkge1xuICAgICAgICBfaW5wdXRBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU6ICdvZmYnLFxuICAgICAgICAgICAgICAgIGF1dG9jb3JyZWN0OiAnb2ZmJyxcbiAgICAgICAgICAgICAgICBzcGVsbGNoZWNrOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnB1dEF0dHJpYnV0ZXNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWlzU2VhcmNoYWJsZSkge1xuICAgICAgICAgICAgX2lucHV0QXR0cmlidXRlcy5yZWFkb25seSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0U3RyaW5nSXRlbXNUb09iamVjdHMoKSB7XG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICBsYWJlbDogaXRlbSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2V0RmlsdGVyZWRJdGVtcygpIHtcbiAgICAgICAgZmlsdGVyZWRJdGVtcyA9IEpTT04ucGFyc2Uob3JpZ2luYWxJdGVtc0Nsb25lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaWx0ZXJJdGVtKGl0ZW0pIHtcbiAgICAgICAgbGV0IGtlZXBJdGVtID0gdHJ1ZTtcblxuICAgICAgICBpZiAoaXNNdWx0aSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAga2VlcEl0ZW0gPSAhdmFsdWUuc29tZSgoeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB4W29wdGlvbklkZW50aWZpZXJdID09PSBpdGVtW29wdGlvbklkZW50aWZpZXJdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtlZXBJdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChmaWx0ZXJUZXh0Lmxlbmd0aCA8IDEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gaXRlbUZpbHRlcihnZXRPcHRpb25MYWJlbChpdGVtLCBmaWx0ZXJUZXh0KSwgZmlsdGVyVGV4dCwgaXRlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0dXBGaWx0ZXJlZEl0ZW1zKCkge1xuICAgICAgICBmaWx0ZXJlZEl0ZW1zID0gbG9hZE9wdGlvbnNcbiAgICAgICAgICAgID8gZmlsdGVyVGV4dC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgOiBpdGVtc1xuICAgICAgICAgICAgOiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGZpbHRlckl0ZW0oaXRlbSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbHRlckdyb3VwZWRJdGVtcygpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0ge307XG5cbiAgICAgICAgZmlsdGVyZWRJdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBncm91cFZhbHVlID0gZ3JvdXBCeShpdGVtKTtcblxuICAgICAgICAgICAgaWYgKCFncm91cFZhbHVlcy5pbmNsdWRlcyhncm91cFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGdyb3VwVmFsdWVzLnB1c2goZ3JvdXBWYWx1ZSk7XG4gICAgICAgICAgICAgICAgZ3JvdXBzW2dyb3VwVmFsdWVdID0gW107XG5cbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBncm91cHNbZ3JvdXBWYWx1ZV0ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY3JlYXRlR3JvdXBIZWFkZXJJdGVtKGdyb3VwVmFsdWUsIGl0ZW0pLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGdyb3VwVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHcm91cEhlYWRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGFibGU6IGlzR3JvdXBIZWFkZXJTZWxlY3RhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdyb3Vwc1tncm91cFZhbHVlXS5wdXNoKFxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oeyBpc0dyb3VwSXRlbTogISFncm91cFZhbHVlIH0sIGl0ZW0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzb3J0ZWRHcm91cGVkSXRlbXMgPSBbXTtcblxuICAgICAgICBncm91cEZpbHRlcihncm91cFZhbHVlcykuZm9yRWFjaCgoZ3JvdXBWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgc29ydGVkR3JvdXBlZEl0ZW1zLnB1c2goLi4uZ3JvdXBzW2dyb3VwVmFsdWVdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsdGVyZWRJdGVtcyA9IHNvcnRlZEdyb3VwZWRJdGVtcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaXNwYXRjaFNlbGVjdGVkSXRlbSgpIHtcbiAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgIT09XG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocHJldl92YWx1ZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja3ZhbHVlRm9yRHVwbGljYXRlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKCdzZWxlY3QnLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXByZXZfdmFsdWUgfHxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhbHVlW29wdGlvbklkZW50aWZpZXJdKSAhPT1cbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwcmV2X3ZhbHVlW29wdGlvbklkZW50aWZpZXJdKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKCdzZWxlY3QnLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXR1cEZpbHRlclRleHQoKSB7XG4gICAgICAgIGlmIChmaWx0ZXJUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlzRm9jdXNlZCA9IHRydWU7XG4gICAgICAgICAgICBsaXN0T3BlbiA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChsb2FkT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGdldEl0ZW1zKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvYWRMaXN0KCk7XG4gICAgICAgICAgICAgICAgbGlzdE9wZW4gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZldmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0TGlzdChbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgICAgbGlzdC4kc2V0KHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJUZXh0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXR1cEZvY3VzKCkge1xuICAgICAgICBpZiAoaXNGb2N1c2VkIHx8IGxpc3RPcGVuKSB7XG4gICAgICAgICAgICBoYW5kbGVGb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRGaWx0ZXIoKTtcbiAgICAgICAgICAgIGlmIChpbnB1dCkgaW5wdXQuYmx1cigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IFZpcnR1YWxMaXN0Q29tcG9uZW50O1xuICAgIGFzeW5jIGZ1bmN0aW9uIHNldHVwVmlydHVhbExpc3QoKSB7XG4gICAgICAgIFZpcnR1YWxMaXN0Q29tcG9uZW50ID0gYXdhaXQgaW1wb3J0KCcuL1ZpcnR1YWxMaXN0LnN2ZWx0ZScpO1xuICAgICAgICBWaXJ0dWFsTGlzdCA9IFZpcnR1YWxMaXN0Q29tcG9uZW50LmRlZmF1bHQ7XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBpZiAodmFsdWUpIHNldHZhbHVlKCk7XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBpZiAobm9PcHRpb25zTWVzc2FnZSAmJiBsaXN0KSBsaXN0LiRzZXQoeyBub09wdGlvbnNNZXNzYWdlIH0pO1xuICAgIH1cblxuICAgICQ6IHtcbiAgICAgICAgaWYgKGlucHV0QXR0cmlidXRlcyB8fCAhaXNTZWFyY2hhYmxlKSBhc3NpZ25JbnB1dEF0dHJpYnV0ZXMoKTtcbiAgICB9XG5cbiAgICAkOiB7XG4gICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwICYmIHR5cGVvZiBpdGVtc1swXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnZlcnRTdHJpbmdJdGVtc1RvT2JqZWN0cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvYWRPcHRpb25zICYmIGZpbHRlclRleHQubGVuZ3RoID09PSAwICYmIG9yaWdpbmFsSXRlbXNDbG9uZSkge1xuICAgICAgICAgICAgcmVzZXRGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXR1cEZpbHRlcmVkSXRlbXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgICAgICBmaWx0ZXJHcm91cGVkSXRlbXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICQ6IHtcbiAgICAgICAgaWYgKGlzTXVsdGkgJiYgdmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY2hlY2t2YWx1ZUZvckR1cGxpY2F0ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICQ6IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBkaXNwYXRjaFNlbGVjdGVkSXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICBpZiAobGlzdE9wZW4pIHtcbiAgICAgICAgICAgICAgICBsb2FkTGlzdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMaXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkOiB7XG4gICAgICAgIGlmIChpc0ZvY3VzZWQgIT09IHByZXZfaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICBzZXR1cEZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkOiB7XG4gICAgICAgIGlmIChmaWx0ZXJUZXh0ICE9PSBwcmV2X2ZpbHRlclRleHQpIHtcbiAgICAgICAgICAgIHNldHVwRmlsdGVyVGV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0dXBGaWx0ZXJlZEl0ZW0oKSB7XG4gICAgICAgIGxldCBfZmlsdGVyZWRJdGVtcyA9IFsuLi5maWx0ZXJlZEl0ZW1zXTtcblxuICAgICAgICBpZiAoaXNDcmVhdGFibGUgJiYgZmlsdGVyVGV4dCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbVRvQ3JlYXRlID0gY3JlYXRlSXRlbShmaWx0ZXJUZXh0KTtcbiAgICAgICAgICAgIGl0ZW1Ub0NyZWF0ZS5pc0NyZWF0b3IgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0l0ZW1XaXRoRmlsdGVyVmFsdWUgPSBfZmlsdGVyZWRJdGVtcy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgaXRlbVtvcHRpb25JZGVudGlmaWVyXSA9PT0gaXRlbVRvQ3JlYXRlW29wdGlvbklkZW50aWZpZXJdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmdTZWxlY3Rpb25XaXRoRmlsdGVyVmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc011bHRpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nU2VsZWN0aW9uV2l0aEZpbHRlclZhbHVlID0gdmFsdWUuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25bb3B0aW9uSWRlbnRpZmllcl0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Ub0NyZWF0ZVtvcHRpb25JZGVudGlmaWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbb3B0aW9uSWRlbnRpZmllcl0gPT09XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1Ub0NyZWF0ZVtvcHRpb25JZGVudGlmaWVyXVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1NlbGVjdGlvbldpdGhGaWx0ZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFleGlzdGluZ0l0ZW1XaXRoRmlsdGVyVmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhZXhpc3RpbmdTZWxlY3Rpb25XaXRoRmlsdGVyVmFsdWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIF9maWx0ZXJlZEl0ZW1zID0gWy4uLl9maWx0ZXJlZEl0ZW1zLCBpdGVtVG9DcmVhdGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0TGlzdChfZmlsdGVyZWRJdGVtcyk7XG4gICAgfVxuXG4gICAgJDoge1xuICAgICAgICBpZiAocHJldl9maWx0ZXJlZEl0ZW1zICE9PSBmaWx0ZXJlZEl0ZW1zKSB7XG4gICAgICAgICAgICBzZXR1cEZpbHRlcmVkSXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgJDogc2hvd1NlbGVjdGVkSXRlbSA9IHZhbHVlICYmIGZpbHRlclRleHQubGVuZ3RoID09PSAwO1xuICAgICQ6IHBsYWNlaG9sZGVyVGV4dCA9IHZhbHVlID8gJycgOiBwbGFjZWhvbGRlcjtcblxuICAgIGJlZm9yZVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHByZXZfdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcHJldl9maWx0ZXJUZXh0ID0gZmlsdGVyVGV4dDtcbiAgICAgICAgcHJldl9pc0ZvY3VzZWQgPSBpc0ZvY3VzZWQ7XG4gICAgICAgIHByZXZfZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjaGVja3ZhbHVlRm9yRHVwbGljYXRlcygpIHtcbiAgICAgICAgbGV0IG5vRHVwbGljYXRlcyA9IHRydWU7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgaWRzID0gW107XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBbXTtcblxuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpZHMuaW5jbHVkZXModmFsW29wdGlvbklkZW50aWZpZXJdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaCh2YWxbb3B0aW9uSWRlbnRpZmllcl0pO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVWYWx1ZXMucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vRHVwbGljYXRlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW5vRHVwbGljYXRlcykgdmFsdWUgPSB1bmlxdWVWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vRHVwbGljYXRlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaW5kSXRlbShzZWxlY3Rpb24pIHtcbiAgICAgICAgbGV0IG1hdGNoVG8gPSBzZWxlY3Rpb25cbiAgICAgICAgICAgID8gc2VsZWN0aW9uW29wdGlvbklkZW50aWZpZXJdXG4gICAgICAgICAgICA6IHZhbHVlW29wdGlvbklkZW50aWZpZXJdO1xuICAgICAgICByZXR1cm4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbVtvcHRpb25JZGVudGlmaWVyXSA9PT0gbWF0Y2hUbyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRldmFsdWVEaXNwbGF5KGl0ZW1zKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFpdGVtcyB8fFxuICAgICAgICAgICAgaXRlbXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBpdGVtcy5zb21lKChpdGVtKSA9PiB0eXBlb2YgaXRlbSAhPT0gJ29iamVjdCcpXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXZhbHVlIHx8XG4gICAgICAgICAgICAoaXNNdWx0aVxuICAgICAgICAgICAgICAgID8gdmFsdWUuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uKSA9PiAhc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb25bb3B0aW9uSWRlbnRpZmllcl1cbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6ICF2YWx1ZVtvcHRpb25JZGVudGlmaWVyXSlcbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoXG4gICAgICAgICAgICAgICAgKHNlbGVjdGlvbikgPT4gZmluZEl0ZW0oc2VsZWN0aW9uKSB8fCBzZWxlY3Rpb25cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZpbmRJdGVtKCkgfHwgdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBzZXRMaXN0KGl0ZW1zKSB7XG4gICAgICAgIGF3YWl0IHRpY2soKTtcbiAgICAgICAgaWYgKCFsaXN0T3BlbikgcmV0dXJuO1xuICAgICAgICBpZiAobGlzdCkgcmV0dXJuIGxpc3QuJHNldCh7IGl0ZW1zIH0pO1xuICAgICAgICBpZiAobG9hZE9wdGlvbnMgJiYgZ2V0SXRlbXNIYXNJbnZva2VkICYmIGl0ZW1zLmxlbmd0aCA+IDApIGxvYWRMaXN0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlTXVsdGlJdGVtQ2xlYXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBkZXRhaWwgfSA9IGV2ZW50O1xuICAgICAgICBjb25zdCBpdGVtVG9SZW1vdmUgPVxuICAgICAgICAgICAgdmFsdWVbZGV0YWlsID8gZGV0YWlsLmkgOiB2YWx1ZS5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gIT09IGl0ZW1Ub1JlbW92ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGF0Y2goJ2NsZWFyJywgaXRlbVRvUmVtb3ZlKTtcblxuICAgICAgICBnZXRQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldFBvc2l0aW9uKCkge1xuICAgICAgICBhd2FpdCB0aWNrKCk7XG4gICAgICAgIGlmICghdGFyZ2V0IHx8ICFjb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29uc3QgeyB0b3AsIGhlaWdodCwgd2lkdGggfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICB0YXJnZXQuc3R5bGVbJ21pbi13aWR0aCddID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICB0YXJnZXQuc3R5bGUud2lkdGggPSBgJHtsaXN0QXV0b1dpZHRoID8gJ2F1dG8nIDogJzEwMCUnfWA7XG4gICAgICAgIHRhcmdldC5zdHlsZS5sZWZ0ID0gJzAnO1xuXG4gICAgICAgIGlmIChsaXN0UGxhY2VtZW50ID09PSAndG9wJykge1xuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLmJvdHRvbSA9IGAke2hlaWdodCArIDV9cHhgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLnRvcCA9IGAke2hlaWdodCArIDV9cHhgO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgICAgIGlmIChsaXN0UGxhY2VtZW50ID09PSAnYXV0bycgJiYgaXNPdXRPZlZpZXdwb3J0KHRhcmdldCkuYm90dG9tKSB7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUudG9wID0gYGA7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUuYm90dG9tID0gYCR7aGVpZ2h0ICsgNX1weGA7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgICAgICBpZiAoIWlzRm9jdXNlZCkgcmV0dXJuO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGxpc3RPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhY3RpdmV2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBsaXN0T3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgYWN0aXZldmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIGlmICghbGlzdE9wZW4pIGlzRm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTXVsdGkgfHwgZmlsdGVyVGV4dC5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGlzTXVsdGkgJiYgdmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVNdWx0aUl0ZW1DbGVhcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZXZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFjdGl2ZXZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZXZhbHVlID09PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmV2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmV2YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5sZW5ndGggPiBhY3RpdmV2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWN0aXZldmFsdWUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgICAgICBpZiAobGlzdCkgbGlzdC4kc2V0KHsgaG92ZXJJdGVtSW5kZXg6IC0xIH0pO1xuICAgICAgICAgICAgICAgIGlmICghaXNNdWx0aSB8fCBmaWx0ZXJUZXh0Lmxlbmd0aCA+IDApIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmV2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZXZhbHVlID0gdmFsdWUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5sZW5ndGggPiBhY3RpdmV2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICBhY3RpdmV2YWx1ZSAhPT0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmV2YWx1ZSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgICAgIGlmIChsaXN0KSBsaXN0LiRzZXQoeyBob3Zlckl0ZW1JbmRleDogLTEgfSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhaXNNdWx0aSB8fFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUZXh0Lmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZldmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChhY3RpdmV2YWx1ZSA9PT0gdmFsdWUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmV2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZXZhbHVlIDwgdmFsdWUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmV2YWx1ZSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUZvY3VzKCkge1xuICAgICAgICBpc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICBpZiAoaW5wdXQpIGlucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdCgpIHtcbiAgICAgICAgcmVzZXRGaWx0ZXIoKTtcbiAgICAgICAgYWN0aXZldmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKCFsaXN0KSByZXR1cm47XG4gICAgICAgIGxpc3QuJGRlc3Ryb3koKTtcbiAgICAgICAgbGlzdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICBpZiAodGFyZ2V0LnBhcmVudE5vZGUpIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldCk7XG4gICAgICAgIHRhcmdldCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBsaXN0ID0gbGlzdDtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0NsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGV2ZW50VGFyZ2V0ID1cbiAgICAgICAgICAgIGV2ZW50LnBhdGggJiYgZXZlbnQucGF0aC5sZW5ndGggPiAwID8gZXZlbnQucGF0aFswXSA6IGV2ZW50LnRhcmdldDtcbiAgICAgICAgaWYgKGNvbnRhaW5lci5jb250YWlucyhldmVudFRhcmdldCkpIHJldHVybjtcbiAgICAgICAgaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIGxpc3RPcGVuID0gZmFsc2U7XG4gICAgICAgIGFjdGl2ZXZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5wdXQpIGlucHV0LmJsdXIoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVDbGljaygpIHtcbiAgICAgICAgaWYgKGlzRGlzYWJsZWQpIHJldHVybjtcbiAgICAgICAgaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgbGlzdE9wZW4gPSAhbGlzdE9wZW47XG4gICAgfVxuXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUNsZWFyKCkge1xuICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGlzdE9wZW4gPSBmYWxzZTtcbiAgICAgICAgZGlzcGF0Y2goJ2NsZWFyJywgdmFsdWUpO1xuICAgICAgICBoYW5kbGVGb2N1cygpO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRMaXN0KCkge1xuICAgICAgICBhd2FpdCB0aWNrKCk7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgbGlzdCkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChpc1ZpcnR1YWxMaXN0ICYmICFWaXJ0dWFsTGlzdENvbXBvbmVudCkgYXdhaXQgc2V0dXBWaXJ0dWFsTGlzdCgpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBJdGVtLFxuICAgICAgICAgICAgZmlsdGVyVGV4dCxcbiAgICAgICAgICAgIG9wdGlvbklkZW50aWZpZXIsXG4gICAgICAgICAgICBub09wdGlvbnNNZXNzYWdlLFxuICAgICAgICAgICAgaGlkZUVtcHR5U3RhdGUsXG4gICAgICAgICAgICBpc1ZpcnR1YWxMaXN0LFxuICAgICAgICAgICAgVmlydHVhbExpc3QsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGlzTXVsdGksXG4gICAgICAgICAgICBnZXRHcm91cEhlYWRlckxhYmVsLFxuICAgICAgICAgICAgaXRlbXM6IGZpbHRlcmVkSXRlbXMsXG4gICAgICAgICAgICBpdGVtSGVpZ2h0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnZXRPcHRpb25MYWJlbCkge1xuICAgICAgICAgICAgZGF0YS5nZXRPcHRpb25MYWJlbCA9IGdldE9wdGlvbkxhYmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldCkgdGFyZ2V0LnJlbW92ZSgpO1xuICAgICAgICB0YXJnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldC5zdHlsZSwge1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAnei1pbmRleCc6IDIsXG4gICAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGxpc3QpIGxpc3QuJGRlc3Ryb3koKTtcbiAgICAgICAgbGlzdCA9IGxpc3Q7XG5cbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICBpZiAoY29udGFpbmVyKSBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFyZ2V0KTtcblxuICAgICAgICBsaXN0ID0gbmV3IExpc3Qoe1xuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgcHJvcHM6IGRhdGEsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxpc3QuJG9uKCdpdGVtU2VsZWN0ZWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGV0YWlsIH0gPSBldmVudDtcblxuICAgICAgICAgICAgaWYgKGRldGFpbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBkZXRhaWwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzR3JvdXBIZWFkZXIgfHwgaXRlbS5pc1NlbGVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLmNvbmNhdChbaXRlbV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbaXRlbV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNldEZpbHRlcigpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZXZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxpc3QuJG9uKCdpdGVtQ3JlYXRlZCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBkZXRhaWwgfSA9IGV2ZW50O1xuICAgICAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IFtdO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gWy4uLnZhbHVlLCBjcmVhdGVJdGVtKGRldGFpbCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGNyZWF0ZUl0ZW0oZGV0YWlsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGlzcGF0Y2goJ2l0ZW1DcmVhdGVkJywgZGV0YWlsKTtcbiAgICAgICAgICAgIGZpbHRlclRleHQgPSAnJztcbiAgICAgICAgICAgIGxpc3RPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICBhY3RpdmV2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJlc2V0RmlsdGVyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxpc3QuJG9uKCdjbG9zZUxpc3QnLCAoKSA9PiB7XG4gICAgICAgICAgICBsaXN0T3BlbiA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICAobGlzdCA9IGxpc3QpLCAodGFyZ2V0ID0gdGFyZ2V0KTtcbiAgICAgICAgZ2V0UG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICBvbk1vdW50KCgpID0+IHtcbiAgICAgICAgaWYgKGlzRm9jdXNlZCkgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgaWYgKGxpc3RPcGVuKSBsb2FkTGlzdCgpO1xuXG4gICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBvcmlnaW5hbEl0ZW1zQ2xvbmUgPSBKU09OLnN0cmluZ2lmeShpdGVtcyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG9uRGVzdHJveSgoKSA9PiB7XG4gICAgICAgIHJlbW92ZUxpc3QoKTtcbiAgICB9KTtcbjwvc2NyaXB0PlxuXG48c3R5bGU+XG4gICAgLnNlbGVjdENvbnRhaW5lciB7XG4gICAgICAgIC0tcGFkZGluZzogMCAxNnB4O1xuXG4gICAgICAgIGJvcmRlcjogdmFyKC0tYm9yZGVyLCAxcHggc29saWQgI2Q4ZGJkZik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclJhZGl1cywgM3B4KTtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQsIDQycHgpO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLXBhZGRpbmcpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kLCAjZmZmKTtcbiAgICAgICAgbWFyZ2luOiB2YXIoLS1tYXJnaW4sIDApO1xuICAgIH1cblxuICAgIC5zZWxlY3RDb250YWluZXIgaW5wdXQge1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlucHV0Q29sb3IsICMzZjRmNWYpO1xuICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCwgNDJweCk7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1oZWlnaHQsIDQycHgpO1xuICAgICAgICBwYWRkaW5nOiB2YXIoLS1pbnB1dFBhZGRpbmcsIHZhcigtLXBhZGRpbmcpKTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICBmb250LXNpemU6IHZhcigtLWlucHV0Rm9udFNpemUsIDE0cHgpO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogdmFyKC0taW5wdXRMZXR0ZXJTcGFjaW5nLCAtMC4wOHB4KTtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiB2YXIoLS1pbnB1dExlZnQsIDApO1xuICAgICAgICBtYXJnaW46IHZhcigtLWlucHV0TWFyZ2luLCAwKTtcbiAgICB9XG5cbiAgICAuc2VsZWN0Q29udGFpbmVyIGlucHV0OjpwbGFjZWhvbGRlciB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1wbGFjZWhvbGRlckNvbG9yLCAjNzg4NDhmKTtcbiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGxhY2Vob2xkZXJPcGFjaXR5LCAxKTtcbiAgICB9XG5cbiAgICAuc2VsZWN0Q29udGFpbmVyIGlucHV0OmZvY3VzIHtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICB9XG5cbiAgICAuc2VsZWN0Q29udGFpbmVyOmhvdmVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXJIb3ZlckNvbG9yLCAjYjJiOGJmKTtcbiAgICB9XG5cbiAgICAuc2VsZWN0Q29udGFpbmVyLmZvY3VzZWQge1xuICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWJvcmRlckZvY3VzQ29sb3IsICMwMDZmZTgpO1xuICAgIH1cblxuICAgIC5zZWxlY3RDb250YWluZXIuZGlzYWJsZWQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXNhYmxlZEJhY2tncm91bmQsICNlYmVkZWYpO1xuICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWRpc2FibGVkQm9yZGVyQ29sb3IsICNlYmVkZWYpO1xuICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWRDb2xvciwgI2MxYzZjYyk7XG4gICAgfVxuXG4gICAgLnNlbGVjdENvbnRhaW5lci5kaXNhYmxlZCBpbnB1dDo6cGxhY2Vob2xkZXIge1xuICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWRQbGFjZWhvbGRlckNvbG9yLCAjYzFjNmNjKTtcbiAgICAgICAgb3BhY2l0eTogdmFyKC0tZGlzYWJsZWRQbGFjZWhvbGRlck9wYWNpdHksIDEpO1xuICAgIH1cblxuICAgIC5zZWxlY3RlZEl0ZW0ge1xuICAgICAgICBsaW5lLWhlaWdodDogdmFyKC0taGVpZ2h0LCA0MnB4KTtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQsIDQycHgpO1xuICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLXNlbGVjdGVkSXRlbVBhZGRpbmcsIDAgMjBweCAwIDApO1xuICAgIH1cblxuICAgIC5zZWxlY3RlZEl0ZW06Zm9jdXMge1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgIH1cblxuICAgIC5jbGVhclNlbGVjdCB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IHZhcigtLWNsZWFyU2VsZWN0UmlnaHQsIDEwcHgpO1xuICAgICAgICB0b3A6IHZhcigtLWNsZWFyU2VsZWN0VG9wLCAxMXB4KTtcbiAgICAgICAgYm90dG9tOiB2YXIoLS1jbGVhclNlbGVjdEJvdHRvbSwgMTFweCk7XG4gICAgICAgIHdpZHRoOiB2YXIoLS1jbGVhclNlbGVjdFdpZHRoLCAyMHB4KTtcbiAgICAgICAgY29sb3I6IHZhcigtLWNsZWFyU2VsZWN0Q29sb3IsICNjNWNhY2YpO1xuICAgICAgICBmbGV4OiBub25lICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLmNsZWFyU2VsZWN0OmhvdmVyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWNsZWFyU2VsZWN0SG92ZXJDb2xvciwgIzJjM2U1MCk7XG4gICAgfVxuXG4gICAgLnNlbGVjdENvbnRhaW5lci5mb2N1c2VkIC5jbGVhclNlbGVjdCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1jbGVhclNlbGVjdEZvY3VzQ29sb3IsICMzZjRmNWYpO1xuICAgIH1cblxuICAgIC5pbmRpY2F0b3Ige1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiB2YXIoLS1pbmRpY2F0b3JSaWdodCwgMTBweCk7XG4gICAgICAgIHRvcDogdmFyKC0taW5kaWNhdG9yVG9wLCAxMXB4KTtcbiAgICAgICAgd2lkdGg6IHZhcigtLWluZGljYXRvcldpZHRoLCAyMHB4KTtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1pbmRpY2F0b3JIZWlnaHQsIDIwcHgpO1xuICAgICAgICBjb2xvcjogdmFyKC0taW5kaWNhdG9yQ29sb3IsICNjNWNhY2YpO1xuICAgIH1cblxuICAgIC5pbmRpY2F0b3Igc3ZnIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBmaWxsOiB2YXIoLS1pbmRpY2F0b3JGaWxsLCBjdXJyZW50Y29sb3IpO1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgc3Ryb2tlOiB2YXIoLS1pbmRpY2F0b3JTdHJva2UsIGN1cnJlbnRjb2xvcik7XG4gICAgICAgIHN0cm9rZS13aWR0aDogMDtcbiAgICB9XG5cbiAgICAuc3Bpbm5lciB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IHZhcigtLXNwaW5uZXJSaWdodCwgMTBweCk7XG4gICAgICAgIHRvcDogdmFyKC0tc3Bpbm5lckxlZnQsIDExcHgpO1xuICAgICAgICB3aWR0aDogdmFyKC0tc3Bpbm5lcldpZHRoLCAyMHB4KTtcbiAgICAgICAgaGVpZ2h0OiB2YXIoLS1zcGlubmVySGVpZ2h0LCAyMHB4KTtcbiAgICAgICAgY29sb3I6IHZhcigtLXNwaW5uZXJDb2xvciwgIzUxY2U2Yyk7XG4gICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDAuNzVzIGxpbmVhciBpbmZpbml0ZTtcbiAgICB9XG5cbiAgICAuc3Bpbm5lcl9pY29uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lO1xuICAgIH1cblxuICAgIC5zcGlubmVyX3BhdGgge1xuICAgICAgICBzdHJva2UtZGFzaGFycmF5OiA5MDtcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICAgIH1cblxuICAgIC5tdWx0aVNlbGVjdCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLW11bHRpU2VsZWN0UGFkZGluZywgMCAzNXB4IDAgMTZweCk7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgICB9XG5cbiAgICAubXVsdGlTZWxlY3QgPiAqIHtcbiAgICAgICAgZmxleDogMSAxIDUwcHg7XG4gICAgfVxuXG4gICAgLnNlbGVjdENvbnRhaW5lci5tdWx0aVNlbGVjdCBpbnB1dCB7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLW11bHRpU2VsZWN0SW5wdXRQYWRkaW5nLCAwKTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtYXJnaW46IHZhcigtLW11bHRpU2VsZWN0SW5wdXRNYXJnaW4sIDApO1xuICAgIH1cblxuICAgIC5oYXNFcnJvciB7XG4gICAgICAgIGJvcmRlcjogdmFyKC0tZXJyb3JCb3JkZXIsIDFweCBzb2xpZCAjZmYyZDU1KTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZXJyb3JCYWNrZ3JvdW5kLCAjZmZmKTtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIHJvdGF0ZSB7XG4gICAgICAgIDEwMCUge1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgfVxuICAgIH1cbjwvc3R5bGU+XG5cbjxzdmVsdGU6d2luZG93XG4gICAgb246Y2xpY2s9e2hhbmRsZVdpbmRvd0NsaWNrfVxuICAgIG9uOmtleWRvd249e2hhbmRsZUtleURvd259XG4gICAgb246cmVzaXplPXtnZXRQb3NpdGlvbn1cbi8+XG5cbjxkaXZcbiAgICBjbGFzcz1cInNlbGVjdENvbnRhaW5lciB7Y29udGFpbmVyQ2xhc3Nlc31cIlxuICAgIGNsYXNzOmhhc0Vycm9yXG4gICAgY2xhc3M6bXVsdGlTZWxlY3Q9e2lzTXVsdGl9XG4gICAgY2xhc3M6ZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgY2xhc3M6Zm9jdXNlZD17aXNGb2N1c2VkfVxuICAgIHN0eWxlPXtjb250YWluZXJTdHlsZXN9XG4gICAgb246Y2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgIGJpbmQ6dGhpcz17Y29udGFpbmVyfVxuPlxuICAgIHsjaWYgSWNvbn1cbiAgICAgICAgPHN2ZWx0ZTpjb21wb25lbnQgdGhpcz17SWNvbn0gey4uLmljb25Qcm9wc30gLz5cbiAgICB7L2lmfVxuXG4gICAgeyNpZiBpc011bHRpICYmIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDB9XG4gICAgICAgIDxzdmVsdGU6Y29tcG9uZW50XG4gICAgICAgICAgICB0aGlzPXtNdWx0aVNlbGVjdGlvbn1cbiAgICAgICAgICAgIHt2YWx1ZX1cbiAgICAgICAgICAgIHtnZXRTZWxlY3Rpb25MYWJlbH1cbiAgICAgICAgICAgIHthY3RpdmV2YWx1ZX1cbiAgICAgICAgICAgIHtpc0Rpc2FibGVkfVxuICAgICAgICAgICAge211bHRpRnVsbEl0ZW1DbGVhcmFibGV9XG4gICAgICAgICAgICBvbjptdWx0aUl0ZW1DbGVhcj17aGFuZGxlTXVsdGlJdGVtQ2xlYXJ9XG4gICAgICAgICAgICBvbjpmb2N1cz17aGFuZGxlRm9jdXN9XG4gICAgICAgIC8+XG4gICAgey9pZn1cblxuICAgIHsjaWYgaXNEaXNhYmxlZH1cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB7Li4uX2lucHV0QXR0cmlidXRlc31cbiAgICAgICAgICAgIGJpbmQ6dGhpcz17aW5wdXR9XG4gICAgICAgICAgICBvbjpmb2N1cz17aGFuZGxlRm9jdXN9XG4gICAgICAgICAgICBiaW5kOnZhbHVlPXtmaWx0ZXJUZXh0fVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyVGV4dH1cbiAgICAgICAgICAgIHN0eWxlPXtpbnB1dFN0eWxlc31cbiAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgIC8+XG4gICAgezplbHNlfVxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHsuLi5faW5wdXRBdHRyaWJ1dGVzfVxuICAgICAgICAgICAgYmluZDp0aGlzPXtpbnB1dH1cbiAgICAgICAgICAgIG9uOmZvY3VzPXtoYW5kbGVGb2N1c31cbiAgICAgICAgICAgIGJpbmQ6dmFsdWU9e2ZpbHRlclRleHR9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJUZXh0fVxuICAgICAgICAgICAgc3R5bGU9e2lucHV0U3R5bGVzfVxuICAgICAgICAvPlxuICAgIHsvaWZ9XG5cbiAgICB7I2lmICFpc011bHRpICYmIHNob3dTZWxlY3RlZEl0ZW19XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZEl0ZW1cIiBvbjpmb2N1cz17aGFuZGxlRm9jdXN9PlxuICAgICAgICAgICAgPHN2ZWx0ZTpjb21wb25lbnRcbiAgICAgICAgICAgICAgICB0aGlzPXtTZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgaXRlbT17dmFsdWV9XG4gICAgICAgICAgICAgICAge2dldFNlbGVjdGlvbkxhYmVsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgey9pZn1cblxuICAgIHsjaWYgc2hvd1NlbGVjdGVkSXRlbSAmJiBpc0NsZWFyYWJsZSAmJiAhaXNEaXNhYmxlZCAmJiAhaXNXYWl0aW5nfVxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJTZWxlY3RcIiBvbjpjbGlja3xwcmV2ZW50RGVmYXVsdD17aGFuZGxlQ2xlYXJ9PlxuICAgICAgICAgICAgPHN2ZWx0ZTpjb21wb25lbnQgdGhpcz17Q2xlYXJJY29ufSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICB7L2lmfVxuXG4gICAgeyNpZiBzaG93SW5kaWNhdG9yIHx8IChzaG93Q2hldnJvbiAmJiAhdmFsdWUpIHx8ICghaXNTZWFyY2hhYmxlICYmICFpc0Rpc2FibGVkICYmICFpc1dhaXRpbmcgJiYgKChzaG93U2VsZWN0ZWRJdGVtICYmICFpc0NsZWFyYWJsZSkgfHwgIXNob3dTZWxlY3RlZEl0ZW0pKX1cbiAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvclwiPlxuICAgICAgICAgICAgeyNpZiBpbmRpY2F0b3JTdmd9XG4gICAgICAgICAgICAgICAge0BodG1sIGluZGljYXRvclN2Z31cbiAgICAgICAgICAgIHs6ZWxzZX1cbiAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC41MTYgNy41NDhjMC40MzYtMC40NDYgMS4wNDMtMC40ODEgMS41NzYgMGwzLjkwOCAzLjc0N1xuICAgICAgICAgIDMuOTA4LTMuNzQ3YzAuNTMzLTAuNDgxIDEuMTQxLTAuNDQ2IDEuNTc0IDAgMC40MzYgMC40NDUgMC40MDggMS4xOTcgMFxuICAgICAgICAgIDEuNjE1LTAuNDA2IDAuNDE4LTQuNjk1IDQuNTAyLTQuNjk1IDQuNTAyLTAuMjE3IDAuMjIzLTAuNTAyXG4gICAgICAgICAgMC4zMzUtMC43ODcgMC4zMzVzLTAuNTctMC4xMTItMC43ODktMC4zMzVjMFxuICAgICAgICAgIDAtNC4yODctNC4wODQtNC42OTUtNC41MDJzLTAuNDM2LTEuMTcgMC0xLjYxNXpcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgey9pZn1cbiAgICAgICAgPC9kaXY+XG4gICAgey9pZn1cblxuICAgIHsjaWYgaXNXYWl0aW5nfVxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInNwaW5uZXJfaWNvblwiIHZpZXdCb3g9XCIyNSAyNSA1MCA1MFwiPlxuICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcGlubmVyX3BhdGhcIlxuICAgICAgICAgICAgICAgICAgICBjeD1cIjUwXCJcbiAgICAgICAgICAgICAgICAgICAgY3k9XCI1MFwiXG4gICAgICAgICAgICAgICAgICAgIHI9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1taXRlcmxpbWl0PVwiMTBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgey9pZn1cbjwvZGl2PlxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXF1QkksZ0JBQWdCLDhCQUFDLENBQUMsQUFDZCxTQUFTLENBQUUsTUFBTSxDQUVqQixNQUFNLENBQUUsSUFBSSxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FDeEMsYUFBYSxDQUFFLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUN2QyxNQUFNLENBQUUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQzNCLFFBQVEsQ0FBRSxRQUFRLENBQ2xCLE9BQU8sQ0FBRSxJQUFJLENBQ2IsV0FBVyxDQUFFLE1BQU0sQ0FDbkIsT0FBTyxDQUFFLElBQUksU0FBUyxDQUFDLENBQ3ZCLFVBQVUsQ0FBRSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FDbkMsTUFBTSxDQUFFLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQyxBQUM1QixDQUFDLEFBRUQsK0JBQWdCLENBQUMsS0FBSyxlQUFDLENBQUMsQUFDcEIsTUFBTSxDQUFFLE9BQU8sQ0FDZixNQUFNLENBQUUsSUFBSSxDQUNaLEtBQUssQ0FBRSxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FDakMsTUFBTSxDQUFFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUMzQixXQUFXLENBQUUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ2hDLE9BQU8sQ0FBRSxJQUFJLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FDNUMsS0FBSyxDQUFFLElBQUksQ0FDWCxVQUFVLENBQUUsV0FBVyxDQUN2QixTQUFTLENBQUUsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQ3JDLGNBQWMsQ0FBRSxJQUFJLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUNsRCxRQUFRLENBQUUsUUFBUSxDQUNsQixJQUFJLENBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQ3pCLE1BQU0sQ0FBRSxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsQUFDakMsQ0FBQyxBQUVELCtCQUFnQixDQUFDLG9CQUFLLGFBQWEsQUFBQyxDQUFDLEFBQ2pDLEtBQUssQ0FBRSxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUN2QyxPQUFPLENBQUUsSUFBSSxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQUFDekMsQ0FBQyxBQUVELCtCQUFnQixDQUFDLG9CQUFLLE1BQU0sQUFBQyxDQUFDLEFBQzFCLE9BQU8sQ0FBRSxJQUFJLEFBQ2pCLENBQUMsQUFFRCw4Q0FBZ0IsTUFBTSxBQUFDLENBQUMsQUFDcEIsWUFBWSxDQUFFLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLEFBQ2xELENBQUMsQUFFRCxnQkFBZ0IsUUFBUSw4QkFBQyxDQUFDLEFBQ3RCLFlBQVksQ0FBRSxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxBQUNsRCxDQUFDLEFBRUQsZ0JBQWdCLFNBQVMsOEJBQUMsQ0FBQyxBQUN2QixVQUFVLENBQUUsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FDOUMsWUFBWSxDQUFFLElBQUkscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQ2pELEtBQUssQ0FBRSxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsQUFDeEMsQ0FBQyxBQUVELGdCQUFnQix3QkFBUyxDQUFDLG9CQUFLLGFBQWEsQUFBQyxDQUFDLEFBQzFDLEtBQUssQ0FBRSxJQUFJLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxDQUMvQyxPQUFPLENBQUUsSUFBSSw0QkFBNEIsQ0FBQyxFQUFFLENBQUMsQUFDakQsQ0FBQyxBQUVELGFBQWEsOEJBQUMsQ0FBQyxBQUNYLFdBQVcsQ0FBRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDaEMsTUFBTSxDQUFFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUMzQixVQUFVLENBQUUsTUFBTSxDQUNsQixPQUFPLENBQUUsSUFBSSxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQUFDbkQsQ0FBQyxBQUVELDJDQUFhLE1BQU0sQUFBQyxDQUFDLEFBQ2pCLE9BQU8sQ0FBRSxJQUFJLEFBQ2pCLENBQUMsQUFFRCxZQUFZLDhCQUFDLENBQUMsQUFDVixRQUFRLENBQUUsUUFBUSxDQUNsQixLQUFLLENBQUUsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FDcEMsR0FBRyxDQUFFLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQ2hDLE1BQU0sQ0FBRSxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUN0QyxLQUFLLENBQUUsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FDcEMsS0FBSyxDQUFFLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQ3ZDLElBQUksQ0FBRSxJQUFJLENBQUMsVUFBVSxBQUN6QixDQUFDLEFBRUQsMENBQVksTUFBTSxBQUFDLENBQUMsQUFDaEIsS0FBSyxDQUFFLElBQUksdUJBQXVCLENBQUMsUUFBUSxDQUFDLEFBQ2hELENBQUMsQUFFRCxnQkFBZ0IsdUJBQVEsQ0FBQyxZQUFZLGVBQUMsQ0FBQyxBQUNuQyxLQUFLLENBQUUsSUFBSSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQUFDaEQsQ0FBQyxBQUVELFVBQVUsOEJBQUMsQ0FBQyxBQUNSLFFBQVEsQ0FBRSxRQUFRLENBQ2xCLEtBQUssQ0FBRSxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUNsQyxHQUFHLENBQUUsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQzlCLEtBQUssQ0FBRSxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUNsQyxNQUFNLENBQUUsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FDcEMsS0FBSyxDQUFFLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEFBQ3pDLENBQUMsQUFFRCx5QkFBVSxDQUFDLEdBQUcsZUFBQyxDQUFDLEFBQ1osT0FBTyxDQUFFLFlBQVksQ0FDckIsSUFBSSxDQUFFLElBQUksZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUN4QyxXQUFXLENBQUUsQ0FBQyxDQUNkLE1BQU0sQ0FBRSxJQUFJLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUM1QyxZQUFZLENBQUUsQ0FBQyxBQUNuQixDQUFDLEFBRUQsUUFBUSw4QkFBQyxDQUFDLEFBQ04sUUFBUSxDQUFFLFFBQVEsQ0FDbEIsS0FBSyxDQUFFLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUNoQyxHQUFHLENBQUUsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQzdCLEtBQUssQ0FBRSxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FDaEMsTUFBTSxDQUFFLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUNsQyxLQUFLLENBQUUsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQ25DLFNBQVMsQ0FBRSxxQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxBQUMzQyxDQUFDLEFBRUQsYUFBYSw4QkFBQyxDQUFDLEFBQ1gsT0FBTyxDQUFFLEtBQUssQ0FDZCxNQUFNLENBQUUsSUFBSSxDQUNaLGdCQUFnQixDQUFFLE1BQU0sQ0FBQyxNQUFNLENBQy9CLEtBQUssQ0FBRSxJQUFJLENBQ1gsUUFBUSxDQUFFLFFBQVEsQ0FDbEIsR0FBRyxDQUFFLENBQUMsQ0FDTixNQUFNLENBQUUsQ0FBQyxDQUNULElBQUksQ0FBRSxDQUFDLENBQ1AsS0FBSyxDQUFFLENBQUMsQ0FDUixNQUFNLENBQUUsSUFBSSxDQUNaLGlCQUFpQixDQUFFLElBQUksQUFDM0IsQ0FBQyxBQUVELGFBQWEsOEJBQUMsQ0FBQyxBQUNYLGdCQUFnQixDQUFFLEVBQUUsQ0FDcEIsY0FBYyxDQUFFLEtBQUssQUFDekIsQ0FBQyxBQUVELFlBQVksOEJBQUMsQ0FBQyxBQUNWLE9BQU8sQ0FBRSxJQUFJLENBQ2IsT0FBTyxDQUFFLElBQUksb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQ2pELE1BQU0sQ0FBRSxJQUFJLENBQ1osU0FBUyxDQUFFLElBQUksQ0FDZixXQUFXLENBQUUsT0FBTyxBQUN4QixDQUFDLEFBRUQsMkJBQVksQ0FBRyxlQUFFLENBQUMsQUFDZCxJQUFJLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEFBQ2xCLENBQUMsQUFFRCxnQkFBZ0IsMkJBQVksQ0FBQyxLQUFLLGVBQUMsQ0FBQyxBQUNoQyxPQUFPLENBQUUsSUFBSSx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsQ0FDMUMsUUFBUSxDQUFFLFFBQVEsQ0FDbEIsTUFBTSxDQUFFLElBQUksd0JBQXdCLENBQUMsRUFBRSxDQUFDLEFBQzVDLENBQUMsQUFFRCxTQUFTLDhCQUFDLENBQUMsQUFDUCxNQUFNLENBQUUsSUFBSSxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FDN0MsVUFBVSxDQUFFLElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLEFBQzVDLENBQUMsQUFFRCxXQUFXLHFCQUFPLENBQUMsQUFDZixJQUFJLEFBQUMsQ0FBQyxBQUNGLFNBQVMsQ0FBRSxPQUFPLE1BQU0sQ0FBQyxBQUM3QixDQUFDLEFBQ0wsQ0FBQyJ9 */"; - append_dev(document_1.head, style); -} + function checkvalueForDuplicates() { + let noDuplicates = true; -// (921:4) {#if Icon} -function create_if_block_7(ctx) { - let switch_instance; - let switch_instance_anchor; - let current; - const switch_instance_spread_levels = [/*iconProps*/ ctx[18]]; - var switch_value = /*Icon*/ ctx[17]; + if (value) { + const ids = []; + const uniqueValues = []; - function switch_props(ctx) { - let switch_instance_props = {}; + value.forEach(val => { + if (!ids.includes(val[optionIdentifier])) { + ids.push(val[optionIdentifier]); + uniqueValues.push(val); + } else { + noDuplicates = false; + } + }); - for (let i = 0; i < switch_instance_spread_levels.length; i += 1) { - switch_instance_props = assign(switch_instance_props, switch_instance_spread_levels[i]); + if (!noDuplicates) $$invalidate(2, value = uniqueValues); } - return { - props: switch_instance_props, - $$inline: true - }; + return noDuplicates; } - if (switch_value) { - switch_instance = new switch_value(switch_props()); + function findItem(selection) { + let matchTo = selection + ? selection[optionIdentifier] + : value[optionIdentifier]; + + return items.find(item => item[optionIdentifier] === matchTo); } - const block = { - c: function create() { - if (switch_instance) create_component(switch_instance.$$.fragment); - switch_instance_anchor = empty(); - }, - m: function mount(target, anchor) { - if (switch_instance) { - mount_component(switch_instance, target, anchor); - } + function updateValueDisplay(items) { + if (!items || items.length === 0 || items.some(item => typeof item !== "object")) return; - insert_dev(target, switch_instance_anchor, anchor); - current = true; - }, - p: function update(ctx, dirty) { - const switch_instance_changes = (dirty[0] & /*iconProps*/ 262144) - ? get_spread_update(switch_instance_spread_levels, [get_spread_object(/*iconProps*/ ctx[18])]) - : {}; + if (!value || (isMulti + ? value.some(selection => !selection || !selection[optionIdentifier]) + : !value[optionIdentifier])) return; - if (switch_value !== (switch_value = /*Icon*/ ctx[17])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; + if (Array.isArray(value)) { + $$invalidate(2, value = value.map(selection => findItem(selection) || selection)); + } else { + $$invalidate(2, value = findItem() || value); + } + } - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); + async function setList(items) { + await tick(); + if (!listOpen) return; + if (list) return list.$set({ items }); + if (loadOptions && getItemsHasInvoked && items.length > 0) loadList(); + } - check_outros(); - } + function handleMultiItemClear(event) { + const { detail } = event; + const itemToRemove = value[detail ? detail.i : value.length - 1]; - if (switch_value) { - switch_instance = new switch_value(switch_props()); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); - } else { - switch_instance = null; - } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(switch_instance_anchor); - if (switch_instance) destroy_component(switch_instance, detaching); + if (value.length === 1) { + $$invalidate(2, value = undefined); + } else { + $$invalidate(2, value = value.filter(item => { + return item !== itemToRemove; + })); } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_7.name, - type: "if", - source: "(921:4) {#if Icon}", - ctx - }); - return block; -} + dispatch("clear", itemToRemove); + getPosition(); + } -// (925:4) {#if isMulti && value && value.length > 0} -function create_if_block_6(ctx) { - let switch_instance; - let switch_instance_anchor; - let current; - var switch_value = /*MultiSelection*/ ctx[7]; + async function getPosition() { + await tick(); + if (!target || !container) return; + const { top, height, width } = container.getBoundingClientRect(); + target.style["min-width"] = `${width}px`; + target.style.width = `${listAutoWidth ? "auto" : "100%"}`; + target.style.left = "0"; - function switch_props(ctx) { - return { - props: { - value: /*value*/ ctx[2], - getSelectionLabel: /*getSelectionLabel*/ ctx[13], - activevalue: /*activevalue*/ ctx[25], - isDisabled: /*isDisabled*/ ctx[10], - multiFullItemClearable: /*multiFullItemClearable*/ ctx[9] - }, - $$inline: true - }; - } + if (listPlacement === "top") { + target.style.bottom = `${height + 5}px`; + } else { + target.style.top = `${height + 5}px`; + } - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - switch_instance.$on("multiItemClear", /*handleMultiItemClear*/ ctx[29]); - switch_instance.$on("focus", /*handleFocus*/ ctx[32]); - } + target = target; - const block = { - c: function create() { - if (switch_instance) create_component(switch_instance.$$.fragment); - switch_instance_anchor = empty(); - }, - m: function mount(target, anchor) { - if (switch_instance) { - mount_component(switch_instance, target, anchor); - } + if (listPlacement === "auto" && isOutOfViewport(target).bottom) { + target.style.top = ``; + target.style.bottom = `${height + 5}px`; + } - insert_dev(target, switch_instance_anchor, anchor); - current = true; - }, - p: function update(ctx, dirty) { - const switch_instance_changes = {}; - if (dirty[0] & /*value*/ 4) switch_instance_changes.value = /*value*/ ctx[2]; - if (dirty[0] & /*getSelectionLabel*/ 8192) switch_instance_changes.getSelectionLabel = /*getSelectionLabel*/ ctx[13]; - if (dirty[0] & /*activevalue*/ 33554432) switch_instance_changes.activevalue = /*activevalue*/ ctx[25]; - if (dirty[0] & /*isDisabled*/ 1024) switch_instance_changes.isDisabled = /*isDisabled*/ ctx[10]; - if (dirty[0] & /*multiFullItemClearable*/ 512) switch_instance_changes.multiFullItemClearable = /*multiFullItemClearable*/ ctx[9]; + target.style.visibility = ""; + } - if (switch_value !== (switch_value = /*MultiSelection*/ ctx[7])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; + function handleKeyDown(e) { + if (!isFocused) return; - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); + switch (e.key) { + case "ArrowDown": + e.preventDefault(); + $$invalidate(36, listOpen = true); + $$invalidate(25, activeValue = undefined); + break; + case "ArrowUp": + e.preventDefault(); + $$invalidate(36, listOpen = true); + $$invalidate(25, activeValue = undefined); + break; + case "Tab": + if (!listOpen) $$invalidate(1, isFocused = false); + break; + case "Backspace": + if (!isMulti || filterText.length > 0) return; + if (isMulti && value && value.length > 0) { + handleMultiItemClear(activeValue !== undefined + ? activeValue + : value.length - 1); - check_outros(); + if (activeValue === 0 || activeValue === undefined) break; + $$invalidate(25, activeValue = value.length > activeValue ? activeValue - 1 : undefined); } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - switch_instance.$on("multiItemClear", /*handleMultiItemClear*/ ctx[29]); - switch_instance.$on("focus", /*handleFocus*/ ctx[32]); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); - } else { - switch_instance = null; + break; + case "ArrowLeft": + if (list) list.$set({ hoverItemIndex: -1 }); + if (!isMulti || filterText.length > 0) return; + if (activeValue === undefined) { + $$invalidate(25, activeValue = value.length - 1); + } else if (value.length > activeValue && activeValue !== 0) { + $$invalidate(25, activeValue -= 1); } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(switch_instance_anchor); - if (switch_instance) destroy_component(switch_instance, detaching); + break; + case "ArrowRight": + if (list) list.$set({ hoverItemIndex: -1 }); + if (!isMulti || filterText.length > 0 || activeValue === undefined) return; + if (activeValue === value.length - 1) { + $$invalidate(25, activeValue = undefined); + } else if (activeValue < value.length - 1) { + $$invalidate(25, activeValue += 1); + } + break; } - }; + } - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_6.name, - type: "if", - source: "(925:4) {#if isMulti && value && value.length > 0}", - ctx - }); + function handleFocus() { + $$invalidate(1, isFocused = true); + if (input) input.focus(); + } - return block; -} + function removeList() { + resetFilter(); + $$invalidate(25, activeValue = undefined); + if (!list) return; + list.$destroy(); + $$invalidate(37, list = undefined); + if (!target) return; + if (target.parentNode) target.parentNode.removeChild(target); + target = undefined; + $$invalidate(37, list); + target = target; + } -// (948:4) {:else} -function create_else_block_1(ctx) { - let input_1; - let mounted; - let dispose; + function handleWindowClick(event) { + if (!container) return; - let input_1_levels = [ - /*_inputAttributes*/ ctx[26], - { placeholder: /*placeholderText*/ ctx[28] }, - { style: /*inputStyles*/ ctx[15] } - ]; + const eventTarget = event.path && event.path.length > 0 + ? event.path[0] + : event.target; - let input_1_data = {}; + if (container.contains(eventTarget)) return; + $$invalidate(1, isFocused = false); + $$invalidate(36, listOpen = false); + $$invalidate(25, activeValue = undefined); + if (input) input.blur(); + } - for (let i = 0; i < input_1_levels.length; i += 1) { - input_1_data = assign(input_1_data, input_1_levels[i]); + function handleClick() { + if (isDisabled) return; + $$invalidate(1, isFocused = true); + $$invalidate(36, listOpen = !listOpen); } - const block = { - c: function create() { - input_1 = element("input"); - set_attributes(input_1, input_1_data); - toggle_class(input_1, "svelte-1ri8kk0", true); - add_location(input_1, file$7, 948, 8, 25542); - }, - m: function mount(target, anchor) { - insert_dev(target, input_1, anchor); - /*input_1_binding_1*/ ctx[66](input_1); - set_input_value(input_1, /*filterText*/ ctx[3]); + function handleClear() { + $$invalidate(2, value = undefined); + $$invalidate(36, listOpen = false); + dispatch("clear", value); + handleFocus(); + } - if (!mounted) { - dispose = [ - listen_dev(input_1, "focus", /*handleFocus*/ ctx[32], false, false, false), - listen_dev(input_1, "input", /*input_1_input_handler_1*/ ctx[67]) - ]; + async function loadList() { + await tick(); + if (target && list) return; - mounted = true; - } - }, - p: function update(ctx, dirty) { - set_attributes(input_1, input_1_data = get_spread_update(input_1_levels, [ - dirty[0] & /*_inputAttributes*/ 67108864 && /*_inputAttributes*/ ctx[26], - dirty[0] & /*placeholderText*/ 268435456 && { placeholder: /*placeholderText*/ ctx[28] }, - dirty[0] & /*inputStyles*/ 32768 && { style: /*inputStyles*/ ctx[15] } - ])); + if (isVirtualList && !VirtualList) { + $$invalidate(39, VirtualList = await importInternalComponent("VirtualList")); + } - if (dirty[0] & /*filterText*/ 8 && input_1.value !== /*filterText*/ ctx[3]) { - set_input_value(input_1, /*filterText*/ ctx[3]); - } + const data = { + Item: Item$1, + filterText, + optionIdentifier, + noOptionsMessage, + hideEmptyState, + isVirtualList, + VirtualList, + value, + isMulti, + getGroupHeaderLabel, + items: filteredItems, + itemHeight + }; - toggle_class(input_1, "svelte-1ri8kk0", true); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(input_1); - /*input_1_binding_1*/ ctx[66](null); - mounted = false; - run_all(dispose); + if (getOptionLabel) { + data.getOptionLabel = getOptionLabel; } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block_1.name, - type: "else", - source: "(948:4) {:else}", - ctx - }); - return block; -} + if (target) target.remove(); + target = document.createElement("div"); -// (938:4) {#if isDisabled} -function create_if_block_5(ctx) { - let input_1; - let mounted; - let dispose; + Object.assign(target.style, { + position: "absolute", + "z-index": 2, + visibility: "hidden" + }); - let input_1_levels = [ - /*_inputAttributes*/ ctx[26], - { placeholder: /*placeholderText*/ ctx[28] }, - { style: /*inputStyles*/ ctx[15] }, - { disabled: true } - ]; + if (list) list.$destroy(); + $$invalidate(37, list); + target = target; + if (container) container.appendChild(target); + $$invalidate(37, list = new List({ target, props: data })); - let input_1_data = {}; + list.$on("itemSelected", event => { + const { detail } = event; - for (let i = 0; i < input_1_levels.length; i += 1) { - input_1_data = assign(input_1_data, input_1_levels[i]); - } + if (detail) { + const item = Object.assign({}, detail); - const block = { - c: function create() { - input_1 = element("input"); - set_attributes(input_1, input_1_data); - toggle_class(input_1, "svelte-1ri8kk0", true); - add_location(input_1, file$7, 938, 8, 25274); - }, - m: function mount(target, anchor) { - insert_dev(target, input_1, anchor); - /*input_1_binding*/ ctx[64](input_1); - set_input_value(input_1, /*filterText*/ ctx[3]); + if (!item.isGroupHeader || item.isSelectable) { + if (isMulti) { + $$invalidate(2, value = value ? value.concat([item]) : [item]); + } else { + $$invalidate(2, value = item); + } - if (!mounted) { - dispose = [ - listen_dev(input_1, "focus", /*handleFocus*/ ctx[32], false, false, false), - listen_dev(input_1, "input", /*input_1_input_handler*/ ctx[65]) - ]; + resetFilter(); + $$invalidate(2, value); - mounted = true; + setTimeout(() => { + $$invalidate(36, listOpen = false); + $$invalidate(25, activeValue = undefined); + }); + } } - }, - p: function update(ctx, dirty) { - set_attributes(input_1, input_1_data = get_spread_update(input_1_levels, [ - dirty[0] & /*_inputAttributes*/ 67108864 && /*_inputAttributes*/ ctx[26], - dirty[0] & /*placeholderText*/ 268435456 && { placeholder: /*placeholderText*/ ctx[28] }, - dirty[0] & /*inputStyles*/ 32768 && { style: /*inputStyles*/ ctx[15] }, - { disabled: true } - ])); + }); - if (dirty[0] & /*filterText*/ 8 && input_1.value !== /*filterText*/ ctx[3]) { - set_input_value(input_1, /*filterText*/ ctx[3]); + list.$on("itemCreated", event => { + const { detail } = event; + + if (isMulti) { + $$invalidate(2, value = value || []); + $$invalidate(2, value = [...value, createItem(detail)]); + } else { + $$invalidate(2, value = createItem(detail)); } - toggle_class(input_1, "svelte-1ri8kk0", true); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(input_1); - /*input_1_binding*/ ctx[64](null); - mounted = false; - run_all(dispose); - } - }; + dispatch("itemCreated", detail); + $$invalidate(3, filterText = ""); + $$invalidate(36, listOpen = false); + $$invalidate(25, activeValue = undefined); + resetFilter(); + }); - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_5.name, - type: "if", - source: "(938:4) {#if isDisabled}", - ctx - }); + list.$on("closeList", () => { + $$invalidate(36, listOpen = false); + }); - return block; -} + ($$invalidate(37, list), target = target); + getPosition(); + } -// (959:4) {#if !isMulti && showSelectedItem} -function create_if_block_4(ctx) { - let div; - let switch_instance; - let current; - let mounted; - let dispose; - var switch_value = /*Selection*/ ctx[6]; + onMount(async () => { + if (!List) $$invalidate(40, List = await importInternalComponent("List")); + if (isFocused && input) input.focus(); + if (listOpen) loadList(); - function switch_props(ctx) { - return { - props: { - item: /*value*/ ctx[2], - getSelectionLabel: /*getSelectionLabel*/ ctx[13] - }, - $$inline: true - }; - } + if (items && items.length > 0) { + $$invalidate(62, originalItemsClone = JSON.stringify(items)); + } + }); - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - } + onDestroy(() => { + removeList(); + }); - const block = { - c: function create() { - div = element("div"); - if (switch_instance) create_component(switch_instance.$$.fragment); - attr_dev(div, "class", "selectedItem svelte-1ri8kk0"); - add_location(div, file$7, 959, 8, 25827); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); + const writable_props = [ + "container", + "input", + "Item", + "Selection", + "MultiSelection", + "isMulti", + "multiFullItemClearable", + "isDisabled", + "isCreatable", + "isFocused", + "value", + "filterText", + "placeholder", + "items", + "itemFilter", + "groupBy", + "groupFilter", + "isGroupHeaderSelectable", + "getGroupHeaderLabel", + "getOptionLabel", + "optionIdentifier", + "loadOptions", + "hasError", + "containerStyles", + "getSelectionLabel", + "createGroupHeaderItem", + "createItem", + "isSearchable", + "inputStyles", + "isClearable", + "isWaiting", + "listPlacement", + "listOpen", + "list", + "isVirtualList", + "loadOptionsInterval", + "noOptionsMessage", + "hideEmptyState", + "filteredItems", + "inputAttributes", + "listAutoWidth", + "itemHeight", + "Icon", + "iconProps", + "showChevron", + "showIndicator", + "containerClasses", + "indicatorSvg", + "ClearIcon", + "VirtualList", + "List" + ]; - if (switch_instance) { - mount_component(switch_instance, div, null); - } + Object_1.keys($$props).forEach(key => { + if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(`: Cannot set read-only property 'handleClear'"); } +} - function handleWindowClick(event) { - if (!container) return; +/* src/List.svelte generated by Svelte v3.35.0 */ +const file$7 = "src/List.svelte"; - const eventTarget = event.path && event.path.length > 0 - ? event.path[0] - : event.target; +function get_each_context$1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[33] = list[i]; + child_ctx[35] = i; + return child_ctx; +} - if (container.contains(eventTarget)) return; - $$invalidate(1, isFocused = false); - $$invalidate(36, listOpen = false); - $$invalidate(25, activevalue = undefined); - if (input) input.blur(); - } +// (241:0) {#if isVirtualList} +function create_if_block_3(ctx) { + let div; + let switch_instance; + let current; + var switch_value = /*VirtualList*/ ctx[2]; - function handleClick() { - if (isDisabled) return; - $$invalidate(1, isFocused = true); - $$invalidate(36, listOpen = !listOpen); + function switch_props(ctx) { + return { + props: { + items: /*items*/ ctx[5], + itemHeight: /*itemHeight*/ ctx[8], + $$slots: { + default: [ + create_default_slot, + ({ item, i }) => ({ 33: item, 35: i }), + ({ item, i }) => [0, (item ? 4 : 0) | (i ? 16 : 0)] + ] + }, + $$scope: { ctx } + }, + $$inline: true + }; } - function handleClear() { - $$invalidate(2, value = undefined); - $$invalidate(36, listOpen = false); - dispatch("clear", value); - handleFocus(); + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); } - async function loadList() { - await tick(); - if (target && list) return; - if (isVirtualList && !VirtualListComponent) await setupVirtualList(); - - const data = { - Item: Item$1, - filterText, - optionIdentifier, - noOptionsMessage, - hideEmptyState, - isVirtualList, - VirtualList, - value, - isMulti, - getGroupHeaderLabel, - items: filteredItems, - itemHeight - }; - - if (getOptionLabel) { - data.getOptionLabel = getOptionLabel; - } - - if (target) target.remove(); - target = document.createElement("div"); - - Object.assign(target.style, { - position: "absolute", - "z-index": 2, - visibility: "hidden" - }); - - if (list) list.$destroy(); - $$invalidate(37, list); - target = target; - if (container) container.appendChild(target); - $$invalidate(37, list = new List({ target, props: data })); - - list.$on("itemSelected", event => { - const { detail } = event; - - if (detail) { - const item = Object.assign({}, detail); - - if (!item.isGroupHeader || item.isSelectable) { - if (isMulti) { - $$invalidate(2, value = value ? value.concat([item]) : [item]); - } else { - $$invalidate(2, value = item); - } - - resetFilter(); - $$invalidate(2, value); + const block = { + c: function create() { + div = element("div"); + if (switch_instance) create_component(switch_instance.$$.fragment); + attr_dev(div, "class", "listContainer virtualList svelte-1wmovev"); + add_location(div, file$7, 241, 4, 6877); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); - setTimeout(() => { - $$invalidate(36, listOpen = false); - $$invalidate(25, activevalue = undefined); - }); - } + if (switch_instance) { + mount_component(switch_instance, div, null); } - }); - list.$on("itemCreated", event => { - const { detail } = event; + /*div_binding*/ ctx[21](div); + current = true; + }, + p: function update(ctx, dirty) { + const switch_instance_changes = {}; + if (dirty[0] & /*items*/ 32) switch_instance_changes.items = /*items*/ ctx[5]; + if (dirty[0] & /*itemHeight*/ 256) switch_instance_changes.itemHeight = /*itemHeight*/ ctx[8]; - if (isMulti) { - $$invalidate(2, value = value || []); - $$invalidate(2, value = [...value, createItem(detail)]); - } else { - $$invalidate(2, value = createItem(detail)); + if (dirty[0] & /*Item, filterText, getOptionLabel, value, optionIdentifier, hoverItemIndex, items*/ 9834 | dirty[1] & /*$$scope, item, i*/ 52) { + switch_instance_changes.$$scope = { dirty, ctx }; } - dispatch("itemCreated", detail); - $$invalidate(3, filterText = ""); - $$invalidate(36, listOpen = false); - $$invalidate(25, activevalue = undefined); - resetFilter(); - }); - - list.$on("closeList", () => { - $$invalidate(36, listOpen = false); - }); + if (switch_value !== (switch_value = /*VirtualList*/ ctx[2])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; - ($$invalidate(37, list), target = target); - getPosition(); - } + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); - onMount(() => { - if (isFocused) input.focus(); - if (listOpen) loadList(); + check_outros(); + } - if (items && items.length > 0) { - $$invalidate(60, originalItemsClone = JSON.stringify(items)); + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, div, null); + } else { + switch_instance = null; + } + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); + } + }, + i: function intro(local) { + if (current) return; + if (switch_instance) transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o: function outro(local) { + if (switch_instance) transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + if (switch_instance) destroy_component(switch_instance); + /*div_binding*/ ctx[21](null); } - }); + }; - onDestroy(() => { - removeList(); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_3.name, + type: "if", + source: "(241:0) {#if isVirtualList}", + ctx }); - const writable_props = [ - "container", - "input", - "Item", - "Selection", - "MultiSelection", - "isMulti", - "multiFullItemClearable", - "isDisabled", - "isCreatable", - "isFocused", - "value", - "filterText", - "placeholder", - "items", - "itemFilter", - "groupBy", - "groupFilter", - "isGroupHeaderSelectable", - "getGroupHeaderLabel", - "getOptionLabel", - "optionIdentifier", - "loadOptions", - "hasError", - "containerStyles", - "getSelectionLabel", - "createGroupHeaderItem", - "createItem", - "isSearchable", - "inputStyles", - "isClearable", - "isWaiting", - "listPlacement", - "listOpen", - "list", - "isVirtualList", - "loadOptionsInterval", - "noOptionsMessage", - "hideEmptyState", - "filteredItems", - "inputAttributes", - "listAutoWidth", - "itemHeight", - "Icon", - "iconProps", - "showChevron", - "showIndicator", - "containerClasses", - "indicatorSvg", - "ClearIcon" - ]; - - Object_1.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(`: Cannot set read-only property 'handleClear'"); + set filterText(filterText) { + this.$set({ filterText }); + flush(); } } +var List$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': List +}); + /* test/src/TestIcon.svelte generated by Svelte v3.35.0 */ const file$6 = "test/src/TestIcon.svelte"; @@ -8233,13 +8222,6 @@ class Select_default extends SvelteComponentDev { const file$3 = "test/src/Select/Select--multiSelected.svelte"; -function add_css$2() { - var style = element("style"); - style.id = "svelte-1i6xooq-style"; - style.textContent = ".selectContainer.svelte-1i6xooq.svelte-1i6xooq{border:1px solid #D8DBDF;border-radius:3px;height:42px;position:relative}.selectContainer.svelte-1i6xooq input.svelte-1i6xooq{border:none;color:#3F4F5F;height:42px;line-height:42px;padding:0 16px;width:100%;background:transparent;font-size:14px;letter-spacing:-0.08px}.selectContainer.svelte-1i6xooq input.svelte-1i6xooq::placeholder{color:#78848F}.selectContainer.svelte-1i6xooq.svelte-1i6xooq:hover{border-color:#b2b8bf}.selectContainer.svelte-1i6xooq input.svelte-1i6xooq:focus{outline:none}.clearSelect.svelte-1i6xooq.svelte-1i6xooq{position:absolute;right:10px;top:12px;width:20px;height:20px;color:#c5cacf}.clearSelect.svelte-1i6xooq.svelte-1i6xooq:hover{color:#2c3e50}.multiSelect.svelte-1i6xooq.svelte-1i6xooq{display:flex;padding:0 16px}.multiSelectItem.svelte-1i6xooq.svelte-1i6xooq{background:#E8EAED;margin-right:5px;border-radius:4px;line-height:26px;display:flex;cursor:default}.multiSelectItem_label.svelte-1i6xooq.svelte-1i6xooq{padding:0 5px 0 10px}.selectContainer.multiSelect.svelte-1i6xooq input.svelte-1i6xooq{width:auto;padding:0;flex-grow:1}.multiSelectItem_clear.svelte-1i6xooq.svelte-1i6xooq{border-radius:0 4px 4px 0;width:20px;text-align:center}.multiSelectItem_clear.svelte-1i6xooq.svelte-1i6xooq:hover{background-color:red}.multiSelectItem_clear.svelte-1i6xooq svg.svelte-1i6xooq{width:14px;height:14px;position:relative;top:3px}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0LS1tdWx0aVNlbGVjdGVkLnN2ZWx0ZSIsInNvdXJjZXMiOlsiU2VsZWN0LS1tdWx0aVNlbGVjdGVkLnN2ZWx0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIERFViBPTkxZIElNUE9SVFMgLS0+XG48bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi4uL3Jlc2V0LmNzc1wiLz5cblxuPGRpdiBjbGFzcz1cInNlbGVjdENvbnRhaW5lciBtdWx0aVNlbGVjdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtdWx0aVNlbGVjdEl0ZW1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aVNlbGVjdEl0ZW1fbGFiZWxcIj5cbiAgICAgICAgUGl6emFcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm11bHRpU2VsZWN0SXRlbV9jbGVhclwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiB2aWV3Qm94PVwiLTIgLTIgNTAgNTBcIiBmb2N1c2FibGU9XCJmYWxzZVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0zNC45MjMsMzcuMjUxTDI0LDI2LjMyOEwxMy4wNzcsMzcuMjUxTDkuNDM2LDMzLjYxbDEwLjkyMy0xMC45MjNMOS40MzYsMTEuNzY1bDMuNjQxLTMuNjQxTDI0LDE5LjA0N0wzNC45MjMsOC4xMjQgbDMuNjQxLDMuNjQxTDI3LjY0MSwyMi42ODhMMzguNTY0LDMzLjYxTDM0LjkyMywzNy4yNTF6XCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtdWx0aVNlbGVjdEl0ZW1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aVNlbGVjdEl0ZW1fbGFiZWxcIj5cbiAgICAgICAgQ2hpcHNcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm11bHRpU2VsZWN0SXRlbV9jbGVhclwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiB2aWV3Qm94PVwiLTIgLTIgNTAgNTBcIiBmb2N1c2FibGU9XCJmYWxzZVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0zNC45MjMsMzcuMjUxTDI0LDI2LjMyOEwxMy4wNzcsMzcuMjUxTDkuNDM2LDMzLjYxbDEwLjkyMy0xMC45MjNMOS40MzYsMTEuNzY1bDMuNjQxLTMuNjQxTDI0LDE5LjA0N0wzNC45MjMsOC4xMjQgbDMuNjQxLDMuNjQxTDI3LjY0MSwyMi42ODhMMzguNTY0LDMzLjYxTDM0LjkyMywzNy4yNTF6XCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBzcGVsbGNoZWNrPVwidHJ1ZVwiIHBsYWNlaG9sZGVyPVwiXCI+XG4gIDxkaXYgY2xhc3M9XCJjbGVhclNlbGVjdFwiPlxuICAgIDxzdmcgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIHZpZXdCb3g9XCItMiAtMiA1MCA1MFwiIGZvY3VzYWJsZT1cImZhbHNlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxuICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBkPVwiTTM0LjkyMywzNy4yNTFMMjQsMjYuMzI4TDEzLjA3NywzNy4yNTFMOS40MzYsMzMuNjFsMTAuOTIzLTEwLjkyM0w5LjQzNiwxMS43NjVsMy42NDEtMy42NDFMMjQsMTkuMDQ3TDM0LjkyMyw4LjEyNCBsMy42NDEsMy42NDFMMjcuNjQxLDIyLjY4OEwzOC41NjQsMzMuNjFMMzQuOTIzLDM3LjI1MXpcIj48L3BhdGg+XG4gICAgPC9zdmc+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxzdHlsZT5cbiAgLnNlbGVjdENvbnRhaW5lciB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI0Q4REJERjtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgaGVpZ2h0OiA0MnB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuXG4gIC5zZWxlY3RDb250YWluZXIgaW5wdXQge1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBjb2xvcjogIzNGNEY1RjtcbiAgICBoZWlnaHQ6IDQycHg7XG4gICAgbGluZS1oZWlnaHQ6IDQycHg7XG4gICAgcGFkZGluZzogMCAxNnB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsZXR0ZXItc3BhY2luZzogLTAuMDhweDtcbiAgfVxuXG4gIC5zZWxlY3RDb250YWluZXIgaW5wdXQ6OnBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogIzc4ODQ4RjtcbiAgfVxuXG4gIC5zZWxlY3RDb250YWluZXI6aG92ZXIge1xuICAgIGJvcmRlci1jb2xvcjogI2IyYjhiZjtcbiAgfVxuXG4gIC5zZWxlY3RDb250YWluZXIgaW5wdXQ6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmU7XG4gIH1cblxuICAuY2xlYXJTZWxlY3Qge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogMTBweDtcbiAgICB0b3A6IDEycHg7XG4gICAgd2lkdGg6IDIwcHg7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIGNvbG9yOiAjYzVjYWNmO1xuICB9XG5cbiAgLmNsZWFyU2VsZWN0OmhvdmVyIHtcbiAgICBjb2xvcjogIzJjM2U1MDtcbiAgfVxuXG4gIC5tdWx0aVNlbGVjdCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gIH1cbiAgXG4gIC5tdWx0aVNlbGVjdEl0ZW0ge1xuICAgIGJhY2tncm91bmQ6ICNFOEVBRUQ7XG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyNnB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xuICB9XG5cbiAgLm11bHRpU2VsZWN0SXRlbV9sYWJlbCB7XG4gICAgcGFkZGluZzogMCA1cHggMCAxMHB4O1xuICB9XG5cbiAgLnNlbGVjdENvbnRhaW5lci5tdWx0aVNlbGVjdCBpbnB1dCB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgcGFkZGluZzogMDtcbiAgICBmbGV4LWdyb3c6IDE7XG4gIH1cblxuICAubXVsdGlTZWxlY3RJdGVtX2NsZWFyIHtcbiAgICBib3JkZXItcmFkaXVzOiAwIDRweCA0cHggMDtcbiAgICB3aWR0aDogMjBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAubXVsdGlTZWxlY3RJdGVtX2NsZWFyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XG4gIH1cblxuICAubXVsdGlTZWxlY3RJdGVtX2NsZWFyIHN2ZyB7XG4gICAgd2lkdGg6IDE0cHg7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IDNweDtcbiAgfVxuPC9zdHlsZT5cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQ0UsZ0JBQWdCLDhCQUFDLENBQUMsQUFDaEIsTUFBTSxDQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUN6QixhQUFhLENBQUUsR0FBRyxDQUNsQixNQUFNLENBQUUsSUFBSSxDQUNaLFFBQVEsQ0FBRSxRQUFRLEFBQ3BCLENBQUMsQUFFRCwrQkFBZ0IsQ0FBQyxLQUFLLGVBQUMsQ0FBQyxBQUN0QixNQUFNLENBQUUsSUFBSSxDQUNaLEtBQUssQ0FBRSxPQUFPLENBQ2QsTUFBTSxDQUFFLElBQUksQ0FDWixXQUFXLENBQUUsSUFBSSxDQUNqQixPQUFPLENBQUUsQ0FBQyxDQUFDLElBQUksQ0FDZixLQUFLLENBQUUsSUFBSSxDQUNYLFVBQVUsQ0FBRSxXQUFXLENBQ3ZCLFNBQVMsQ0FBRSxJQUFJLENBQ2YsY0FBYyxDQUFFLE9BQU8sQUFDekIsQ0FBQyxBQUVELCtCQUFnQixDQUFDLG9CQUFLLGFBQWEsQUFBQyxDQUFDLEFBQ25DLEtBQUssQ0FBRSxPQUFPLEFBQ2hCLENBQUMsQUFFRCw4Q0FBZ0IsTUFBTSxBQUFDLENBQUMsQUFDdEIsWUFBWSxDQUFFLE9BQU8sQUFDdkIsQ0FBQyxBQUVELCtCQUFnQixDQUFDLG9CQUFLLE1BQU0sQUFBQyxDQUFDLEFBQzVCLE9BQU8sQ0FBRSxJQUFJLEFBQ2YsQ0FBQyxBQUVELFlBQVksOEJBQUMsQ0FBQyxBQUNaLFFBQVEsQ0FBRSxRQUFRLENBQ2xCLEtBQUssQ0FBRSxJQUFJLENBQ1gsR0FBRyxDQUFFLElBQUksQ0FDVCxLQUFLLENBQUUsSUFBSSxDQUNYLE1BQU0sQ0FBRSxJQUFJLENBQ1osS0FBSyxDQUFFLE9BQU8sQUFDaEIsQ0FBQyxBQUVELDBDQUFZLE1BQU0sQUFBQyxDQUFDLEFBQ2xCLEtBQUssQ0FBRSxPQUFPLEFBQ2hCLENBQUMsQUFFRCxZQUFZLDhCQUFDLENBQUMsQUFDWixPQUFPLENBQUUsSUFBSSxDQUNiLE9BQU8sQ0FBRSxDQUFDLENBQUMsSUFBSSxBQUNqQixDQUFDLEFBRUQsZ0JBQWdCLDhCQUFDLENBQUMsQUFDaEIsVUFBVSxDQUFFLE9BQU8sQ0FDbkIsWUFBWSxDQUFFLEdBQUcsQ0FDakIsYUFBYSxDQUFFLEdBQUcsQ0FDbEIsV0FBVyxDQUFFLElBQUksQ0FDakIsT0FBTyxDQUFFLElBQUksQ0FDYixNQUFNLENBQUUsT0FBTyxBQUNqQixDQUFDLEFBRUQsc0JBQXNCLDhCQUFDLENBQUMsQUFDdEIsT0FBTyxDQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQUFDdkIsQ0FBQyxBQUVELGdCQUFnQiwyQkFBWSxDQUFDLEtBQUssZUFBQyxDQUFDLEFBQ2xDLEtBQUssQ0FBRSxJQUFJLENBQ1gsT0FBTyxDQUFFLENBQUMsQ0FDVixTQUFTLENBQUUsQ0FBQyxBQUNkLENBQUMsQUFFRCxzQkFBc0IsOEJBQUMsQ0FBQyxBQUN0QixhQUFhLENBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUMxQixLQUFLLENBQUUsSUFBSSxDQUNYLFVBQVUsQ0FBRSxNQUFNLEFBQ3BCLENBQUMsQUFFRCxvREFBc0IsTUFBTSxBQUFDLENBQUMsQUFDNUIsZ0JBQWdCLENBQUUsR0FBRyxBQUN2QixDQUFDLEFBRUQscUNBQXNCLENBQUMsR0FBRyxlQUFDLENBQUMsQUFDMUIsS0FBSyxDQUFFLElBQUksQ0FDWCxNQUFNLENBQUUsSUFBSSxDQUNaLFFBQVEsQ0FBRSxRQUFRLENBQ2xCLEdBQUcsQ0FBRSxHQUFHLEFBQ1YsQ0FBQyJ9 */"; - append_dev(document.head, style); -} - function create_fragment$3(ctx) { let link; let t0; @@ -8406,7 +8388,6 @@ function instance$3($$self, $$props) { class Select_multiSelected extends SvelteComponentDev { constructor(options) { super(options); - if (!document.getElementById("svelte-1i6xooq-style")) add_css$2(); init(this, options, instance$3, create_fragment$3, safe_not_equal, {}); dispatch_dev("SvelteRegisterComponent", { @@ -8422,13 +8403,6 @@ class Select_multiSelected extends SvelteComponentDev { const file$2 = "test/src/List/List--default.svelte"; -function add_css$1() { - var style = element("style"); - style.id = "svelte-mj7ksi-style"; - style.textContent = ".listContainer.svelte-mj7ksi{box-shadow:0 2px 3px 0 rgba(44, 62, 80, 0.24);border-radius:4px;height:176px;overflow-y:auto}.listItem.svelte-mj7ksi{padding:20px}.listItem.svelte-mj7ksi:hover,.listItem.hover.svelte-mj7ksi{background:#e7f2ff}.listItem.svelte-mj7ksi:first-child{border-radius:4px 4px 0 0}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGlzdC0tZGVmYXVsdC5zdmVsdGUiLCJzb3VyY2VzIjpbIkxpc3QtLWRlZmF1bHQuc3ZlbHRlIl0sInNvdXJjZXNDb250ZW50IjpbIjwhLS0gREVWIE9OTFkgSU1QT1JUUyAtLT5cbjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiLi4vcmVzZXQuY3NzXCIvPlxuXG48ZGl2IGNsYXNzPVwibGlzdENvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwibGlzdEl0ZW0gaG92ZXJcIj48ZGl2IGNsYXNzPVwiaXRlbVwiPkNob2NvbGF0ZTwvZGl2PjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibGlzdEl0ZW1cIj48ZGl2IGNsYXNzPVwiaXRlbVwiPlBpenphPC9kaXY+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJsaXN0SXRlbVwiPjxkaXYgY2xhc3M9XCJpdGVtXCI+Q2FrZTwvZGl2PjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibGlzdEl0ZW1cIj48ZGl2IGNsYXNzPVwiaXRlbVwiPkNoaXBzPC9kaXY+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJsaXN0SXRlbVwiPjxkaXYgY2xhc3M9XCJpdGVtXCI+SWNlIENyZWFtPC9kaXY+PC9kaXY+XG48L2Rpdj5cblxuPHN0eWxlPlxuICAubGlzdENvbnRhaW5lciB7XG4gICAgYm94LXNoYWRvdzogMCAycHggM3B4IDAgcmdiYSg0NCwgNjIsIDgwLCAwLjI0KTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgaGVpZ2h0OiAxNzZweDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICB9XG5cbiAgLmxpc3RJdGVtIHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICB9XG5cbiAgLmxpc3RJdGVtOmhvdmVyLFxuICAubGlzdEl0ZW0uaG92ZXIge1xuICAgIGJhY2tncm91bmQ6ICNlN2YyZmY7XG4gIH1cblxuICAubGlzdEl0ZW06Zmlyc3QtY2hpbGQge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCA0cHggMCAwO1xuICB9XG48L3N0eWxlPlxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlFLGNBQWMsY0FBQyxDQUFDLEFBQ2QsVUFBVSxDQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUM5QyxhQUFhLENBQUUsR0FBRyxDQUNsQixNQUFNLENBQUUsS0FBSyxDQUNiLFVBQVUsQ0FBRSxJQUFJLEFBQ2xCLENBQUMsQUFFRCxTQUFTLGNBQUMsQ0FBQyxBQUNULE9BQU8sQ0FBRSxJQUFJLEFBQ2YsQ0FBQyxBQUVELHVCQUFTLE1BQU0sQ0FDZixTQUFTLE1BQU0sY0FBQyxDQUFDLEFBQ2YsVUFBVSxDQUFFLE9BQU8sQUFDckIsQ0FBQyxBQUVELHVCQUFTLFlBQVksQUFBQyxDQUFDLEFBQ3JCLGFBQWEsQ0FBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBQzVCLENBQUMifQ== */"; - append_dev(document.head, style); -} - function create_fragment$2(ctx) { let link; let t0; @@ -8556,7 +8530,6 @@ function instance$2($$self, $$props) { class List_default extends SvelteComponentDev { constructor(options) { super(options); - if (!document.getElementById("svelte-mj7ksi-style")) add_css$1(); init(this, options, instance$2, create_fragment$2, safe_not_equal, {}); dispatch_dev("SvelteRegisterComponent", { @@ -9008,7 +8981,7 @@ function focus(element, setFocus) { fulfil(true); }); - setFocus(); + if (setFocus) setFocus(); }); } @@ -12062,13 +12035,6 @@ var index = {}; /* src/VirtualList.svelte generated by Svelte v3.35.0 */ const file = "src/VirtualList.svelte"; -function add_css() { - var style = element("style"); - style.id = "svelte-g2cagw-style"; - style.textContent = "svelte-virtual-list-viewport.svelte-g2cagw{position:relative;overflow-y:auto;-webkit-overflow-scrolling:touch;display:block}svelte-virtual-list-contents.svelte-g2cagw,svelte-virtual-list-row.svelte-g2cagw{display:block}svelte-virtual-list-row.svelte-g2cagw{overflow:hidden}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlydHVhbExpc3Quc3ZlbHRlIiwic291cmNlcyI6WyJWaXJ0dWFsTGlzdC5zdmVsdGUiXSwic291cmNlc0NvbnRlbnQiOlsiPHNjcmlwdD5cbiAgICBpbXBvcnQgeyBvbk1vdW50LCB0aWNrIH0gZnJvbSAnc3ZlbHRlJztcblxuICAgIGV4cG9ydCBsZXQgaXRlbXMgPSB1bmRlZmluZWQ7XG4gICAgZXhwb3J0IGxldCBoZWlnaHQgPSAnMTAwJSc7XG4gICAgZXhwb3J0IGxldCBpdGVtSGVpZ2h0ID0gNDA7XG4gICAgZXhwb3J0IGxldCBob3Zlckl0ZW1JbmRleCA9IDA7XG4gICAgZXhwb3J0IGxldCBzdGFydCA9IDA7XG4gICAgZXhwb3J0IGxldCBlbmQgPSAwO1xuXG4gICAgbGV0IGhlaWdodF9tYXAgPSBbXTtcbiAgICBsZXQgcm93cztcbiAgICBsZXQgdmlld3BvcnQ7XG4gICAgbGV0IGNvbnRlbnRzO1xuICAgIGxldCB2aWV3cG9ydF9oZWlnaHQgPSAwO1xuICAgIGxldCB2aXNpYmxlO1xuICAgIGxldCBtb3VudGVkO1xuXG4gICAgbGV0IHRvcCA9IDA7XG4gICAgbGV0IGJvdHRvbSA9IDA7XG4gICAgbGV0IGF2ZXJhZ2VfaGVpZ2h0O1xuXG4gICAgJDogdmlzaWJsZSA9IGl0ZW1zLnNsaWNlKHN0YXJ0LCBlbmQpLm1hcCgoZGF0YSwgaSkgPT4ge1xuICAgICAgICByZXR1cm4geyBpbmRleDogaSArIHN0YXJ0LCBkYXRhIH07XG4gICAgfSk7XG5cbiAgICAkOiBpZiAobW91bnRlZCkgcmVmcmVzaChpdGVtcywgdmlld3BvcnRfaGVpZ2h0LCBpdGVtSGVpZ2h0KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goaXRlbXMsIHZpZXdwb3J0X2hlaWdodCwgaXRlbUhlaWdodCkge1xuICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCB9ID0gdmlld3BvcnQ7XG5cbiAgICAgICAgYXdhaXQgdGljaygpO1xuXG4gICAgICAgIGxldCBjb250ZW50X2hlaWdodCA9IHRvcCAtIHNjcm9sbFRvcDtcbiAgICAgICAgbGV0IGkgPSBzdGFydDtcblxuICAgICAgICB3aGlsZSAoY29udGVudF9oZWlnaHQgPCB2aWV3cG9ydF9oZWlnaHQgJiYgaSA8IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJvd3NbaSAtIHN0YXJ0XTtcblxuICAgICAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aWNrKCk7XG4gICAgICAgICAgICAgICAgcm93ID0gcm93c1tpIC0gc3RhcnRdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3dfaGVpZ2h0ID0gKGhlaWdodF9tYXBbaV0gPSBpdGVtSGVpZ2h0IHx8IHJvdy5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgICAgY29udGVudF9oZWlnaHQgKz0gcm93X2hlaWdodDtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVuZCA9IGk7XG5cbiAgICAgICAgY29uc3QgcmVtYWluaW5nID0gaXRlbXMubGVuZ3RoIC0gZW5kO1xuICAgICAgICBhdmVyYWdlX2hlaWdodCA9ICh0b3AgKyBjb250ZW50X2hlaWdodCkgLyBlbmQ7XG5cbiAgICAgICAgYm90dG9tID0gcmVtYWluaW5nICogYXZlcmFnZV9oZWlnaHQ7XG4gICAgICAgIGhlaWdodF9tYXAubGVuZ3RoID0gaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIGlmICh2aWV3cG9ydCkgdmlld3BvcnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVfc2Nyb2xsKCkge1xuICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCB9ID0gdmlld3BvcnQ7XG5cbiAgICAgICAgY29uc3Qgb2xkX3N0YXJ0ID0gc3RhcnQ7XG5cbiAgICAgICAgZm9yIChsZXQgdiA9IDA7IHYgPCByb3dzLmxlbmd0aDsgdiArPSAxKSB7XG4gICAgICAgICAgICBoZWlnaHRfbWFwW3N0YXJ0ICsgdl0gPSBpdGVtSGVpZ2h0IHx8IHJvd3Nbdl0ub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgeSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd19oZWlnaHQgPSBoZWlnaHRfbWFwW2ldIHx8IGF2ZXJhZ2VfaGVpZ2h0O1xuICAgICAgICAgICAgaWYgKHkgKyByb3dfaGVpZ2h0ID4gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBpO1xuICAgICAgICAgICAgICAgIHRvcCA9IHk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeSArPSByb3dfaGVpZ2h0O1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGkgPCBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHkgKz0gaGVpZ2h0X21hcFtpXSB8fCBhdmVyYWdlX2hlaWdodDtcbiAgICAgICAgICAgIGkgKz0gMTtcblxuICAgICAgICAgICAgaWYgKHkgPiBzY3JvbGxUb3AgKyB2aWV3cG9ydF9oZWlnaHQpIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5kID0gaTtcblxuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBpdGVtcy5sZW5ndGggLSBlbmQ7XG4gICAgICAgIGF2ZXJhZ2VfaGVpZ2h0ID0geSAvIGVuZDtcblxuICAgICAgICB3aGlsZSAoaSA8IGl0ZW1zLmxlbmd0aCkgaGVpZ2h0X21hcFtpKytdID0gYXZlcmFnZV9oZWlnaHQ7XG4gICAgICAgIGJvdHRvbSA9IHJlbWFpbmluZyAqIGF2ZXJhZ2VfaGVpZ2h0O1xuXG4gICAgICAgIGlmIChzdGFydCA8IG9sZF9zdGFydCkge1xuICAgICAgICAgICAgYXdhaXQgdGljaygpO1xuXG4gICAgICAgICAgICBsZXQgZXhwZWN0ZWRfaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGxldCBhY3R1YWxfaGVpZ2h0ID0gMDtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgb2xkX3N0YXJ0OyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAocm93c1tpIC0gc3RhcnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2hlaWdodCArPSBoZWlnaHRfbWFwW2ldO1xuICAgICAgICAgICAgICAgICAgICBhY3R1YWxfaGVpZ2h0ICs9IGl0ZW1IZWlnaHQgfHwgcm93c1tpIC0gc3RhcnRdLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGQgPSBhY3R1YWxfaGVpZ2h0IC0gZXhwZWN0ZWRfaGVpZ2h0O1xuICAgICAgICAgICAgdmlld3BvcnQuc2Nyb2xsVG8oMCwgc2Nyb2xsVG9wICsgZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1vdW50KCgpID0+IHtcbiAgICAgICAgcm93cyA9IGNvbnRlbnRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmVsdGUtdmlydHVhbC1saXN0LXJvdycpO1xuICAgICAgICBtb3VudGVkID0gdHJ1ZTtcbiAgICB9KTtcbjwvc2NyaXB0PlxuXG48c3R5bGU+XG4gICAgc3ZlbHRlLXZpcnR1YWwtbGlzdC12aWV3cG9ydCB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG5cbiAgICBzdmVsdGUtdmlydHVhbC1saXN0LWNvbnRlbnRzLFxuICAgIHN2ZWx0ZS12aXJ0dWFsLWxpc3Qtcm93IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuXG4gICAgc3ZlbHRlLXZpcnR1YWwtbGlzdC1yb3cge1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbjwvc3R5bGU+XG5cbjxzdmVsdGUtdmlydHVhbC1saXN0LXZpZXdwb3J0XG4gICAgYmluZDp0aGlzPXt2aWV3cG9ydH1cbiAgICBiaW5kOm9mZnNldEhlaWdodD17dmlld3BvcnRfaGVpZ2h0fVxuICAgIG9uOnNjcm9sbD17aGFuZGxlX3Njcm9sbH1cbiAgICBzdHlsZT1cImhlaWdodDoge2hlaWdodH07XCJcbj5cbiAgICA8c3ZlbHRlLXZpcnR1YWwtbGlzdC1jb250ZW50c1xuICAgICAgICBiaW5kOnRoaXM9e2NvbnRlbnRzfVxuICAgICAgICBzdHlsZT1cInBhZGRpbmctdG9wOiB7dG9wfXB4OyBwYWRkaW5nLWJvdHRvbToge2JvdHRvbX1weDtcIlxuICAgID5cbiAgICAgICAgeyNlYWNoIHZpc2libGUgYXMgcm93IChyb3cuaW5kZXgpfVxuICAgICAgICAgICAgPHN2ZWx0ZS12aXJ0dWFsLWxpc3Qtcm93PlxuICAgICAgICAgICAgICAgIDxzbG90IGl0ZW09e3Jvdy5kYXRhfSBpPXtyb3cuaW5kZXh9IHtob3Zlckl0ZW1JbmRleH1cbiAgICAgICAgICAgICAgICAgICAgPk1pc3NpbmcgdGVtcGxhdGU8L3Nsb3RcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3N2ZWx0ZS12aXJ0dWFsLWxpc3Qtcm93PlxuICAgICAgICB7L2VhY2h9XG4gICAgPC9zdmVsdGUtdmlydHVhbC1saXN0LWNvbnRlbnRzPlxuPC9zdmVsdGUtdmlydHVhbC1saXN0LXZpZXdwb3J0PlxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThISSw0QkFBNEIsY0FBQyxDQUFDLEFBQzFCLFFBQVEsQ0FBRSxRQUFRLENBQ2xCLFVBQVUsQ0FBRSxJQUFJLENBQ2hCLDBCQUEwQixDQUFFLEtBQUssQ0FDakMsT0FBTyxDQUFFLEtBQUssQUFDbEIsQ0FBQyxBQUVELDBDQUE0QixDQUM1Qix1QkFBdUIsY0FBQyxDQUFDLEFBQ3JCLE9BQU8sQ0FBRSxLQUFLLEFBQ2xCLENBQUMsQUFFRCx1QkFBdUIsY0FBQyxDQUFDLEFBQ3JCLFFBQVEsQ0FBRSxNQUFNLEFBQ3BCLENBQUMifQ== */"; - append_dev(document.head, style); -} - function get_each_context(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[23] = list[i]; @@ -12527,7 +12493,6 @@ function instance($$self, $$props, $$invalidate) { class VirtualList extends SvelteComponentDev { constructor(options) { super(options); - if (!document.getElementById("svelte-g2cagw-style")) add_css(); init(this, options, instance, create_fragment, safe_not_equal, { items: 11, diff --git a/test/src/index.js b/test/src/index.js index b036d030..ef7bd829 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -35,7 +35,7 @@ function focus(element, setFocus) { fulfil(true); }); - setFocus(); + if (setFocus) setFocus(); }); } From cc329e4ea9024f3829dea95b759931420982d44a Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 23 Mar 2021 10:20:14 +1100 Subject: [PATCH 165/635] fixing tests --- .gitignore | 4 +- src/Select.svelte | 13 +- test/public/index.js | 12574 ----------------------------------------- test/src/index.js | 25 +- 4 files changed, 25 insertions(+), 12591 deletions(-) delete mode 100644 test/public/index.js diff --git a/.gitignore b/.gitignore index 2d895478..f0ee4766 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ node_modules .idea .nova /dist/ -# /test/public/index.js -# /test/public/bundle.js \ No newline at end of file +/test/public/index.js +/test/public/bundle.css \ No newline at end of file diff --git a/src/Select.svelte b/src/Select.svelte index bf8d18b9..4df3ab2a 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -125,7 +125,7 @@ $: updateValueDisplay(items); - function setvalue() { + function setValue() { if (typeof value === 'string') { value = { [optionIdentifier]: value, @@ -300,7 +300,7 @@ } $: { - if (value) setvalue(); + if (value) setValue(); } $: { @@ -626,6 +626,7 @@ async function loadList() { await tick(); + if (!List) return; if (target && list) return; if (isVirtualList && !VirtualList) { @@ -659,10 +660,9 @@ 'z-index': 2, visibility: 'hidden', }); - + if (list) list.$destroy(); list = list; - target = target; if (container) container.appendChild(target); @@ -715,19 +715,18 @@ listOpen = false; }); - (list = list), (target = target); getPosition(); } onMount(async () => { if (!List) List = await importInternalComponent('List'); - if (isFocused && input) input.focus(); if (listOpen) loadList(); - if (items && items.length > 0) { originalItemsClone = JSON.stringify(items); } + + dispatch('ready'); }); onDestroy(() => { diff --git a/test/public/index.js b/test/public/index.js deleted file mode 100644 index a7b49fc3..00000000 --- a/test/public/index.js +++ /dev/null @@ -1,12574 +0,0 @@ -// https://github.com/Rich-Harris/namey-mcnameface - -const animals = [ - 'aardvark', - 'aardwolf', - 'albatross', - 'alligator', - 'alpaca', - 'amphibian', - 'anaconda', - 'angelfish', - 'anglerfish', - 'ant', - 'anteater', - 'antelope', - 'antlion', - 'ape', - 'aphid', - 'armadillo', - 'asp', - 'baboon', - 'badger', - 'bandicoot', - 'barnacle', - 'barracuda', - 'basilisk', - 'bass', - 'bat', - 'bear', - 'beaver', - 'bedbug', - 'bee', - 'beetle', - 'bird', - 'bison', - 'blackbird', - 'boa', - 'boar', - 'bobcat', - 'bobolink', - 'bonobo', - 'booby', - 'bovid', - 'bug', - 'butterfly', - 'buzzard', - 'camel', - 'canid', - 'capybara', - 'cardinal', - 'caribou', - 'carp', - 'cat', - 'catshark', - 'caterpillar', - 'catfish', - 'cattle', - 'centipede', - 'cephalopod', - 'chameleon', - 'cheetah', - 'chickadee', - 'chicken', - 'chimpanzee', - 'chinchilla', - 'chipmunk', - 'clam', - 'clownfish', - 'cobra', - 'cockroach', - 'cod', - 'condor', - 'constrictor', - 'coral', - 'cougar', - 'cow', - 'coyote', - 'crab', - 'crane', - 'crawdad', - 'crayfish', - 'cricket', - 'crocodile', - 'crow', - 'cuckoo', - 'cicada', - 'damselfly', - 'deer', - 'dingo', - 'dinosaur', - 'dog', - 'dolphin', - 'donkey', - 'dormouse', - 'dove', - 'dragonfly', - 'dragon', - 'duck', - 'eagle', - 'earthworm', - 'earwig', - 'echidna', - 'eel', - 'egret', - 'elephant', - 'elk', - 'emu', - 'ermine', - 'falcon', - 'ferret', - 'finch', - 'firefly', - 'fish', - 'flamingo', - 'flea', - 'fly', - 'flyingfish', - 'fowl', - 'fox', - 'frog', - 'gamefowl', - 'galliform', - 'gazelle', - 'gecko', - 'gerbil', - 'gibbon', - 'giraffe', - 'goat', - 'goldfish', - 'goose', - 'gopher', - 'gorilla', - 'grasshopper', - 'grouse', - 'guan', - 'guanaco', - 'guineafowl', - 'gull', - 'guppy', - 'haddock', - 'halibut', - 'hamster', - 'hare', - 'harrier', - 'hawk', - 'hedgehog', - 'heron', - 'herring', - 'hippopotamus', - 'hookworm', - 'hornet', - 'horse', - 'hoverfly', - 'hummingbird', - 'hyena', - 'iguana', - 'impala', - 'jackal', - 'jaguar', - 'jay', - 'jellyfish', - 'junglefowl', - 'kangaroo', - 'kingfisher', - 'kite', - 'kiwi', - 'koala', - 'koi', - 'krill', - 'ladybug', - 'lamprey', - 'landfowl', - 'lark', - 'leech', - 'lemming', - 'lemur', - 'leopard', - 'leopon', - 'limpet', - 'lion', - 'lizard', - 'llama', - 'lobster', - 'locust', - 'loon', - 'louse', - 'lungfish', - 'lynx', - 'macaw', - 'mackerel', - 'magpie', - 'mammal', - 'manatee', - 'mandrill', - 'marlin', - 'marmoset', - 'marmot', - 'marsupial', - 'marten', - 'mastodon', - 'meadowlark', - 'meerkat', - 'mink', - 'minnow', - 'mite', - 'mockingbird', - 'mole', - 'mollusk', - 'mongoose', - 'monkey', - 'moose', - 'mosquito', - 'moth', - 'mouse', - 'mule', - 'muskox', - 'narwhal', - 'newt', - 'nightingale', - 'ocelot', - 'octopus', - 'opossum', - 'orangutan', - 'orca', - 'ostrich', - 'otter', - 'owl', - 'ox', - 'panda', - 'panther', - 'parakeet', - 'parrot', - 'parrotfish', - 'partridge', - 'peacock', - 'peafowl', - 'pelican', - 'penguin', - 'perch', - 'pheasant', - 'pig', - 'pigeon', - 'pike', - 'pinniped', - 'piranha', - 'planarian', - 'platypus', - 'pony', - 'porcupine', - 'porpoise', - 'possum', - 'prawn', - 'primate', - 'ptarmigan', - 'puffin', - 'puma', - 'python', - 'quail', - 'quelea', - 'quokka', - 'rabbit', - 'raccoon', - 'rat', - 'rattlesnake', - 'raven', - 'reindeer', - 'reptile', - 'rhinoceros', - 'roadrunner', - 'rodent', - 'rook', - 'rooster', - 'roundworm', - 'sailfish', - 'salamander', - 'salmon', - 'sawfish', - 'scallop', - 'scorpion', - 'seahorse', - 'shark', - 'sheep', - 'shrew', - 'shrimp', - 'silkworm', - 'silverfish', - 'skink', - 'skunk', - 'sloth', - 'slug', - 'smelt', - 'snail', - 'snake', - 'snipe', - 'sole', - 'sparrow', - 'spider', - 'spoonbill', - 'squid', - 'squirrel', - 'starfish', - 'stingray', - 'stoat', - 'stork', - 'sturgeon', - 'swallow', - 'swan', - 'swift', - 'swordfish', - 'swordtail', - 'tahr', - 'takin', - 'tapir', - 'tarantula', - 'tarsier', - 'termite', - 'tern', - 'thrush', - 'tick', - 'tiger', - 'tiglon', - 'toad', - 'tortoise', - 'toucan', - 'trout', - 'tuna', - 'turkey', - 'turtle', - 'urial', - 'vicuna', - 'viper', - 'vole', - 'vulture', - 'wallaby', - 'walrus', - 'wasp', - 'warbler', - 'weasel', - 'whale', - 'whippet', - 'whitefish', - 'wildcat', - 'wildebeest', - 'wildfowl', - 'wolf', - 'wolverine', - 'wombat', - 'woodpecker', - 'worm', - 'wren', - 'xerinae', - 'yak', - 'zebra', - 'alpaca', - 'cat', - 'cattle', - 'chicken', - 'dog', - 'donkey', - 'ferret', - 'gayal', - 'goldfish', - 'guppy', - 'horse', - 'koi', - 'llama', - 'sheep', - 'yak', -]; -var adjectives = [ - 'aback', - 'abaft', - 'abandoned', - 'abashed', - 'aberrant', - 'abhorrent', - 'abiding', - 'abject', - 'ablaze', - 'able', - 'abnormal', - 'aboard', - 'aboriginal', - 'abortive', - 'abounding', - 'abrasive', - 'abrupt', - 'absent', - 'absolute', - 'absorbed', - 'absorbing', - 'abstracted', - 'absurd', - 'abundant', - 'abusive', - 'academic', - 'acceptable', - 'accessible', - 'accidental', - 'acclaimed', - 'accomplished', - 'accurate', - 'aching', - 'acid', - 'acidic', - 'acoustic', - 'acrid', - 'acrobatic', - 'active', - 'actual', - 'actually', - 'ad hoc', - 'adamant', - 'adaptable', - 'addicted', - 'adept', - 'adhesive', - 'adjoining', - 'admirable', - 'admired', - 'adolescent', - 'adorable', - 'adored', - 'advanced', - 'adventurous', - 'affectionate', - 'afraid', - 'aged', - 'aggravating', - 'aggressive', - 'agile', - 'agitated', - 'agonizing', - 'agreeable', - 'ahead', - 'ajar', - 'alarmed', - 'alarming', - 'alcoholic', - 'alert', - 'alienated', - 'alike', - 'alive', - 'all', - 'alleged', - 'alluring', - 'aloof', - 'altruistic', - 'amazing', - 'ambiguous', - 'ambitious', - 'amiable', - 'ample', - 'amuck', - 'amused', - 'amusing', - 'anchored', - 'ancient', - 'ancient', - 'angelic', - 'angry', - 'angry', - 'anguished', - 'animated', - 'annoyed', - 'annoying', - 'annual', - 'another', - 'antique', - 'antsy', - 'anxious', - 'any', - 'apathetic', - 'appetizing', - 'apprehensive', - 'appropriate', - 'apt', - 'aquatic', - 'arctic', - 'arid', - 'aromatic', - 'arrogant', - 'artistic', - 'ashamed', - 'aspiring', - 'assorted', - 'assured', - 'astonishing', - 'athletic', - 'attached', - 'attentive', - 'attractive', - 'auspicious', - 'austere', - 'authentic', - 'authorized', - 'automatic', - 'available', - 'avaricious', - 'average', - 'awake', - 'aware', - 'awesome', - 'awful', - 'awkward', - 'axiomatic', - 'babyish', - 'back', - 'bad', - 'baggy', - 'barbarous', - 'bare', - 'barren', - 'bashful', - 'basic', - 'batty', - 'bawdy', - 'beautiful', - 'beefy', - 'befitting', - 'belated', - 'belligerent', - 'beloved', - 'beneficial', - 'bent', - 'berserk', - 'best', - 'better', - 'bewildered', - 'bewitched', - 'big', - 'big-hearted', - 'billowy', - 'biodegradable', - 'bite-sized', - 'biting', - 'bitter', - 'bizarre', - 'black', - 'black-and-white', - 'bland', - 'blank', - 'blaring', - 'bleak', - 'blind', - 'blissful', - 'blond', - 'bloody', - 'blue', - 'blue-eyed', - 'blushing', - 'bogus', - 'boiling', - 'bold', - 'bony', - 'boorish', - 'bored', - 'boring', - 'bossy', - 'both', - 'bouncy', - 'boundless', - 'bountiful', - 'bowed', - 'brainy', - 'brash', - 'brave', - 'brawny', - 'breakable', - 'breezy', - 'brief', - 'bright', - 'brilliant', - 'brisk', - 'broad', - 'broken', - 'bronze', - 'brown', - 'bruised', - 'bubbly', - 'bulky', - 'bumpy', - 'buoyant', - 'burdensome', - 'burly', - 'bustling', - 'busy', - 'buttery', - 'buzzing', - 'cagey', - 'calculating', - 'callous', - 'calm', - 'candid', - 'canine', - 'capable', - 'capital', - 'capricious', - 'carefree', - 'careful', - 'careless', - 'caring', - 'cautious', - 'cavernous', - 'ceaseless', - 'celebrated', - 'certain', - 'changeable', - 'charming', - 'cheap', - 'cheeky', - 'cheerful', - 'cheery', - 'chemical', - 'chief', - 'childlike', - 'chilly', - 'chivalrous', - 'chubby', - 'chunky', - 'circular', - 'clammy', - 'classic', - 'classy', - 'clean', - 'clear', - 'clear-cut', - 'clever', - 'cloistered', - 'close', - 'closed', - 'cloudy', - 'clueless', - 'clumsy', - 'cluttered', - 'coarse', - 'coherent', - 'cold', - 'colorful', - 'colorless', - 'colossal', - 'colossal', - 'combative', - 'comfortable', - 'common', - 'compassionate', - 'competent', - 'complete', - 'complex', - 'complicated', - 'composed', - 'concerned', - 'concrete', - 'condemned', - 'condescending', - 'confused', - 'conscious', - 'considerate', - 'constant', - 'contemplative', - 'content', - 'conventional', - 'convincing', - 'convoluted', - 'cooing', - 'cooked', - 'cool', - 'cooperative', - 'coordinated', - 'corny', - 'corrupt', - 'costly', - 'courageous', - 'courteous', - 'cowardly', - 'crabby', - 'crafty', - 'craven', - 'crazy', - 'creamy', - 'creative', - 'creepy', - 'criminal', - 'crisp', - 'critical', - 'crooked', - 'crowded', - 'cruel', - 'crushing', - 'cuddly', - 'cultivated', - 'cultured', - 'cumbersome', - 'curious', - 'curly', - 'curved', - 'curvy', - 'cut', - 'cute', - 'cylindrical', - 'cynical', - 'daffy', - 'daily', - 'damaged', - 'damaging', - 'damp', - 'dangerous', - 'dapper', - 'dapper', - 'daring', - 'dark', - 'darling', - 'dashing', - 'dazzling', - 'dead', - 'deadly', - 'deadpan', - 'deafening', - 'dear', - 'dearest', - 'debonair', - 'decayed', - 'deceitful', - 'decent', - 'decimal', - 'decisive', - 'decorous', - 'deep', - 'deeply', - 'defeated', - 'defective', - 'defenseless', - 'defensive', - 'defiant', - 'deficient', - 'definite', - 'delayed', - 'delectable', - 'delicate', - 'delicious', - 'delightful', - 'delirious', - 'demanding', - 'demonic', - 'dense', - 'dental', - 'dependable', - 'dependent', - 'depraved', - 'depressed', - 'deranged', - 'descriptive', - 'deserted', - 'despicable', - 'detailed', - 'determined', - 'devilish', - 'devoted', - 'didactic', - 'different', - 'difficult', - 'digital', - 'dilapidated', - 'diligent', - 'dim', - 'diminutive', - 'dimpled', - 'dimwitted', - 'direct', - 'direful', - 'dirty', - 'disagreeable', - 'disastrous', - 'discreet', - 'discrete', - 'disfigured', - 'disguised', - 'disgusted', - 'disgusting', - 'dishonest', - 'disillusioned', - 'disloyal', - 'dismal', - 'dispensable', - 'distant', - 'distinct', - 'distorted', - 'distraught', - 'distressed', - 'disturbed', - 'divergent', - 'dizzy', - 'domineering', - 'dopey', - 'doting', - 'double', - 'doubtful', - 'downright', - 'drab', - 'draconian', - 'drafty', - 'drained', - 'dramatic', - 'dreary', - 'droopy', - 'drunk', - 'dry', - 'dual', - 'dull', - 'dull', - 'dusty', - 'dutiful', - 'dynamic', - 'dysfunctional', - 'each', - 'eager', - 'early', - 'earnest', - 'earsplitting', - 'earthy', - 'easy', - 'easy-going', - 'eatable', - 'economic', - 'ecstatic', - 'edible', - 'educated', - 'efficacious', - 'efficient', - 'eight', - 'elaborate', - 'elastic', - 'elated', - 'elderly', - 'electric', - 'elegant', - 'elementary', - 'elfin', - 'elite', - 'elliptical', - 'emaciated', - 'embarrassed', - 'embellished', - 'eminent', - 'emotional', - 'empty', - 'enchanted', - 'enchanting', - 'encouraging', - 'endurable', - 'energetic', - 'enlightened', - 'enormous', - 'enraged', - 'entertaining', - 'enthusiastic', - 'entire', - 'envious', - 'envious', - 'equable', - 'equal', - 'equatorial', - 'erect', - 'erratic', - 'essential', - 'esteemed', - 'ethereal', - 'ethical', - 'euphoric', - 'evanescent', - 'evasive', - 'even', - 'evergreen', - 'everlasting', - 'every', - 'evil', - 'exalted', - 'exasperated', - 'excellent', - 'excitable', - 'excited', - 'exciting', - 'exclusive', - 'exemplary', - 'exhausted', - 'exhilarated', - 'exotic', - 'expensive', - 'experienced', - 'expert', - 'extensive', - 'extra-large', - 'extraneous', - 'extra-small', - 'extroverted', - 'exuberant', - 'exultant', - 'fabulous', - 'faded', - 'failing', - 'faint', - 'fair', - 'faithful', - 'fake', - 'fallacious', - 'false', - 'familiar', - 'famous', - 'fanatical', - 'fancy', - 'fantastic', - 'far', - 'faraway', - 'far-flung', - 'far-off', - 'fascinated', - 'fast', - 'fat', - 'fatal', - 'fatherly', - 'faulty', - 'favorable', - 'favorite', - 'fearful', - 'fearless', - 'feeble', - 'feigned', - 'feisty', - 'feline', - 'female', - 'feminine', - 'fertile', - 'festive', - 'few', - 'fickle', - 'fierce', - 'filthy', - 'fine', - 'finicky', - 'finished', - 'firm', - 'first', - 'firsthand', - 'fitting', - 'five', - 'fixed', - 'flagrant', - 'flaky', - 'flamboyant', - 'flashy', - 'flat', - 'flawed', - 'flawless', - 'flickering', - 'flimsy', - 'flippant', - 'floppy', - 'flowery', - 'flufy', - 'fluid', - 'flustered', - 'fluttering', - 'foamy', - 'focused', - 'fond', - 'foolhardy', - 'foolish', - 'forceful', - 'foregoing', - 'forgetful', - 'forked', - 'formal', - 'forsaken', - 'forthright', - 'fortunate', - 'four', - 'fragile', - 'fragrant', - 'frail', - 'frank', - 'frantic', - 'frayed', - 'free', - 'freezing', - 'french', - 'frequent', - 'fresh', - 'fretful', - 'friendly', - 'frightened', - 'frightening', - 'frigid', - 'frilly', - 'frivolous', - 'frizzy', - 'front', - 'frosty', - 'frothy', - 'frozen', - 'frugal', - 'fruitful', - 'frustrating', - 'full', - 'fumbling', - 'fumbling', - 'functional', - 'funny', - 'furry', - 'furtive', - 'fussy', - 'future', - 'futuristic', - 'fuzzy', - 'gabby', - 'gainful', - 'gamy', - 'gaping', - 'gargantuan', - 'garrulous', - 'gaseous', - 'gaudy', - 'general', - 'general', - 'generous', - 'gentle', - 'genuine', - 'ghastly', - 'giant', - 'giddy', - 'gifted', - 'gigantic', - 'giving', - 'glamorous', - 'glaring', - 'glass', - 'gleaming', - 'gleeful', - 'glib', - 'glistening', - 'glittering', - 'gloomy', - 'glorious', - 'glossy', - 'glum', - 'godly', - 'golden', - 'good', - 'good-natured', - 'goofy', - 'gorgeous', - 'graceful', - 'gracious', - 'grand', - 'grandiose', - 'grandiose', - 'granular', - 'grateful', - 'gratis', - 'grave', - 'gray', - 'greasy', - 'great', - 'greedy', - 'green', - 'gregarious', - 'grey', - 'grieving', - 'grim', - 'grimy', - 'gripping', - 'grizzled', - 'groovy', - 'gross', - 'grotesque', - 'grouchy', - 'grounded', - 'growing', - 'growling', - 'grown', - 'grubby', - 'gruesome', - 'grumpy', - 'guarded', - 'guiltless', - 'guilty', - 'gullible', - 'gummy', - 'gusty', - 'guttural', - 'habitual', - 'hairy', - 'half', - 'half', - 'hallowed', - 'halting', - 'handmade', - 'handsome', - 'handsomely', - 'handy', - 'hanging', - 'hapless', - 'happy', - 'happy-go-lucky', - 'hard', - 'hard-to-find', - 'harebrained', - 'harmful', - 'harmless', - 'harmonious', - 'harsh', - 'hasty', - 'hateful', - 'haunting', - 'heady', - 'healthy', - 'heartbreaking', - 'heartfelt', - 'hearty', - 'heavenly', - 'heavy', - 'hefty', - 'hellish', - 'helpful', - 'helpless', - 'hesitant', - 'hidden', - 'hideous', - 'high', - 'highfalutin', - 'high-level', - 'high-pitched', - 'hilarious', - 'hissing', - 'historical', - 'hoarse', - 'holistic', - 'hollow', - 'homeless', - 'homely', - 'honest', - 'honorable', - 'honored', - 'hopeful', - 'horrible', - 'horrific', - 'hospitable', - 'hot', - 'huge', - 'hulking', - 'humble', - 'humdrum', - 'humiliating', - 'humming', - 'humongous', - 'humorous', - 'hungry', - 'hurried', - 'hurt', - 'hurtful', - 'hushed', - 'husky', - 'hypnotic', - 'hysterical', - 'icky', - 'icy', - 'ideal', - 'ideal', - 'idealistic', - 'identical', - 'idiotic', - 'idle', - 'idolized', - 'ignorant', - 'ill', - 'illegal', - 'ill-fated', - 'ill-informed', - 'illiterate', - 'illustrious', - 'imaginary', - 'imaginative', - 'immaculate', - 'immaterial', - 'immediate', - 'immense', - 'imminent', - 'impartial', - 'impassioned', - 'impeccable', - 'imperfect', - 'imperturbable', - 'impish', - 'impolite', - 'important', - 'imported', - 'impossible', - 'impractical', - 'impressionable', - 'impressive', - 'improbable', - 'impure', - 'inborn', - 'incandescent', - 'incomparable', - 'incompatible', - 'incompetent', - 'incomplete', - 'inconclusive', - 'inconsequential', - 'incredible', - 'indelible', - 'indolent', - 'industrious', - 'inexpensive', - 'inexperienced', - 'infamous', - 'infantile', - 'infatuated', - 'inferior', - 'infinite', - 'informal', - 'innate', - 'innocent', - 'inquisitive', - 'insecure', - 'insidious', - 'insignificant', - 'insistent', - 'instinctive', - 'instructive', - 'insubstantial', - 'intelligent', - 'intent', - 'intentional', - 'interesting', - 'internal', - 'international', - 'intrepid', - 'intrigued', - 'invincible', - 'irate', - 'ironclad', - 'irresponsible', - 'irritable', - 'irritating', - 'itchy', - 'jaded', - 'jagged', - 'jam-packed', - 'jaunty', - 'jazzy', - 'jealous', - 'jittery', - 'jobless', - 'joint', - 'jolly', - 'jovial', - 'joyful', - 'joyous', - 'jubilant', - 'judicious', - 'juicy', - 'jumbled', - 'jumbo', - 'jumpy', - 'jumpy', - 'junior', - 'juvenile', - 'kaleidoscopic', - 'kaput', - 'keen', - 'key', - 'kind', - 'kindhearted', - 'kindly', - 'klutzy', - 'knobby', - 'knotty', - 'knowing', - 'knowledgeable', - 'known', - 'kooky', - 'kosher', - 'labored', - 'lackadaisical', - 'lacking', - 'lame', - 'lame', - 'lamentable', - 'languid', - 'lanky', - 'large', - 'last', - 'lasting', - 'late', - 'laughable', - 'lavish', - 'lawful', - 'lazy', - 'leading', - 'leafy', - 'lean', - 'learned', - 'left', - 'legal', - 'legitimate', - 'lethal', - 'level', - 'lewd', - 'light', - 'lighthearted', - 'likable', - 'like', - 'likeable', - 'likely', - 'limited', - 'limp', - 'limping', - 'linear', - 'lined', - 'liquid', - 'literate', - 'little', - 'live', - 'lively', - 'livid', - 'living', - 'loathsome', - 'lone', - 'lonely', - 'long', - 'longing', - 'long-term', - 'loose', - 'lopsided', - 'lost', - 'loud', - 'loutish', - 'lovable', - 'lovely', - 'loving', - 'low', - 'lowly', - 'loyal', - 'lucky', - 'ludicrous', - 'lumbering', - 'luminous', - 'lumpy', - 'lush', - 'lustrous', - 'luxuriant', - 'luxurious', - 'lying', - 'lyrical', - 'macabre', - 'macho', - 'mad', - 'maddening', - 'made-up', - 'madly', - 'magenta', - 'magical', - 'magnificent', - 'majestic', - 'major', - 'makeshift', - 'male', - 'malicious', - 'mammoth', - 'maniacal', - 'many', - 'marked', - 'married', - 'marvelous', - 'masculine', - 'massive', - 'material', - 'materialistic', - 'mature', - 'meager', - 'mealy', - 'mean', - 'measly', - 'meaty', - 'medical', - 'mediocre', - 'medium', - 'meek', - 'melancholy', - 'mellow', - 'melodic', - 'melted', - 'memorable', - 'menacing', - 'merciful', - 'mere', - 'merry', - 'messy', - 'metallic', - 'mighty', - 'mild', - 'military', - 'milky', - 'mindless', - 'miniature', - 'minor', - 'minty', - 'minute', - 'miscreant', - 'miserable', - 'miserly', - 'misguided', - 'mistaken', - 'misty', - 'mixed', - 'moaning', - 'modern', - 'modest', - 'moist', - 'moldy', - 'momentous', - 'monstrous', - 'monthly', - 'monumental', - 'moody', - 'moral', - 'mortified', - 'motherly', - 'motionless', - 'mountainous', - 'muddled', - 'muddy', - 'muffled', - 'multicolored', - 'mundane', - 'mundane', - 'murky', - 'mushy', - 'musty', - 'mute', - 'muted', - 'mysterious', - 'naive', - 'nappy', - 'narrow', - 'nasty', - 'natural', - 'naughty', - 'nauseating', - 'nautical', - 'near', - 'neat', - 'nebulous', - 'necessary', - 'needless', - 'needy', - 'negative', - 'neglected', - 'negligible', - 'neighboring', - 'neighborly', - 'nervous', - 'nervous', - 'new', - 'next', - 'nice', - 'nice', - 'nifty', - 'nimble', - 'nine', - 'nippy', - 'nocturnal', - 'noiseless', - 'noisy', - 'nonchalant', - 'nondescript', - 'nonsensical', - 'nonstop', - 'normal', - 'nostalgic', - 'nosy', - 'notable', - 'noted', - 'noteworthy', - 'novel', - 'noxious', - 'null', - 'numb', - 'numberless', - 'numerous', - 'nutritious', - 'nutty', - 'oafish', - 'obedient', - 'obeisant', - 'obese', - 'oblivious', - 'oblong', - 'obnoxious', - 'obscene', - 'obsequious', - 'observant', - 'obsolete', - 'obtainable', - 'obvious', - 'occasional', - 'oceanic', - 'odd', - 'oddball', - 'offbeat', - 'offensive', - 'official', - 'oily', - 'old', - 'old-fashioned', - 'omniscient', - 'one', - 'onerous', - 'only', - 'open', - 'opposite', - 'optimal', - 'optimistic', - 'opulent', - 'orange', - 'orderly', - 'ordinary', - 'organic', - 'original', - 'ornate', - 'ornery', - 'ossified', - 'other', - 'our', - 'outgoing', - 'outlandish', - 'outlying', - 'outrageous', - 'outstanding', - 'oval', - 'overconfident', - 'overcooked', - 'overdue', - 'overjoyed', - 'overlooked', - 'overrated', - 'overt', - 'overwrought', - 'painful', - 'painstaking', - 'palatable', - 'pale', - 'paltry', - 'panicky', - 'panoramic', - 'parallel', - 'parched', - 'parsimonious', - 'partial', - 'passionate', - 'past', - 'pastel', - 'pastoral', - 'pathetic', - 'peaceful', - 'penitent', - 'peppery', - 'perfect', - 'perfumed', - 'periodic', - 'perky', - 'permissible', - 'perpetual', - 'perplexed', - 'personal', - 'pertinent', - 'pesky', - 'pessimistic', - 'petite', - 'petty', - 'petty', - 'phobic', - 'phony', - 'physical', - 'picayune', - 'piercing', - 'pink', - 'piquant', - 'pitiful', - 'placid', - 'plain', - 'plaintive', - 'plant', - 'plastic', - 'plausible', - 'playful', - 'pleasant', - 'pleased', - 'pleasing', - 'plucky', - 'plump', - 'plush', - 'pointed', - 'pointless', - 'poised', - 'polished', - 'polite', - 'political', - 'pompous', - 'poor', - 'popular', - 'portly', - 'posh', - 'positive', - 'possessive', - 'possible', - 'potable', - 'powerful', - 'powerless', - 'practical', - 'precious', - 'premium', - 'present', - 'present', - 'prestigious', - 'pretty', - 'previous', - 'pricey', - 'prickly', - 'primary', - 'prime', - 'pristine', - 'private', - 'prize', - 'probable', - 'productive', - 'profitable', - 'profuse', - 'proper', - 'protective', - 'proud', - 'prudent', - 'psychedelic', - 'psychotic', - 'public', - 'puffy', - 'pumped', - 'punctual', - 'pungent', - 'puny', - 'pure', - 'purple', - 'purring', - 'pushy', - 'pushy', - 'putrid', - 'puzzled', - 'puzzling', - 'quack', - 'quaint', - 'quaint', - 'qualified', - 'quarrelsome', - 'quarterly', - 'queasy', - 'querulous', - 'questionable', - 'quick', - 'quickest', - 'quick-witted', - 'quiet', - 'quintessential', - 'quirky', - 'quixotic', - 'quixotic', - 'quizzical', - 'rabid', - 'racial', - 'radiant', - 'ragged', - 'rainy', - 'rambunctious', - 'rampant', - 'rapid', - 'rare', - 'rash', - 'raspy', - 'ratty', - 'raw', - 'ready', - 'real', - 'realistic', - 'reasonable', - 'rebel', - 'recent', - 'receptive', - 'reckless', - 'recondite', - 'rectangular', - 'red', - 'redundant', - 'reflecting', - 'reflective', - 'regal', - 'regular', - 'reliable', - 'relieved', - 'remarkable', - 'reminiscent', - 'remorseful', - 'remote', - 'repentant', - 'repulsive', - 'required', - 'resolute', - 'resonant', - 'respectful', - 'responsible', - 'responsive', - 'revolving', - 'rewarding', - 'rhetorical', - 'rich', - 'right', - 'righteous', - 'rightful', - 'rigid', - 'ringed', - 'ripe', - 'ritzy', - 'roasted', - 'robust', - 'romantic', - 'roomy', - 'rosy', - 'rotating', - 'rotten', - 'rotund', - 'rough', - 'round', - 'rowdy', - 'royal', - 'rubbery', - 'ruddy', - 'rude', - 'rundown', - 'runny', - 'rural', - 'rustic  rusty', - 'ruthless', - 'sable', - 'sad', - 'safe', - 'salty', - 'same', - 'sandy', - 'sane', - 'sarcastic', - 'sardonic', - 'sassy', - 'satisfied', - 'satisfying', - 'savory', - 'scaly', - 'scandalous', - 'scant', - 'scarce', - 'scared', - 'scary', - 'scattered', - 'scented', - 'scholarly', - 'scientific', - 'scintillating', - 'scornful', - 'scratchy', - 'scrawny', - 'screeching', - 'second', - 'secondary', - 'second-hand', - 'secret', - 'secretive', - 'sedate', - 'seemly', - 'selective', - 'self-assured', - 'selfish', - 'self-reliant', - 'sentimental', - 'separate', - 'serene', - 'serious', - 'serpentine', - 'several', - 'severe', - 'shabby', - 'shadowy', - 'shady', - 'shaggy', - 'shaky', - 'shallow', - 'shameful', - 'shameless', - 'sharp', - 'shimmering', - 'shiny', - 'shivering', - 'shocked', - 'shocking', - 'shoddy', - 'short', - 'short-term', - 'showy', - 'shrill', - 'shut', - 'shy', - 'sick', - 'silent', - 'silky', - 'silly', - 'silver', - 'similar', - 'simple', - 'simplistic', - 'sincere', - 'sinful', - 'single', - 'six', - 'sizzling', - 'skeletal', - 'skillful', - 'skinny', - 'sleepy', - 'slight', - 'slim', - 'slimy', - 'slippery', - 'sloppy', - 'slow', - 'slushy', - 'small', - 'smarmy', - 'smart', - 'smelly', - 'smiling', - 'smoggy', - 'smooth', - 'smug', - 'snappy', - 'snarling', - 'sneaky', - 'sniveling', - 'snobbish', - 'snoopy', - 'snotty', - 'sociable', - 'soft', - 'soggy', - 'solid', - 'somber', - 'some', - 'sophisticated', - 'sordid', - 'sore', - 'sorrowful', - 'soulful', - 'soupy', - 'sour', - 'sour', - 'spanish', - 'sparkling', - 'sparse', - 'special', - 'specific', - 'spectacular', - 'speedy', - 'spherical', - 'spicy', - 'spiffy', - 'spiky', - 'spirited', - 'spiritual', - 'spiteful', - 'splendid', - 'spooky', - 'spotless', - 'spotted', - 'spotty', - 'spry', - 'spurious', - 'squalid', - 'square', - 'squeaky', - 'squealing', - 'squeamish', - 'squiggly', - 'stable', - 'staid', - 'stained', - 'staking', - 'stale', - 'standard', - 'standing', - 'starchy', - 'stark', - 'starry', - 'statuesque', - 'steadfast', - 'steady', - 'steel', - 'steep', - 'stereotyped', - 'sticky', - 'stiff', - 'stimulating', - 'stingy', - 'stormy', - 'stout', - 'straight', - 'strange', - 'strict', - 'strident', - 'striking', - 'striped', - 'strong', - 'studious', - 'stunning', - 'stunning', - 'stupendous', - 'stupid', - 'sturdy', - 'stylish', - 'subdued', - 'submissive', - 'subsequent', - 'substantial', - 'subtle', - 'suburban', - 'successful', - 'succinct', - 'succulent', - 'sudden', - 'sugary', - 'sulky', - 'sunny', - 'super', - 'superb', - 'superficial', - 'superior', - 'supportive', - 'supreme', - 'sure-footed', - 'surprised', - 'suspicious', - 'svelte', - 'swanky', - 'sweaty', - 'sweet', - 'sweltering', - 'swift', - 'sympathetic', - 'symptomatic', - 'synonymous', - 'taboo', - 'tacit', - 'tacky', - 'talented', - 'talkative', - 'tall', - 'tame', - 'tan', - 'tangible', - 'tangy', - 'tart', - 'tasteful', - 'tasteless', - 'tasty', - 'tattered', - 'taut', - 'tawdry', - 'tearful', - 'tedious', - 'teeming', - 'teeny', - 'teeny-tiny', - 'telling', - 'temporary', - 'tempting', - 'ten', - 'tender', - 'tense', - 'tenuous', - 'tepid', - 'terrible', - 'terrific', - 'tested', - 'testy', - 'thankful', - 'that', - 'therapeutic', - 'these', - 'thick', - 'thin', - 'thinkable', - 'third', - 'thirsty', - 'this', - 'thorny', - 'thorough', - 'those', - 'thoughtful', - 'thoughtless', - 'threadbare', - 'threatening', - 'three', - 'thrifty', - 'thundering', - 'thunderous', - 'tidy', - 'tight', - 'tightfisted', - 'timely', - 'tinted', - 'tiny', - 'tired', - 'tiresome', - 'toothsome', - 'torn', - 'torpid', - 'total', - 'tough', - 'towering', - 'tragic', - 'trained', - 'tranquil', - 'trashy', - 'traumatic', - 'treasured', - 'tremendous', - 'triangular', - 'tricky', - 'trifling', - 'trim', - 'trite', - 'trivial', - 'troubled', - 'truculent', - 'true', - 'trusting', - 'trustworthy', - 'trusty', - 'truthful', - 'tubby', - 'turbulent', - 'twin', - 'two', - 'typical', - 'ubiquitous', - 'ugliest', - 'ugly', - 'ultimate', - 'ultra', - 'unable', - 'unaccountable', - 'unarmed', - 'unaware', - 'unbecoming', - 'unbiased', - 'uncomfortable', - 'uncommon', - 'unconscious', - 'uncovered', - 'understated', - 'understood', - 'undesirable', - 'unequal', - 'unequaled', - 'uneven', - 'unfinished', - 'unfit', - 'unfolded', - 'unfortunate', - 'unhappy', - 'unhealthy', - 'uniform', - 'unimportant', - 'uninterested', - 'unique', - 'united', - 'unkempt', - 'unknown', - 'unlawful', - 'unlined', - 'unlucky', - 'unnatural', - 'unpleasant', - 'unrealistic', - 'unripe', - 'unruly', - 'unselfish', - 'unsightly', - 'unsteady', - 'unsuitable', - 'unsung', - 'untidy', - 'untimely', - 'untried', - 'untrue', - 'unused', - 'unusual', - 'unwelcome', - 'unwieldy', - 'unwitting', - 'unwritten', - 'upbeat', - 'uppity', - 'upright', - 'upset', - 'uptight', - 'urban', - 'usable', - 'used', - 'used', - 'useful', - 'useless', - 'utilized', - 'utopian', - 'utter', - 'uttermost', - 'vacant', - 'vacuous', - 'vagabond', - 'vague', - 'vain', - 'valid', - 'valuable', - 'vapid', - 'variable', - 'various', - 'vast', - 'velvety', - 'venerated', - 'vengeful', - 'venomous', - 'verdant', - 'verifiable', - 'versed', - 'vexed', - 'vibrant', - 'vicious', - 'victorious', - 'vigilant', - 'vigorous', - 'villainous', - 'violent', - 'violet', - 'virtual', - 'virtuous', - 'visible', - 'vital', - 'vivacious', - 'vivid', - 'voiceless', - 'volatile', - 'voluminous', - 'voracious', - 'vulgar', - 'wacky', - 'waggish', - 'waiting', - 'wakeful', - 'wan', - 'wandering', - 'wanting', - 'warlike', - 'warm', - 'warmhearted', - 'warped', - 'wary', - 'wasteful', - 'watchful', - 'waterlogged', - 'watery', - 'wavy', - 'weak', - 'wealthy', - 'weary', - 'webbed', - 'wee', - 'weekly', - 'weepy', - 'weighty', - 'weird', - 'welcome', - 'well-documented', - 'well-groomed', - 'well-informed', - 'well-lit', - 'well-made', - 'well-off', - 'well-to-do', - 'well-worn', - 'wet', - 'which', - 'whimsical', - 'whirlwind', - 'whispered', - 'whispering', - 'white', - 'whole', - 'wholesale', - 'whopping', - 'wicked', - 'wide', - 'wide-eyed', - 'wiggly', - 'wild', - 'willing', - 'wilted', - 'winding', - 'windy', - 'winged', - 'wiry', - 'wise', - 'wistful', - 'witty', - 'wobbly', - 'woebegone', - 'woeful', - 'womanly', - 'wonderful', - 'wooden', - 'woozy', - 'wordy', - 'workable', - 'worldly', - 'worn', - 'worried', - 'worrisome', - 'worse', - 'worst', - 'worthless', - 'worthwhile', - 'worthy', - 'wrathful', - 'wretched', - 'writhing', - 'wrong', - 'wry', - 'xenophobic', - 'yawning', - 'yearly', - 'yellow', - 'yellowish', - 'yielding', - 'young', - 'youthful', - 'yummy', - 'zany', - 'zealous', - 'zesty', - 'zigzag', - 'zippy', - 'zonked', -]; - -function pickRandom(array) { - return array[~~(Math.random() * array.length)]; -} - -function nameyMcNameface(mcMode) { - if (mcMode === void 0) mcMode = false; - - var animal = pickRandom(animals); - if (mcMode) { - animal = 'mc' + animal.substr(0, 1).toUpperCase() + animal.substr(1); - } - - return pickRandom(adjectives) + '-' + animal; -} - -function normalizeHtml(html) { - const div = document.createElement('div'); - div.innerHTML = html - .replace(//g, '') - .replace(//g, '') - .replace(//g, '') - .replace(//g, '') - .replace(/svelte-ref-\w+/g, '') - .replace(/\s*svelte-\w+\s*/g, '') - .replace(/class=""/g, '') - .replace(/style=""/g, '') - .replace(/>\s+/g, '>') - .replace(/\s+ 1 || node.childNodes[0].nodeType !== 3) { - const first = node.childNodes[0]; - const last = node.childNodes[node.childNodes.length - 1]; - - const head = `\n${spaces} `; - const tail = `\n${spaces}`; - - if (first.nodeType === 3) { - first.data = `${head}${first.data}`; - } else { - node.insertBefore(document.createTextNode(head), first); - } - - if (last.nodeType === 3) { - last.data = `${last.data}${tail}`; - } else { - node.appendChild(document.createTextNode(tail)); - } - - let lastType = null; - for (let i = 0; i < node.childNodes.length; i += 1) { - const child = node.childNodes[i]; - if (child.nodeType === 1) { - indent(node.childNodes[i], `${spaces} `); - - if (lastType === 1) { - node.insertBefore(document.createTextNode(head), child); - i += 1; - } - } - - lastType = child.nodeType; - } - } -} - -function noop() { } -function assign(tar, src) { - // @ts-ignore - for (const k in src) - tar[k] = src[k]; - return tar; -} -function add_location(element, file, line, column, char) { - element.__svelte_meta = { - loc: { file, line, column, char } - }; -} -function run(fn) { - return fn(); -} -function blank_object() { - return Object.create(null); -} -function run_all(fns) { - fns.forEach(run); -} -function is_function(thing) { - return typeof thing === 'function'; -} -function safe_not_equal(a, b) { - return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); -} -function is_empty(obj) { - return Object.keys(obj).length === 0; -} -function create_slot(definition, ctx, $$scope, fn) { - if (definition) { - const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); - return definition[0](slot_ctx); - } -} -function get_slot_context(definition, ctx, $$scope, fn) { - return definition[1] && fn - ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) - : $$scope.ctx; -} -function get_slot_changes(definition, $$scope, dirty, fn) { - if (definition[2] && fn) { - const lets = definition[2](fn(dirty)); - if ($$scope.dirty === undefined) { - return lets; - } - if (typeof lets === 'object') { - const merged = []; - const len = Math.max($$scope.dirty.length, lets.length); - for (let i = 0; i < len; i += 1) { - merged[i] = $$scope.dirty[i] | lets[i]; - } - return merged; - } - return $$scope.dirty | lets; - } - return $$scope.dirty; -} -function update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) { - const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn); - if (slot_changes) { - const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn); - slot.p(slot_context, slot_changes); - } -} - -function append(target, node) { - target.appendChild(node); -} -function insert(target, node, anchor) { - target.insertBefore(node, anchor || null); -} -function detach(node) { - node.parentNode.removeChild(node); -} -function destroy_each(iterations, detaching) { - for (let i = 0; i < iterations.length; i += 1) { - if (iterations[i]) - iterations[i].d(detaching); - } -} -function element(name) { - return document.createElement(name); -} -function svg_element(name) { - return document.createElementNS('http://www.w3.org/2000/svg', name); -} -function text(data) { - return document.createTextNode(data); -} -function space() { - return text(' '); -} -function empty() { - return text(''); -} -function listen(node, event, handler, options) { - node.addEventListener(event, handler, options); - return () => node.removeEventListener(event, handler, options); -} -function prevent_default(fn) { - return function (event) { - event.preventDefault(); - // @ts-ignore - return fn.call(this, event); - }; -} -function attr(node, attribute, value) { - if (value == null) - node.removeAttribute(attribute); - else if (node.getAttribute(attribute) !== value) - node.setAttribute(attribute, value); -} -function set_attributes(node, attributes) { - // @ts-ignore - const descriptors = Object.getOwnPropertyDescriptors(node.__proto__); - for (const key in attributes) { - if (attributes[key] == null) { - node.removeAttribute(key); - } - else if (key === 'style') { - node.style.cssText = attributes[key]; - } - else if (key === '__value') { - node.value = node[key] = attributes[key]; - } - else if (descriptors[key] && descriptors[key].set) { - node[key] = attributes[key]; - } - else { - attr(node, key, attributes[key]); - } - } -} -function set_custom_element_data(node, prop, value) { - if (prop in node) { - node[prop] = value; - } - else { - attr(node, prop, value); - } -} -function children(element) { - return Array.from(element.childNodes); -} -function set_input_value(input, value) { - input.value = value == null ? '' : value; -} -function set_style(node, key, value, important) { - node.style.setProperty(key, value, important ? 'important' : ''); -} -// unfortunately this can't be a constant as that wouldn't be tree-shakeable -// so we cache the result instead -let crossorigin; -function is_crossorigin() { - if (crossorigin === undefined) { - crossorigin = false; - try { - if (typeof window !== 'undefined' && window.parent) { - void window.parent.document; - } - } - catch (error) { - crossorigin = true; - } - } - return crossorigin; -} -function add_resize_listener(node, fn) { - const computed_style = getComputedStyle(node); - if (computed_style.position === 'static') { - node.style.position = 'relative'; - } - const iframe = element('iframe'); - iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' + - 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;'); - iframe.setAttribute('aria-hidden', 'true'); - iframe.tabIndex = -1; - const crossorigin = is_crossorigin(); - let unsubscribe; - if (crossorigin) { - iframe.src = "data:text/html,"; - unsubscribe = listen(window, 'message', (event) => { - if (event.source === iframe.contentWindow) - fn(); - }); - } - else { - iframe.src = 'about:blank'; - iframe.onload = () => { - unsubscribe = listen(iframe.contentWindow, 'resize', fn); - }; - } - append(node, iframe); - return () => { - if (crossorigin) { - unsubscribe(); - } - else if (unsubscribe && iframe.contentWindow) { - unsubscribe(); - } - detach(iframe); - }; -} -function toggle_class(element, name, toggle) { - element.classList[toggle ? 'add' : 'remove'](name); -} -function custom_event(type, detail) { - const e = document.createEvent('CustomEvent'); - e.initCustomEvent(type, false, false, detail); - return e; -} -class HtmlTag { - constructor(anchor = null) { - this.a = anchor; - this.e = this.n = null; - } - m(html, target, anchor = null) { - if (!this.e) { - this.e = element(target.nodeName); - this.t = target; - this.h(html); - } - this.i(anchor); - } - h(html) { - this.e.innerHTML = html; - this.n = Array.from(this.e.childNodes); - } - i(anchor) { - for (let i = 0; i < this.n.length; i += 1) { - insert(this.t, this.n[i], anchor); - } - } - p(html) { - this.d(); - this.h(html); - this.i(this.a); - } - d() { - this.n.forEach(detach); - } -} - -let current_component; -function set_current_component(component) { - current_component = component; -} -function get_current_component() { - if (!current_component) - throw new Error('Function called outside component initialization'); - return current_component; -} -function beforeUpdate(fn) { - get_current_component().$$.before_update.push(fn); -} -function onMount(fn) { - get_current_component().$$.on_mount.push(fn); -} -function onDestroy(fn) { - get_current_component().$$.on_destroy.push(fn); -} -function createEventDispatcher() { - const component = get_current_component(); - return (type, detail) => { - const callbacks = component.$$.callbacks[type]; - if (callbacks) { - // TODO are there situations where events could be dispatched - // in a server (non-DOM) environment? - const event = custom_event(type, detail); - callbacks.slice().forEach(fn => { - fn.call(component, event); - }); - } - }; -} - -const dirty_components = []; -const binding_callbacks = []; -const render_callbacks = []; -const flush_callbacks = []; -const resolved_promise = Promise.resolve(); -let update_scheduled = false; -function schedule_update() { - if (!update_scheduled) { - update_scheduled = true; - resolved_promise.then(flush); - } -} -function tick() { - schedule_update(); - return resolved_promise; -} -function add_render_callback(fn) { - render_callbacks.push(fn); -} -function add_flush_callback(fn) { - flush_callbacks.push(fn); -} -let flushing = false; -const seen_callbacks = new Set(); -function flush() { - if (flushing) - return; - flushing = true; - do { - // first, call beforeUpdate functions - // and update components - for (let i = 0; i < dirty_components.length; i += 1) { - const component = dirty_components[i]; - set_current_component(component); - update(component.$$); - } - set_current_component(null); - dirty_components.length = 0; - while (binding_callbacks.length) - binding_callbacks.pop()(); - // then, once components are updated, call - // afterUpdate functions. This may cause - // subsequent updates... - for (let i = 0; i < render_callbacks.length; i += 1) { - const callback = render_callbacks[i]; - if (!seen_callbacks.has(callback)) { - // ...so guard against infinite loops - seen_callbacks.add(callback); - callback(); - } - } - render_callbacks.length = 0; - } while (dirty_components.length); - while (flush_callbacks.length) { - flush_callbacks.pop()(); - } - update_scheduled = false; - flushing = false; - seen_callbacks.clear(); -} -function update($$) { - if ($$.fragment !== null) { - $$.update(); - run_all($$.before_update); - const dirty = $$.dirty; - $$.dirty = [-1]; - $$.fragment && $$.fragment.p($$.ctx, dirty); - $$.after_update.forEach(add_render_callback); - } -} -const outroing = new Set(); -let outros; -function group_outros() { - outros = { - r: 0, - c: [], - p: outros // parent group - }; -} -function check_outros() { - if (!outros.r) { - run_all(outros.c); - } - outros = outros.p; -} -function transition_in(block, local) { - if (block && block.i) { - outroing.delete(block); - block.i(local); - } -} -function transition_out(block, local, detach, callback) { - if (block && block.o) { - if (outroing.has(block)) - return; - outroing.add(block); - outros.c.push(() => { - outroing.delete(block); - if (callback) { - if (detach) - block.d(1); - callback(); - } - }); - block.o(local); - } -} - -const globals = (typeof window !== 'undefined' - ? window - : typeof globalThis !== 'undefined' - ? globalThis - : global); -function outro_and_destroy_block(block, lookup) { - transition_out(block, 1, 1, () => { - lookup.delete(block.key); - }); -} -function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) { - let o = old_blocks.length; - let n = list.length; - let i = o; - const old_indexes = {}; - while (i--) - old_indexes[old_blocks[i].key] = i; - const new_blocks = []; - const new_lookup = new Map(); - const deltas = new Map(); - i = n; - while (i--) { - const child_ctx = get_context(ctx, list, i); - const key = get_key(child_ctx); - let block = lookup.get(key); - if (!block) { - block = create_each_block(key, child_ctx); - block.c(); - } - else if (dynamic) { - block.p(child_ctx, dirty); - } - new_lookup.set(key, new_blocks[i] = block); - if (key in old_indexes) - deltas.set(key, Math.abs(i - old_indexes[key])); - } - const will_move = new Set(); - const did_move = new Set(); - function insert(block) { - transition_in(block, 1); - block.m(node, next); - lookup.set(block.key, block); - next = block.first; - n--; - } - while (o && n) { - const new_block = new_blocks[n - 1]; - const old_block = old_blocks[o - 1]; - const new_key = new_block.key; - const old_key = old_block.key; - if (new_block === old_block) { - // do nothing - next = new_block.first; - o--; - n--; - } - else if (!new_lookup.has(old_key)) { - // remove old block - destroy(old_block, lookup); - o--; - } - else if (!lookup.has(new_key) || will_move.has(new_key)) { - insert(new_block); - } - else if (did_move.has(old_key)) { - o--; - } - else if (deltas.get(new_key) > deltas.get(old_key)) { - did_move.add(new_key); - insert(new_block); - } - else { - will_move.add(old_key); - o--; - } - } - while (o--) { - const old_block = old_blocks[o]; - if (!new_lookup.has(old_block.key)) - destroy(old_block, lookup); - } - while (n) - insert(new_blocks[n - 1]); - return new_blocks; -} -function validate_each_keys(ctx, list, get_context, get_key) { - const keys = new Set(); - for (let i = 0; i < list.length; i++) { - const key = get_key(get_context(ctx, list, i)); - if (keys.has(key)) { - throw new Error('Cannot have duplicate keys in a keyed each'); - } - keys.add(key); - } -} - -function get_spread_update(levels, updates) { - const update = {}; - const to_null_out = {}; - const accounted_for = { $$scope: 1 }; - let i = levels.length; - while (i--) { - const o = levels[i]; - const n = updates[i]; - if (n) { - for (const key in o) { - if (!(key in n)) - to_null_out[key] = 1; - } - for (const key in n) { - if (!accounted_for[key]) { - update[key] = n[key]; - accounted_for[key] = 1; - } - } - levels[i] = n; - } - else { - for (const key in o) { - accounted_for[key] = 1; - } - } - } - for (const key in to_null_out) { - if (!(key in update)) - update[key] = undefined; - } - return update; -} -function get_spread_object(spread_props) { - return typeof spread_props === 'object' && spread_props !== null ? spread_props : {}; -} - -function bind(component, name, callback) { - const index = component.$$.props[name]; - if (index !== undefined) { - component.$$.bound[index] = callback; - callback(component.$$.ctx[index]); - } -} -function create_component(block) { - block && block.c(); -} -function mount_component(component, target, anchor, customElement) { - const { fragment, on_mount, on_destroy, after_update } = component.$$; - fragment && fragment.m(target, anchor); - if (!customElement) { - // onMount happens before the initial afterUpdate - add_render_callback(() => { - const new_on_destroy = on_mount.map(run).filter(is_function); - if (on_destroy) { - on_destroy.push(...new_on_destroy); - } - else { - // Edge case - component was destroyed immediately, - // most likely as a result of a binding initialising - run_all(new_on_destroy); - } - component.$$.on_mount = []; - }); - } - after_update.forEach(add_render_callback); -} -function destroy_component(component, detaching) { - const $$ = component.$$; - if ($$.fragment !== null) { - run_all($$.on_destroy); - $$.fragment && $$.fragment.d(detaching); - // TODO null out other refs, including component.$$ (but need to - // preserve final state?) - $$.on_destroy = $$.fragment = null; - $$.ctx = []; - } -} -function make_dirty(component, i) { - if (component.$$.dirty[0] === -1) { - dirty_components.push(component); - schedule_update(); - component.$$.dirty.fill(0); - } - component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); -} -function init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) { - const parent_component = current_component; - set_current_component(component); - const $$ = component.$$ = { - fragment: null, - ctx: null, - // state - props, - update: noop, - not_equal, - bound: blank_object(), - // lifecycle - on_mount: [], - on_destroy: [], - on_disconnect: [], - before_update: [], - after_update: [], - context: new Map(parent_component ? parent_component.$$.context : []), - // everything else - callbacks: blank_object(), - dirty, - skip_bound: false - }; - let ready = false; - $$.ctx = instance - ? instance(component, options.props || {}, (i, ret, ...rest) => { - const value = rest.length ? rest[0] : ret; - if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { - if (!$$.skip_bound && $$.bound[i]) - $$.bound[i](value); - if (ready) - make_dirty(component, i); - } - return ret; - }) - : []; - $$.update(); - ready = true; - run_all($$.before_update); - // `false` as a special case of no DOM component - $$.fragment = create_fragment ? create_fragment($$.ctx) : false; - if (options.target) { - if (options.hydrate) { - const nodes = children(options.target); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.l(nodes); - nodes.forEach(detach); - } - else { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.c(); - } - if (options.intro) - transition_in(component.$$.fragment); - mount_component(component, options.target, options.anchor, options.customElement); - flush(); - } - set_current_component(parent_component); -} -/** - * Base class for Svelte components. Used when dev=false. - */ -class SvelteComponent { - $destroy() { - destroy_component(this, 1); - this.$destroy = noop; - } - $on(type, callback) { - const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); - callbacks.push(callback); - return () => { - const index = callbacks.indexOf(callback); - if (index !== -1) - callbacks.splice(index, 1); - }; - } - $set($$props) { - if (this.$$set && !is_empty($$props)) { - this.$$.skip_bound = true; - this.$$set($$props); - this.$$.skip_bound = false; - } - } -} - -function dispatch_dev(type, detail) { - document.dispatchEvent(custom_event(type, Object.assign({ version: '3.35.0' }, detail))); -} -function append_dev(target, node) { - dispatch_dev('SvelteDOMInsert', { target, node }); - append(target, node); -} -function insert_dev(target, node, anchor) { - dispatch_dev('SvelteDOMInsert', { target, node, anchor }); - insert(target, node, anchor); -} -function detach_dev(node) { - dispatch_dev('SvelteDOMRemove', { node }); - detach(node); -} -function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) { - const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : []; - if (has_prevent_default) - modifiers.push('preventDefault'); - if (has_stop_propagation) - modifiers.push('stopPropagation'); - dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers }); - const dispose = listen(node, event, handler, options); - return () => { - dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers }); - dispose(); - }; -} -function attr_dev(node, attribute, value) { - attr(node, attribute, value); - if (value == null) - dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute }); - else - dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value }); -} -function set_data_dev(text, data) { - data = '' + data; - if (text.wholeText === data) - return; - dispatch_dev('SvelteDOMSetData', { node: text, data }); - text.data = data; -} -function validate_each_argument(arg) { - if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) { - let msg = '{#each} only iterates over array-like objects.'; - if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) { - msg += ' You can use a spread to convert this iterable into an array.'; - } - throw new Error(msg); - } -} -function validate_slots(name, slot, keys) { - for (const slot_key of Object.keys(slot)) { - if (!~keys.indexOf(slot_key)) { - console.warn(`<${name}> received an unexpected slot "${slot_key}".`); - } - } -} -/** - * Base class for Svelte components with some minor dev-enhancements. Used when dev=true. - */ -class SvelteComponentDev extends SvelteComponent { - constructor(options) { - if (!options || (!options.target && !options.$$inline)) { - throw new Error("'target' is a required option"); - } - super(); - } - $destroy() { - super.$destroy(); - this.$destroy = () => { - console.warn('Component was already destroyed'); // eslint-disable-line no-console - }; - } - $capture_state() { } - $inject_state() { } -} - -/* test/src/CustomItem.svelte generated by Svelte v3.35.0 */ - -const file$d = "test/src/CustomItem.svelte"; - -function create_fragment$d(ctx) { - let div3; - let img; - let img_src_value; - let img_alt_value; - let t0; - let div2; - let div0; - let t1_value = /*item*/ ctx[0].name + ""; - let t1; - let t2; - let div1; - let t3_value = /*item*/ ctx[0].tagline + ""; - let t3; - let div3_class_value; - - const block = { - c: function create() { - div3 = element("div"); - img = element("img"); - t0 = space(); - div2 = element("div"); - div0 = element("div"); - t1 = text(t1_value); - t2 = space(); - div1 = element("div"); - t3 = text(t3_value); - if (img.src !== (img_src_value = /*item*/ ctx[0].image_url)) attr_dev(img, "src", img_src_value); - attr_dev(img, "alt", img_alt_value = /*item*/ ctx[0].name); - attr_dev(img, "class", "svelte-1vo37vn"); - add_location(img, file$d, 19, 2, 416); - attr_dev(div0, "class", "customItem_name svelte-1vo37vn"); - add_location(div0, file$d, 21, 4, 500); - attr_dev(div1, "class", "customItem_tagline svelte-1vo37vn"); - add_location(div1, file$d, 22, 4, 551); - attr_dev(div2, "class", "customItem_title svelte-1vo37vn"); - add_location(div2, file$d, 20, 2, 465); - attr_dev(div3, "class", div3_class_value = "customItem " + /*itemClasses*/ ctx[1] + " svelte-1vo37vn"); - add_location(div3, file$d, 18, 0, 375); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div3, anchor); - append_dev(div3, img); - append_dev(div3, t0); - append_dev(div3, div2); - append_dev(div2, div0); - append_dev(div0, t1); - append_dev(div2, t2); - append_dev(div2, div1); - append_dev(div1, t3); - }, - p: function update(ctx, [dirty]) { - if (dirty & /*item*/ 1 && img.src !== (img_src_value = /*item*/ ctx[0].image_url)) { - attr_dev(img, "src", img_src_value); - } - - if (dirty & /*item*/ 1 && img_alt_value !== (img_alt_value = /*item*/ ctx[0].name)) { - attr_dev(img, "alt", img_alt_value); - } - - if (dirty & /*item*/ 1 && t1_value !== (t1_value = /*item*/ ctx[0].name + "")) set_data_dev(t1, t1_value); - if (dirty & /*item*/ 1 && t3_value !== (t3_value = /*item*/ ctx[0].tagline + "")) set_data_dev(t3, t3_value); - - if (dirty & /*itemClasses*/ 2 && div3_class_value !== (div3_class_value = "customItem " + /*itemClasses*/ ctx[1] + " svelte-1vo37vn")) { - attr_dev(div3, "class", div3_class_value); - } - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div3); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$d.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$d($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("CustomItem", slots, []); - let { isActive = false } = $$props; - let { isFirst = false } = $$props; - let { isHover = false } = $$props; - let { item = undefined } = $$props; - let itemClasses = ""; - const writable_props = ["isActive", "isFirst", "isHover", "item"]; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - $$self.$$set = $$props => { - if ("isActive" in $$props) $$invalidate(2, isActive = $$props.isActive); - if ("isFirst" in $$props) $$invalidate(3, isFirst = $$props.isFirst); - if ("isHover" in $$props) $$invalidate(4, isHover = $$props.isHover); - if ("item" in $$props) $$invalidate(0, item = $$props.item); - }; - - $$self.$capture_state = () => ({ - isActive, - isFirst, - isHover, - item, - itemClasses - }); - - $$self.$inject_state = $$props => { - if ("isActive" in $$props) $$invalidate(2, isActive = $$props.isActive); - if ("isFirst" in $$props) $$invalidate(3, isFirst = $$props.isFirst); - if ("isHover" in $$props) $$invalidate(4, isHover = $$props.isHover); - if ("item" in $$props) $$invalidate(0, item = $$props.item); - if ("itemClasses" in $$props) $$invalidate(1, itemClasses = $$props.itemClasses); - }; - - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*isActive, isFirst, isHover*/ 28) { - { - const classes = []; - - if (isActive) { - classes.push("active"); - } - - if (isFirst) { - classes.push("first"); - } - - if (isHover) { - classes.push("hover"); - } - - $$invalidate(1, itemClasses = classes.join(" ")); - } - } - }; - - return [item, itemClasses, isActive, isFirst, isHover]; -} - -class CustomItem extends SvelteComponentDev { - constructor(options) { - super(options); - - init(this, options, instance$d, create_fragment$d, safe_not_equal, { - isActive: 2, - isFirst: 3, - isHover: 4, - item: 0 - }); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "CustomItem", - options, - id: create_fragment$d.name - }); - } - - get isActive() { - return this.$$.ctx[2]; - } - - set isActive(isActive) { - this.$set({ isActive }); - flush(); - } - - get isFirst() { - return this.$$.ctx[3]; - } - - set isFirst(isFirst) { - this.$set({ isFirst }); - flush(); - } - - get isHover() { - return this.$$.ctx[4]; - } - - set isHover(isHover) { - this.$set({ isHover }); - flush(); - } - - get item() { - return this.$$.ctx[0]; - } - - set item(item) { - this.$set({ item }); - flush(); - } -} - -/* src/Item.svelte generated by Svelte v3.35.0 */ - -const file$c = "src/Item.svelte"; - -function create_fragment$c(ctx) { - let div; - let raw_value = /*getOptionLabel*/ ctx[0](/*item*/ ctx[1], /*filterText*/ ctx[2]) + ""; - let div_class_value; - - const block = { - c: function create() { - div = element("div"); - attr_dev(div, "class", div_class_value = "item " + /*itemClasses*/ ctx[3] + " svelte-1imzpmp"); - add_location(div, file$c, 69, 0, 1585); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - div.innerHTML = raw_value; - }, - p: function update(ctx, [dirty]) { - if (dirty & /*getOptionLabel, item, filterText*/ 7 && raw_value !== (raw_value = /*getOptionLabel*/ ctx[0](/*item*/ ctx[1], /*filterText*/ ctx[2]) + "")) div.innerHTML = raw_value; - if (dirty & /*itemClasses*/ 8 && div_class_value !== (div_class_value = "item " + /*itemClasses*/ ctx[3] + " svelte-1imzpmp")) { - attr_dev(div, "class", div_class_value); - } - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$c.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$c($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("Item", slots, []); - let { isActive = false } = $$props; - let { isFirst = false } = $$props; - let { isHover = false } = $$props; - let { getOptionLabel = undefined } = $$props; - let { item = undefined } = $$props; - let { filterText = "" } = $$props; - let itemClasses = ""; - const writable_props = ["isActive", "isFirst", "isHover", "getOptionLabel", "item", "filterText"]; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - $$self.$$set = $$props => { - if ("isActive" in $$props) $$invalidate(4, isActive = $$props.isActive); - if ("isFirst" in $$props) $$invalidate(5, isFirst = $$props.isFirst); - if ("isHover" in $$props) $$invalidate(6, isHover = $$props.isHover); - if ("getOptionLabel" in $$props) $$invalidate(0, getOptionLabel = $$props.getOptionLabel); - if ("item" in $$props) $$invalidate(1, item = $$props.item); - if ("filterText" in $$props) $$invalidate(2, filterText = $$props.filterText); - }; - - $$self.$capture_state = () => ({ - isActive, - isFirst, - isHover, - getOptionLabel, - item, - filterText, - itemClasses - }); - - $$self.$inject_state = $$props => { - if ("isActive" in $$props) $$invalidate(4, isActive = $$props.isActive); - if ("isFirst" in $$props) $$invalidate(5, isFirst = $$props.isFirst); - if ("isHover" in $$props) $$invalidate(6, isHover = $$props.isHover); - if ("getOptionLabel" in $$props) $$invalidate(0, getOptionLabel = $$props.getOptionLabel); - if ("item" in $$props) $$invalidate(1, item = $$props.item); - if ("filterText" in $$props) $$invalidate(2, filterText = $$props.filterText); - if ("itemClasses" in $$props) $$invalidate(3, itemClasses = $$props.itemClasses); - }; - - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*isActive, isFirst, isHover, item*/ 114) { - { - const classes = []; - - if (isActive) { - classes.push("active"); - } - - if (isFirst) { - classes.push("first"); - } - - if (isHover) { - classes.push("hover"); - } - - if (item.isGroupHeader) { - classes.push("groupHeader"); - } - - if (item.isGroupItem) { - classes.push("groupItem"); - } - - $$invalidate(3, itemClasses = classes.join(" ")); - } - } - }; - - return [getOptionLabel, item, filterText, itemClasses, isActive, isFirst, isHover]; -} - -class Item extends SvelteComponentDev { - constructor(options) { - super(options); - - init(this, options, instance$c, create_fragment$c, safe_not_equal, { - isActive: 4, - isFirst: 5, - isHover: 6, - getOptionLabel: 0, - item: 1, - filterText: 2 - }); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "Item", - options, - id: create_fragment$c.name - }); - } - - get isActive() { - return this.$$.ctx[4]; - } - - set isActive(isActive) { - this.$set({ isActive }); - flush(); - } - - get isFirst() { - return this.$$.ctx[5]; - } - - set isFirst(isFirst) { - this.$set({ isFirst }); - flush(); - } - - get isHover() { - return this.$$.ctx[6]; - } - - set isHover(isHover) { - this.$set({ isHover }); - flush(); - } - - get getOptionLabel() { - return this.$$.ctx[0]; - } - - set getOptionLabel(getOptionLabel) { - this.$set({ getOptionLabel }); - flush(); - } - - get item() { - return this.$$.ctx[1]; - } - - set item(item) { - this.$set({ item }); - flush(); - } - - get filterText() { - return this.$$.ctx[2]; - } - - set filterText(filterText) { - this.$set({ filterText }); - flush(); - } -} - -/* src/Selection.svelte generated by Svelte v3.35.0 */ - -const file$b = "src/Selection.svelte"; - -function create_fragment$b(ctx) { - let div; - let raw_value = /*getSelectionLabel*/ ctx[0](/*item*/ ctx[1]) + ""; - - const block = { - c: function create() { - div = element("div"); - attr_dev(div, "class", "selection svelte-pu1q1n"); - add_location(div, file$b, 13, 0, 230); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - div.innerHTML = raw_value; - }, - p: function update(ctx, [dirty]) { - if (dirty & /*getSelectionLabel, item*/ 3 && raw_value !== (raw_value = /*getSelectionLabel*/ ctx[0](/*item*/ ctx[1]) + "")) div.innerHTML = raw_value; }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$b.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$b($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("Selection", slots, []); - let { getSelectionLabel = undefined } = $$props; - let { item = undefined } = $$props; - const writable_props = ["getSelectionLabel", "item"]; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - $$self.$$set = $$props => { - if ("getSelectionLabel" in $$props) $$invalidate(0, getSelectionLabel = $$props.getSelectionLabel); - if ("item" in $$props) $$invalidate(1, item = $$props.item); - }; - - $$self.$capture_state = () => ({ getSelectionLabel, item }); - - $$self.$inject_state = $$props => { - if ("getSelectionLabel" in $$props) $$invalidate(0, getSelectionLabel = $$props.getSelectionLabel); - if ("item" in $$props) $$invalidate(1, item = $$props.item); - }; - - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } - - return [getSelectionLabel, item]; -} - -class Selection extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$b, create_fragment$b, safe_not_equal, { getSelectionLabel: 0, item: 1 }); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "Selection", - options, - id: create_fragment$b.name - }); - } - - get getSelectionLabel() { - return this.$$.ctx[0]; - } - - set getSelectionLabel(getSelectionLabel) { - this.$set({ getSelectionLabel }); - flush(); - } - - get item() { - return this.$$.ctx[1]; - } - - set item(item) { - this.$set({ item }); - flush(); - } -} - -/* src/MultiSelection.svelte generated by Svelte v3.35.0 */ -const file$a = "src/MultiSelection.svelte"; - -function get_each_context$2(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[4] = list[i]; - child_ctx[10] = i; - return child_ctx; -} - -// (88:8) {#if !isDisabled && !multiFullItemClearable} -function create_if_block$2(ctx) { - let div; - let svg; - let path; - let mounted; - let dispose; - - function click_handler(...args) { - return /*click_handler*/ ctx[6](/*i*/ ctx[10], ...args); - } - - const block = { - c: function create() { - div = element("div"); - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124 l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); - add_location(path, file$a, 99, 20, 3025); - attr_dev(svg, "width", "100%"); - attr_dev(svg, "height", "100%"); - attr_dev(svg, "viewBox", "-2 -2 50 50"); - attr_dev(svg, "focusable", "false"); - attr_dev(svg, "role", "presentation"); - attr_dev(svg, "class", "svelte-liu9pa"); - add_location(svg, file$a, 92, 16, 2795); - attr_dev(div, "class", "multiSelectItem_clear svelte-liu9pa"); - add_location(div, file$a, 88, 12, 2654); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, svg); - append_dev(svg, path); - - if (!mounted) { - dispose = listen_dev(div, "click", click_handler, false, false, false); - mounted = true; - } - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - mounted = false; - dispose(); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block$2.name, - type: "if", - source: "(88:8) {#if !isDisabled && !multiFullItemClearable}", - ctx - }); - - return block; -} - -// (77:0) {#each value as value, i} -function create_each_block$2(ctx) { - let div1; - let div0; - let raw_value = /*getSelectionLabel*/ ctx[3](/*value*/ ctx[4]) + ""; - let t0; - let t1; - let div1_class_value; - let mounted; - let dispose; - let if_block = !/*isDisabled*/ ctx[1] && !/*multiFullItemClearable*/ ctx[2] && create_if_block$2(ctx); - - function click_handler_1(...args) { - return /*click_handler_1*/ ctx[7](/*i*/ ctx[10], ...args); - } - - const block = { - c: function create() { - div1 = element("div"); - div0 = element("div"); - t0 = space(); - if (if_block) if_block.c(); - t1 = space(); - attr_dev(div0, "class", "multiSelectItem_label svelte-liu9pa"); - add_location(div0, file$a, 84, 8, 2493); - attr_dev(div1, "class", div1_class_value = "multiSelectItem " + (/*activeValue*/ ctx[0] === /*i*/ ctx[10] ? "active" : "") + " " + (/*isDisabled*/ ctx[1] ? "disabled" : "") + " svelte-liu9pa"); - add_location(div1, file$a, 77, 4, 2257); - }, - m: function mount(target, anchor) { - insert_dev(target, div1, anchor); - append_dev(div1, div0); - div0.innerHTML = raw_value; - append_dev(div1, t0); - if (if_block) if_block.m(div1, null); - append_dev(div1, t1); - - if (!mounted) { - dispose = listen_dev(div1, "click", click_handler_1, false, false, false); - mounted = true; - } - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - if (dirty & /*getSelectionLabel, value*/ 24 && raw_value !== (raw_value = /*getSelectionLabel*/ ctx[3](/*value*/ ctx[4]) + "")) div0.innerHTML = raw_value; - if (!/*isDisabled*/ ctx[1] && !/*multiFullItemClearable*/ ctx[2]) { - if (if_block) { - if_block.p(ctx, dirty); - } else { - if_block = create_if_block$2(ctx); - if_block.c(); - if_block.m(div1, t1); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - - if (dirty & /*activeValue, isDisabled*/ 3 && div1_class_value !== (div1_class_value = "multiSelectItem " + (/*activeValue*/ ctx[0] === /*i*/ ctx[10] ? "active" : "") + " " + (/*isDisabled*/ ctx[1] ? "disabled" : "") + " svelte-liu9pa")) { - attr_dev(div1, "class", div1_class_value); - } - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div1); - if (if_block) if_block.d(); - mounted = false; - dispose(); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block$2.name, - type: "each", - source: "(77:0) {#each value as value, i}", - ctx - }); - - return block; -} - -function create_fragment$a(ctx) { - let each_1_anchor; - let each_value = /*value*/ ctx[4]; - validate_each_argument(each_value); - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); - } - - const block = { - c: function create() { - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - each_1_anchor = empty(); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(target, anchor); - } - - insert_dev(target, each_1_anchor, anchor); - }, - p: function update(ctx, [dirty]) { - if (dirty & /*activeValue, isDisabled, multiFullItemClearable, handleClear, getSelectionLabel, value*/ 63) { - each_value = /*value*/ ctx[4]; - validate_each_argument(each_value); - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$2(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$2(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value.length; - } - }, - i: noop, - o: noop, - d: function destroy(detaching) { - destroy_each(each_blocks, detaching); - if (detaching) detach_dev(each_1_anchor); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$a.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$a($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("MultiSelection", slots, []); - const dispatch = createEventDispatcher(); - let { value = [] } = $$props; - let { activeValue = undefined } = $$props; - let { isDisabled = false } = $$props; - let { multiFullItemClearable = false } = $$props; - let { getSelectionLabel = undefined } = $$props; - - function handleClear(i, event) { - event.stopPropagation(); - dispatch("multiItemClear", { i }); - } - - const writable_props = [ - "value", - "activeValue", - "isDisabled", - "multiFullItemClearable", - "getSelectionLabel" - ]; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - const click_handler = (i, event) => handleClear(i, event); - const click_handler_1 = (i, event) => multiFullItemClearable ? handleClear(i, event) : {}; - - $$self.$$set = $$props => { - if ("value" in $$props) $$invalidate(4, value = $$props.value); - if ("activeValue" in $$props) $$invalidate(0, activeValue = $$props.activeValue); - if ("isDisabled" in $$props) $$invalidate(1, isDisabled = $$props.isDisabled); - if ("multiFullItemClearable" in $$props) $$invalidate(2, multiFullItemClearable = $$props.multiFullItemClearable); - if ("getSelectionLabel" in $$props) $$invalidate(3, getSelectionLabel = $$props.getSelectionLabel); - }; - - $$self.$capture_state = () => ({ - createEventDispatcher, - dispatch, - value, - activeValue, - isDisabled, - multiFullItemClearable, - getSelectionLabel, - handleClear - }); - - $$self.$inject_state = $$props => { - if ("value" in $$props) $$invalidate(4, value = $$props.value); - if ("activeValue" in $$props) $$invalidate(0, activeValue = $$props.activeValue); - if ("isDisabled" in $$props) $$invalidate(1, isDisabled = $$props.isDisabled); - if ("multiFullItemClearable" in $$props) $$invalidate(2, multiFullItemClearable = $$props.multiFullItemClearable); - if ("getSelectionLabel" in $$props) $$invalidate(3, getSelectionLabel = $$props.getSelectionLabel); - }; - - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } - - return [ - activeValue, - isDisabled, - multiFullItemClearable, - getSelectionLabel, - value, - handleClear, - click_handler, - click_handler_1 - ]; -} - -class MultiSelection extends SvelteComponentDev { - constructor(options) { - super(options); - - init(this, options, instance$a, create_fragment$a, safe_not_equal, { - value: 4, - activeValue: 0, - isDisabled: 1, - multiFullItemClearable: 2, - getSelectionLabel: 3 - }); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "MultiSelection", - options, - id: create_fragment$a.name - }); - } - - get value() { - return this.$$.ctx[4]; - } - - set value(value) { - this.$set({ value }); - flush(); - } - - get activeValue() { - return this.$$.ctx[0]; - } - - set activeValue(activeValue) { - this.$set({ activeValue }); - flush(); - } - - get isDisabled() { - return this.$$.ctx[1]; - } - - set isDisabled(isDisabled) { - this.$set({ isDisabled }); - flush(); - } - - get multiFullItemClearable() { - return this.$$.ctx[2]; - } - - set multiFullItemClearable(multiFullItemClearable) { - this.$set({ multiFullItemClearable }); - flush(); - } - - get getSelectionLabel() { - return this.$$.ctx[3]; - } - - set getSelectionLabel(getSelectionLabel) { - this.$set({ getSelectionLabel }); - flush(); - } -} - -function isOutOfViewport (elem) { - const bounding = elem.getBoundingClientRect(); - const out = {}; - - out.top = bounding.top < 0; - out.left = bounding.left < 0; - out.bottom = - bounding.bottom > - (window.innerHeight || document.documentElement.clientHeight); - out.right = - bounding.right > - (window.innerWidth || document.documentElement.clientWidth); - out.any = out.top || out.left || out.bottom || out.right; - - return out; -} - -function debounce(func, wait, immediate) { - let timeout; - - return function executedFunction() { - let context = this; - let args = arguments; - - let later = function () { - timeout = null; - if (!immediate) func.apply(context, args); - }; - - let callNow = immediate && !timeout; - - clearTimeout(timeout); - - timeout = setTimeout(later, wait); - - if (callNow) func.apply(context, args); - }; -} - -/* src/ClearIcon.svelte generated by Svelte v3.35.0 */ - -const file$9 = "src/ClearIcon.svelte"; - -function create_fragment$9(ctx) { - let svg; - let path; - - const block = { - c: function create() { - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "fill", "currentColor"); - attr_dev(path, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124\n l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); - add_location(path, file$9, 7, 4, 118); - attr_dev(svg, "width", "100%"); - attr_dev(svg, "height", "100%"); - attr_dev(svg, "viewBox", "-2 -2 50 50"); - attr_dev(svg, "focusable", "false"); - attr_dev(svg, "role", "presentation"); - add_location(svg, file$9, 0, 0, 0); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, svg, anchor); - append_dev(svg, path); - }, - p: noop, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(svg); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$9.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$9($$self, $$props) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("ClearIcon", slots, []); - const writable_props = []; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - return []; -} - -class ClearIcon extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$9, create_fragment$9, safe_not_equal, {}); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "ClearIcon", - options, - id: create_fragment$9.name - }); - } -} - -/* src/Select.svelte generated by Svelte v3.35.0 */ - -const { Object: Object_1, console: console_1 } = globals; -const file$8 = "src/Select.svelte"; - -// (918:4) {#if Icon} -function create_if_block_7(ctx) { - let switch_instance; - let switch_instance_anchor; - let current; - const switch_instance_spread_levels = [/*iconProps*/ ctx[18]]; - var switch_value = /*Icon*/ ctx[17]; - - function switch_props(ctx) { - let switch_instance_props = {}; - - for (let i = 0; i < switch_instance_spread_levels.length; i += 1) { - switch_instance_props = assign(switch_instance_props, switch_instance_spread_levels[i]); - } - - return { - props: switch_instance_props, - $$inline: true - }; - } - - if (switch_value) { - switch_instance = new switch_value(switch_props()); - } - - const block = { - c: function create() { - if (switch_instance) create_component(switch_instance.$$.fragment); - switch_instance_anchor = empty(); - }, - m: function mount(target, anchor) { - if (switch_instance) { - mount_component(switch_instance, target, anchor); - } - - insert_dev(target, switch_instance_anchor, anchor); - current = true; - }, - p: function update(ctx, dirty) { - const switch_instance_changes = (dirty[0] & /*iconProps*/ 262144) - ? get_spread_update(switch_instance_spread_levels, [get_spread_object(/*iconProps*/ ctx[18])]) - : {}; - - if (switch_value !== (switch_value = /*Icon*/ ctx[17])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; - - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); - - check_outros(); - } - - if (switch_value) { - switch_instance = new switch_value(switch_props()); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); - } else { - switch_instance = null; - } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(switch_instance_anchor); - if (switch_instance) destroy_component(switch_instance, detaching); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_7.name, - type: "if", - source: "(918:4) {#if Icon}", - ctx - }); - - return block; -} - -// (922:4) {#if isMulti && value && value.length > 0} -function create_if_block_6(ctx) { - let switch_instance; - let switch_instance_anchor; - let current; - var switch_value = /*MultiSelection*/ ctx[7]; - - function switch_props(ctx) { - return { - props: { - value: /*value*/ ctx[2], - getSelectionLabel: /*getSelectionLabel*/ ctx[13], - activeValue: /*activeValue*/ ctx[25], - isDisabled: /*isDisabled*/ ctx[10], - multiFullItemClearable: /*multiFullItemClearable*/ ctx[9] - }, - $$inline: true - }; - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - switch_instance.$on("multiItemClear", /*handleMultiItemClear*/ ctx[29]); - switch_instance.$on("focus", /*handleFocus*/ ctx[32]); - } - - const block = { - c: function create() { - if (switch_instance) create_component(switch_instance.$$.fragment); - switch_instance_anchor = empty(); - }, - m: function mount(target, anchor) { - if (switch_instance) { - mount_component(switch_instance, target, anchor); - } - - insert_dev(target, switch_instance_anchor, anchor); - current = true; - }, - p: function update(ctx, dirty) { - const switch_instance_changes = {}; - if (dirty[0] & /*value*/ 4) switch_instance_changes.value = /*value*/ ctx[2]; - if (dirty[0] & /*getSelectionLabel*/ 8192) switch_instance_changes.getSelectionLabel = /*getSelectionLabel*/ ctx[13]; - if (dirty[0] & /*activeValue*/ 33554432) switch_instance_changes.activeValue = /*activeValue*/ ctx[25]; - if (dirty[0] & /*isDisabled*/ 1024) switch_instance_changes.isDisabled = /*isDisabled*/ ctx[10]; - if (dirty[0] & /*multiFullItemClearable*/ 512) switch_instance_changes.multiFullItemClearable = /*multiFullItemClearable*/ ctx[9]; - - if (switch_value !== (switch_value = /*MultiSelection*/ ctx[7])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; - - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); - - check_outros(); - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - switch_instance.$on("multiItemClear", /*handleMultiItemClear*/ ctx[29]); - switch_instance.$on("focus", /*handleFocus*/ ctx[32]); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); - } else { - switch_instance = null; - } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(switch_instance_anchor); - if (switch_instance) destroy_component(switch_instance, detaching); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_6.name, - type: "if", - source: "(922:4) {#if isMulti && value && value.length > 0}", - ctx - }); - - return block; -} - -// (945:4) {:else} -function create_else_block_1$1(ctx) { - let input_1; - let mounted; - let dispose; - - let input_1_levels = [ - /*_inputAttributes*/ ctx[26], - { placeholder: /*placeholderText*/ ctx[28] }, - { style: /*inputStyles*/ ctx[15] } - ]; - - let input_1_data = {}; - - for (let i = 0; i < input_1_levels.length; i += 1) { - input_1_data = assign(input_1_data, input_1_levels[i]); - } - - const block = { - c: function create() { - input_1 = element("input"); - set_attributes(input_1, input_1_data); - toggle_class(input_1, "svelte-1ri8kk0", true); - add_location(input_1, file$8, 945, 8, 25497); - }, - m: function mount(target, anchor) { - insert_dev(target, input_1, anchor); - /*input_1_binding_1*/ ctx[68](input_1); - set_input_value(input_1, /*filterText*/ ctx[3]); - - if (!mounted) { - dispose = [ - listen_dev(input_1, "focus", /*handleFocus*/ ctx[32], false, false, false), - listen_dev(input_1, "input", /*input_1_input_handler_1*/ ctx[69]) - ]; - - mounted = true; - } - }, - p: function update(ctx, dirty) { - set_attributes(input_1, input_1_data = get_spread_update(input_1_levels, [ - dirty[0] & /*_inputAttributes*/ 67108864 && /*_inputAttributes*/ ctx[26], - dirty[0] & /*placeholderText*/ 268435456 && { placeholder: /*placeholderText*/ ctx[28] }, - dirty[0] & /*inputStyles*/ 32768 && { style: /*inputStyles*/ ctx[15] } - ])); - - if (dirty[0] & /*filterText*/ 8 && input_1.value !== /*filterText*/ ctx[3]) { - set_input_value(input_1, /*filterText*/ ctx[3]); - } - - toggle_class(input_1, "svelte-1ri8kk0", true); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(input_1); - /*input_1_binding_1*/ ctx[68](null); - mounted = false; - run_all(dispose); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block_1$1.name, - type: "else", - source: "(945:4) {:else}", - ctx - }); - - return block; -} - -// (935:4) {#if isDisabled} -function create_if_block_5(ctx) { - let input_1; - let mounted; - let dispose; - - let input_1_levels = [ - /*_inputAttributes*/ ctx[26], - { placeholder: /*placeholderText*/ ctx[28] }, - { style: /*inputStyles*/ ctx[15] }, - { disabled: true } - ]; - - let input_1_data = {}; - - for (let i = 0; i < input_1_levels.length; i += 1) { - input_1_data = assign(input_1_data, input_1_levels[i]); - } - - const block = { - c: function create() { - input_1 = element("input"); - set_attributes(input_1, input_1_data); - toggle_class(input_1, "svelte-1ri8kk0", true); - add_location(input_1, file$8, 935, 8, 25229); - }, - m: function mount(target, anchor) { - insert_dev(target, input_1, anchor); - /*input_1_binding*/ ctx[66](input_1); - set_input_value(input_1, /*filterText*/ ctx[3]); - - if (!mounted) { - dispose = [ - listen_dev(input_1, "focus", /*handleFocus*/ ctx[32], false, false, false), - listen_dev(input_1, "input", /*input_1_input_handler*/ ctx[67]) - ]; - - mounted = true; - } - }, - p: function update(ctx, dirty) { - set_attributes(input_1, input_1_data = get_spread_update(input_1_levels, [ - dirty[0] & /*_inputAttributes*/ 67108864 && /*_inputAttributes*/ ctx[26], - dirty[0] & /*placeholderText*/ 268435456 && { placeholder: /*placeholderText*/ ctx[28] }, - dirty[0] & /*inputStyles*/ 32768 && { style: /*inputStyles*/ ctx[15] }, - { disabled: true } - ])); - - if (dirty[0] & /*filterText*/ 8 && input_1.value !== /*filterText*/ ctx[3]) { - set_input_value(input_1, /*filterText*/ ctx[3]); - } - - toggle_class(input_1, "svelte-1ri8kk0", true); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(input_1); - /*input_1_binding*/ ctx[66](null); - mounted = false; - run_all(dispose); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_5.name, - type: "if", - source: "(935:4) {#if isDisabled}", - ctx - }); - - return block; -} - -// (956:4) {#if !isMulti && showSelectedItem} -function create_if_block_4(ctx) { - let div; - let switch_instance; - let current; - let mounted; - let dispose; - var switch_value = /*Selection*/ ctx[6]; - - function switch_props(ctx) { - return { - props: { - item: /*value*/ ctx[2], - getSelectionLabel: /*getSelectionLabel*/ ctx[13] - }, - $$inline: true - }; - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - } - - const block = { - c: function create() { - div = element("div"); - if (switch_instance) create_component(switch_instance.$$.fragment); - attr_dev(div, "class", "selectedItem svelte-1ri8kk0"); - add_location(div, file$8, 956, 8, 25782); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - - if (switch_instance) { - mount_component(switch_instance, div, null); - } - - current = true; - - if (!mounted) { - dispose = listen_dev(div, "focus", /*handleFocus*/ ctx[32], false, false, false); - mounted = true; - } - }, - p: function update(ctx, dirty) { - const switch_instance_changes = {}; - if (dirty[0] & /*value*/ 4) switch_instance_changes.item = /*value*/ ctx[2]; - if (dirty[0] & /*getSelectionLabel*/ 8192) switch_instance_changes.getSelectionLabel = /*getSelectionLabel*/ ctx[13]; - - if (switch_value !== (switch_value = /*Selection*/ ctx[6])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; - - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); - - check_outros(); - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, div, null); - } else { - switch_instance = null; - } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - if (switch_instance) destroy_component(switch_instance); - mounted = false; - dispose(); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_4.name, - type: "if", - source: "(956:4) {#if !isMulti && showSelectedItem}", - ctx - }); - - return block; -} - -// (966:4) {#if showSelectedItem && isClearable && !isDisabled && !isWaiting} -function create_if_block_3$1(ctx) { - let div; - let switch_instance; - let current; - let mounted; - let dispose; - var switch_value = /*ClearIcon*/ ctx[23]; - - function switch_props(ctx) { - return { $$inline: true }; - } - - if (switch_value) { - switch_instance = new switch_value(switch_props()); - } - - const block = { - c: function create() { - div = element("div"); - if (switch_instance) create_component(switch_instance.$$.fragment); - attr_dev(div, "class", "clearSelect svelte-1ri8kk0"); - add_location(div, file$8, 966, 8, 26080); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - - if (switch_instance) { - mount_component(switch_instance, div, null); - } - - current = true; - - if (!mounted) { - dispose = listen_dev(div, "click", prevent_default(/*handleClear*/ ctx[24]), false, true, false); - mounted = true; - } - }, - p: function update(ctx, dirty) { - if (switch_value !== (switch_value = /*ClearIcon*/ ctx[23])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; - - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); - - check_outros(); - } - - if (switch_value) { - switch_instance = new switch_value(switch_props()); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, div, null); - } else { - switch_instance = null; - } - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - if (switch_instance) destroy_component(switch_instance); - mounted = false; - dispose(); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_3$1.name, - type: "if", - source: "(966:4) {#if showSelectedItem && isClearable && !isDisabled && !isWaiting}", - ctx - }); - - return block; -} - -// (972:4) {#if showIndicator || (showChevron && !value) || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem))} -function create_if_block_1$1(ctx) { - let div; - - function select_block_type_1(ctx, dirty) { - if (/*indicatorSvg*/ ctx[22]) return create_if_block_2$1; - return create_else_block$1; - } - - let current_block_type = select_block_type_1(ctx); - let if_block = current_block_type(ctx); - - const block = { - c: function create() { - div = element("div"); - if_block.c(); - attr_dev(div, "class", "indicator svelte-1ri8kk0"); - add_location(div, file$8, 972, 8, 26388); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - if_block.m(div, null); - }, - p: function update(ctx, dirty) { - if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { - if_block.p(ctx, dirty); - } else { - if_block.d(1); - if_block = current_block_type(ctx); - - if (if_block) { - if_block.c(); - if_block.m(div, null); - } - } - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - if_block.d(); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_1$1.name, - type: "if", - source: "(972:4) {#if showIndicator || (showChevron && !value) || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem))}", - ctx - }); - - return block; -} - -// (976:12) {:else} -function create_else_block$1(ctx) { - let svg; - let path; - - const block = { - c: function create() { - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "d", "M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747\n 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0\n 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502\n 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0\n 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"); - add_location(path, file$8, 982, 20, 26704); - attr_dev(svg, "width", "100%"); - attr_dev(svg, "height", "100%"); - attr_dev(svg, "viewBox", "0 0 20 20"); - attr_dev(svg, "focusable", "false"); - attr_dev(svg, "class", "svelte-1ri8kk0"); - add_location(svg, file$8, 976, 16, 26516); - }, - m: function mount(target, anchor) { - insert_dev(target, svg, anchor); - append_dev(svg, path); - }, - p: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(svg); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block$1.name, - type: "else", - source: "(976:12) {:else}", - ctx - }); - - return block; -} - -// (974:12) {#if indicatorSvg} -function create_if_block_2$1(ctx) { - let html_tag; - let html_anchor; - - const block = { - c: function create() { - html_anchor = empty(); - html_tag = new HtmlTag(html_anchor); - }, - m: function mount(target, anchor) { - html_tag.m(/*indicatorSvg*/ ctx[22], target, anchor); - insert_dev(target, html_anchor, anchor); - }, - p: function update(ctx, dirty) { - if (dirty[0] & /*indicatorSvg*/ 4194304) html_tag.p(/*indicatorSvg*/ ctx[22]); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(html_anchor); - if (detaching) html_tag.d(); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_2$1.name, - type: "if", - source: "(974:12) {#if indicatorSvg}", - ctx - }); - - return block; -} - -// (995:4) {#if isWaiting} -function create_if_block$1(ctx) { - let div; - let svg; - let circle; - - const block = { - c: function create() { - div = element("div"); - svg = svg_element("svg"); - circle = svg_element("circle"); - attr_dev(circle, "class", "spinner_path svelte-1ri8kk0"); - attr_dev(circle, "cx", "50"); - attr_dev(circle, "cy", "50"); - attr_dev(circle, "r", "20"); - attr_dev(circle, "fill", "none"); - attr_dev(circle, "stroke", "currentColor"); - attr_dev(circle, "stroke-width", "5"); - attr_dev(circle, "stroke-miterlimit", "10"); - add_location(circle, file$8, 997, 16, 27273); - attr_dev(svg, "class", "spinner_icon svelte-1ri8kk0"); - attr_dev(svg, "viewBox", "25 25 50 50"); - add_location(svg, file$8, 996, 12, 27208); - attr_dev(div, "class", "spinner svelte-1ri8kk0"); - add_location(div, file$8, 995, 8, 27174); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, svg); - append_dev(svg, circle); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block$1.name, - type: "if", - source: "(995:4) {#if isWaiting}", - ctx - }); - - return block; -} - -function create_fragment$8(ctx) { - let div; - let t0; - let t1; - let t2; - let t3; - let t4; - let t5; - let div_class_value; - let current; - let mounted; - let dispose; - let if_block0 = /*Icon*/ ctx[17] && create_if_block_7(ctx); - let if_block1 = /*isMulti*/ ctx[8] && /*value*/ ctx[2] && /*value*/ ctx[2].length > 0 && create_if_block_6(ctx); - - function select_block_type(ctx, dirty) { - if (/*isDisabled*/ ctx[10]) return create_if_block_5; - return create_else_block_1$1; - } - - let current_block_type = select_block_type(ctx); - let if_block2 = current_block_type(ctx); - let if_block3 = !/*isMulti*/ ctx[8] && /*showSelectedItem*/ ctx[27] && create_if_block_4(ctx); - let if_block4 = /*showSelectedItem*/ ctx[27] && /*isClearable*/ ctx[16] && !/*isDisabled*/ ctx[10] && !/*isWaiting*/ ctx[5] && create_if_block_3$1(ctx); - let if_block5 = (/*showIndicator*/ ctx[20] || /*showChevron*/ ctx[19] && !/*value*/ ctx[2] || !/*isSearchable*/ ctx[14] && !/*isDisabled*/ ctx[10] && !/*isWaiting*/ ctx[5] && (/*showSelectedItem*/ ctx[27] && !/*isClearable*/ ctx[16] || !/*showSelectedItem*/ ctx[27])) && create_if_block_1$1(ctx); - let if_block6 = /*isWaiting*/ ctx[5] && create_if_block$1(ctx); - - const block = { - c: function create() { - div = element("div"); - if (if_block0) if_block0.c(); - t0 = space(); - if (if_block1) if_block1.c(); - t1 = space(); - if_block2.c(); - t2 = space(); - if (if_block3) if_block3.c(); - t3 = space(); - if (if_block4) if_block4.c(); - t4 = space(); - if (if_block5) if_block5.c(); - t5 = space(); - if (if_block6) if_block6.c(); - attr_dev(div, "class", div_class_value = "selectContainer " + /*containerClasses*/ ctx[21] + " svelte-1ri8kk0"); - attr_dev(div, "style", /*containerStyles*/ ctx[12]); - toggle_class(div, "hasError", /*hasError*/ ctx[11]); - toggle_class(div, "multiSelect", /*isMulti*/ ctx[8]); - toggle_class(div, "disabled", /*isDisabled*/ ctx[10]); - toggle_class(div, "focused", /*isFocused*/ ctx[1]); - add_location(div, file$8, 907, 0, 24513); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - if (if_block0) if_block0.m(div, null); - append_dev(div, t0); - if (if_block1) if_block1.m(div, null); - append_dev(div, t1); - if_block2.m(div, null); - append_dev(div, t2); - if (if_block3) if_block3.m(div, null); - append_dev(div, t3); - if (if_block4) if_block4.m(div, null); - append_dev(div, t4); - if (if_block5) if_block5.m(div, null); - append_dev(div, t5); - if (if_block6) if_block6.m(div, null); - /*div_binding*/ ctx[70](div); - current = true; - - if (!mounted) { - dispose = [ - listen_dev(window, "click", /*handleWindowClick*/ ctx[33], false, false, false), - listen_dev(window, "keydown", /*handleKeyDown*/ ctx[31], false, false, false), - listen_dev(window, "resize", /*getPosition*/ ctx[30], false, false, false), - listen_dev(div, "click", /*handleClick*/ ctx[34], false, false, false) - ]; - - mounted = true; - } - }, - p: function update(ctx, dirty) { - if (/*Icon*/ ctx[17]) { - if (if_block0) { - if_block0.p(ctx, dirty); - - if (dirty[0] & /*Icon*/ 131072) { - transition_in(if_block0, 1); - } - } else { - if_block0 = create_if_block_7(ctx); - if_block0.c(); - transition_in(if_block0, 1); - if_block0.m(div, t0); - } - } else if (if_block0) { - group_outros(); - - transition_out(if_block0, 1, 1, () => { - if_block0 = null; - }); - - check_outros(); - } - - if (/*isMulti*/ ctx[8] && /*value*/ ctx[2] && /*value*/ ctx[2].length > 0) { - if (if_block1) { - if_block1.p(ctx, dirty); - - if (dirty[0] & /*isMulti, value*/ 260) { - transition_in(if_block1, 1); - } - } else { - if_block1 = create_if_block_6(ctx); - if_block1.c(); - transition_in(if_block1, 1); - if_block1.m(div, t1); - } - } else if (if_block1) { - group_outros(); - - transition_out(if_block1, 1, 1, () => { - if_block1 = null; - }); - - check_outros(); - } - - if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block2) { - if_block2.p(ctx, dirty); - } else { - if_block2.d(1); - if_block2 = current_block_type(ctx); - - if (if_block2) { - if_block2.c(); - if_block2.m(div, t2); - } - } - - if (!/*isMulti*/ ctx[8] && /*showSelectedItem*/ ctx[27]) { - if (if_block3) { - if_block3.p(ctx, dirty); - - if (dirty[0] & /*isMulti, showSelectedItem*/ 134217984) { - transition_in(if_block3, 1); - } - } else { - if_block3 = create_if_block_4(ctx); - if_block3.c(); - transition_in(if_block3, 1); - if_block3.m(div, t3); - } - } else if (if_block3) { - group_outros(); - - transition_out(if_block3, 1, 1, () => { - if_block3 = null; - }); - - check_outros(); - } - - if (/*showSelectedItem*/ ctx[27] && /*isClearable*/ ctx[16] && !/*isDisabled*/ ctx[10] && !/*isWaiting*/ ctx[5]) { - if (if_block4) { - if_block4.p(ctx, dirty); - - if (dirty[0] & /*showSelectedItem, isClearable, isDisabled, isWaiting*/ 134284320) { - transition_in(if_block4, 1); - } - } else { - if_block4 = create_if_block_3$1(ctx); - if_block4.c(); - transition_in(if_block4, 1); - if_block4.m(div, t4); - } - } else if (if_block4) { - group_outros(); - - transition_out(if_block4, 1, 1, () => { - if_block4 = null; - }); - - check_outros(); - } - - if (/*showIndicator*/ ctx[20] || /*showChevron*/ ctx[19] && !/*value*/ ctx[2] || !/*isSearchable*/ ctx[14] && !/*isDisabled*/ ctx[10] && !/*isWaiting*/ ctx[5] && (/*showSelectedItem*/ ctx[27] && !/*isClearable*/ ctx[16] || !/*showSelectedItem*/ ctx[27])) { - if (if_block5) { - if_block5.p(ctx, dirty); - } else { - if_block5 = create_if_block_1$1(ctx); - if_block5.c(); - if_block5.m(div, t5); - } - } else if (if_block5) { - if_block5.d(1); - if_block5 = null; - } - - if (/*isWaiting*/ ctx[5]) { - if (if_block6) ; else { - if_block6 = create_if_block$1(ctx); - if_block6.c(); - if_block6.m(div, null); - } - } else if (if_block6) { - if_block6.d(1); - if_block6 = null; - } - - if (!current || dirty[0] & /*containerClasses*/ 2097152 && div_class_value !== (div_class_value = "selectContainer " + /*containerClasses*/ ctx[21] + " svelte-1ri8kk0")) { - attr_dev(div, "class", div_class_value); - } - - if (!current || dirty[0] & /*containerStyles*/ 4096) { - attr_dev(div, "style", /*containerStyles*/ ctx[12]); - } - - if (dirty[0] & /*containerClasses, hasError*/ 2099200) { - toggle_class(div, "hasError", /*hasError*/ ctx[11]); - } - - if (dirty[0] & /*containerClasses, isMulti*/ 2097408) { - toggle_class(div, "multiSelect", /*isMulti*/ ctx[8]); - } - - if (dirty[0] & /*containerClasses, isDisabled*/ 2098176) { - toggle_class(div, "disabled", /*isDisabled*/ ctx[10]); - } - - if (dirty[0] & /*containerClasses, isFocused*/ 2097154) { - toggle_class(div, "focused", /*isFocused*/ ctx[1]); - } - }, - i: function intro(local) { - if (current) return; - transition_in(if_block0); - transition_in(if_block1); - transition_in(if_block3); - transition_in(if_block4); - current = true; - }, - o: function outro(local) { - transition_out(if_block0); - transition_out(if_block1); - transition_out(if_block3); - transition_out(if_block4); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - if (if_block0) if_block0.d(); - if (if_block1) if_block1.d(); - if_block2.d(); - if (if_block3) if_block3.d(); - if (if_block4) if_block4.d(); - if (if_block5) if_block5.d(); - if (if_block6) if_block6.d(); - /*div_binding*/ ctx[70](null); - mounted = false; - run_all(dispose); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$8.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -async function importInternalComponent(componentName) { - let file; - - switch (componentName) { - case "VirtualList": - file = await Promise.resolve().then(function () { return VirtualList$1; }); - break; - case "List": - file = await Promise.resolve().then(function () { return List$1; }); - break; - } - - return file.default; -} - -function instance$8($$self, $$props, $$invalidate) { - let showSelectedItem; - let placeholderText; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("Select", slots, []); - const dispatch = createEventDispatcher(); - let { container = undefined } = $$props; - let { input = undefined } = $$props; - let { Item: Item$1 = Item } = $$props; - let { Selection: Selection$1 = Selection } = $$props; - let { MultiSelection: MultiSelection$1 = MultiSelection } = $$props; - let { isMulti = false } = $$props; - let { multiFullItemClearable = false } = $$props; - let { isDisabled = false } = $$props; - let { isCreatable = false } = $$props; - let { isFocused = false } = $$props; - let { value = undefined } = $$props; - let { filterText = "" } = $$props; - let { placeholder = "Select..." } = $$props; - let { items = [] } = $$props; - let { itemFilter = (label, filterText, option) => label.toLowerCase().includes(filterText.toLowerCase()) } = $$props; - let { groupBy = undefined } = $$props; - let { groupFilter = groups => groups } = $$props; - let { isGroupHeaderSelectable = false } = $$props; - - let { getGroupHeaderLabel = option => { - return option.label; - } } = $$props; - - let { getOptionLabel = (option, filterText) => { - return option.isCreator - ? `Create \"${filterText}\"` - : option.label; - } } = $$props; - - let { optionIdentifier = "value" } = $$props; - let { loadOptions = undefined } = $$props; - let { hasError = false } = $$props; - let { containerStyles = "" } = $$props; - - let { getSelectionLabel = option => { - if (option) return option.label; - } } = $$props; - - let { createGroupHeaderItem = groupValue => { - return { value: groupValue, label: groupValue }; - } } = $$props; - - let { createItem = filterText => { - return { value: filterText, label: filterText }; - } } = $$props; - - let { isSearchable = true } = $$props; - let { inputStyles = "" } = $$props; - let { isClearable = true } = $$props; - let { isWaiting = false } = $$props; - let { listPlacement = "auto" } = $$props; - let { listOpen = false } = $$props; - let { list = undefined } = $$props; - let { isVirtualList = false } = $$props; - let { loadOptionsInterval = 300 } = $$props; - let { noOptionsMessage = "No options" } = $$props; - let { hideEmptyState = false } = $$props; - let { filteredItems = [] } = $$props; - let { inputAttributes = {} } = $$props; - let { listAutoWidth = true } = $$props; - let { itemHeight = 40 } = $$props; - let { Icon = undefined } = $$props; - let { iconProps = {} } = $$props; - let { showChevron = false } = $$props; - let { showIndicator = false } = $$props; - let { containerClasses = "" } = $$props; - let { indicatorSvg = undefined } = $$props; - let { ClearIcon: ClearIcon$1 = ClearIcon } = $$props; - let target; - let activeValue; - let originalItemsClone; - let prev_value; - let prev_filterText; - let prev_isFocused; - let prev_filteredItems; - - async function resetFilter() { - await tick(); - $$invalidate(3, filterText = ""); - } - - let getItemsHasInvoked = false; - - const getItems = debounce( - async () => { - getItemsHasInvoked = true; - $$invalidate(5, isWaiting = true); - - let res = await loadOptions(filterText).catch(err => { - console.warn("svelte-select loadOptions error :>> ", err); - dispatch("error", { type: "loadOptions", details: err }); - }); - - if (res && !res.cancelled) { - if (res) { - $$invalidate(35, items = [...res]); - dispatch("loaded", { items }); - } else { - $$invalidate(35, items = []); - } - - $$invalidate(5, isWaiting = false); - $$invalidate(1, isFocused = true); - $$invalidate(36, listOpen = true); - } - }, - loadOptionsInterval - ); - - function setvalue() { - if (typeof value === "string") { - $$invalidate(2, value = { [optionIdentifier]: value, label: value }); - } else if (isMulti && Array.isArray(value) && value.length > 0) { - $$invalidate(2, value = value.map(item => typeof item === "string" - ? { value: item, label: item } - : item)); - } - } - - let _inputAttributes; - - function assignInputAttributes() { - $$invalidate(26, _inputAttributes = Object.assign( - { - autocomplete: "off", - autocorrect: "off", - spellcheck: false - }, - inputAttributes - )); - - if (!isSearchable) { - $$invalidate(26, _inputAttributes.readonly = true, _inputAttributes); - } - } - - function convertStringItemsToObjects() { - $$invalidate(35, items = items.map((item, index) => { - return { index, value: item, label: item }; - })); - } - - function resetFilteredItems() { - $$invalidate(38, filteredItems = JSON.parse(originalItemsClone)); - } - - function filterItem(item) { - let keepItem = true; - - if (isMulti && value) { - keepItem = !value.some(x => { - return x[optionIdentifier] === item[optionIdentifier]; - }); - } - - if (!keepItem) return false; - if (filterText.length < 1) return true; - return itemFilter(getOptionLabel(item, filterText), filterText, item); - } - - function setupFilteredItems() { - $$invalidate(38, filteredItems = loadOptions - ? filterText.length === 0 ? [] : items - : items.filter(item => filterItem(item))); - } - - function filterGroupedItems() { - const groupValues = []; - const groups = {}; - - filteredItems.forEach(item => { - const groupValue = groupBy(item); - - if (!groupValues.includes(groupValue)) { - groupValues.push(groupValue); - groups[groupValue] = []; - - if (groupValue) { - groups[groupValue].push(Object.assign(createGroupHeaderItem(groupValue, item), { - id: groupValue, - isGroupHeader: true, - isSelectable: isGroupHeaderSelectable - })); - } - } - - groups[groupValue].push(Object.assign({ isGroupItem: !!groupValue }, item)); - }); - - const sortedGroupedItems = []; - - groupFilter(groupValues).forEach(groupValue => { - sortedGroupedItems.push(...groups[groupValue]); - }); - - $$invalidate(38, filteredItems = sortedGroupedItems); - } - - function dispatchSelectedItem() { - if (isMulti) { - if (JSON.stringify(value) !== JSON.stringify(prev_value)) { - if (checkvalueForDuplicates()) { - dispatch("select", value); - } - } - - return; - } - - if (!prev_value || JSON.stringify(value[optionIdentifier]) !== JSON.stringify(prev_value[optionIdentifier])) { - dispatch("select", value); - } - } - - function setupFilterText() { - if (filterText.length > 0) { - $$invalidate(1, isFocused = true); - $$invalidate(36, listOpen = true); - - if (loadOptions) { - getItems(); - } else { - loadList(); - $$invalidate(36, listOpen = true); - - if (isMulti) { - $$invalidate(25, activeValue = undefined); - } - } - } else { - setList([]); - } - - if (list) { - list.$set({ filterText }); - } - } - - function setupFocus() { - if (isFocused || listOpen) { - handleFocus(); - } else { - resetFilter(); - if (input) input.blur(); - } - } - - let { VirtualList = null } = $$props; - let { List = null } = $$props; - - function setupFilteredItem() { - let _filteredItems = [...filteredItems]; - - if (isCreatable && filterText) { - const itemToCreate = createItem(filterText); - itemToCreate.isCreator = true; - - const existingItemWithFilterValue = _filteredItems.find(item => { - return item[optionIdentifier] === itemToCreate[optionIdentifier]; - }); - - let existingSelectionWithFilterValue; - - if (value) { - if (isMulti) { - existingSelectionWithFilterValue = value.find(selection => { - return selection[optionIdentifier] === itemToCreate[optionIdentifier]; - }); - } else if (value[optionIdentifier] === itemToCreate[optionIdentifier]) { - existingSelectionWithFilterValue = value; - } - } - - if (!existingItemWithFilterValue && !existingSelectionWithFilterValue) { - _filteredItems = [..._filteredItems, itemToCreate]; - } - } - - setList(_filteredItems); - } - - beforeUpdate(() => { - prev_value = value; - $$invalidate(63, prev_filterText = filterText); - $$invalidate(64, prev_isFocused = isFocused); - $$invalidate(65, prev_filteredItems = filteredItems); - }); - - function checkvalueForDuplicates() { - let noDuplicates = true; - - if (value) { - const ids = []; - const uniqueValues = []; - - value.forEach(val => { - if (!ids.includes(val[optionIdentifier])) { - ids.push(val[optionIdentifier]); - uniqueValues.push(val); - } else { - noDuplicates = false; - } - }); - - if (!noDuplicates) $$invalidate(2, value = uniqueValues); - } - - return noDuplicates; - } - - function findItem(selection) { - let matchTo = selection - ? selection[optionIdentifier] - : value[optionIdentifier]; - - return items.find(item => item[optionIdentifier] === matchTo); - } - - function updateValueDisplay(items) { - if (!items || items.length === 0 || items.some(item => typeof item !== "object")) return; - - if (!value || (isMulti - ? value.some(selection => !selection || !selection[optionIdentifier]) - : !value[optionIdentifier])) return; - - if (Array.isArray(value)) { - $$invalidate(2, value = value.map(selection => findItem(selection) || selection)); - } else { - $$invalidate(2, value = findItem() || value); - } - } - - async function setList(items) { - await tick(); - if (!listOpen) return; - if (list) return list.$set({ items }); - if (loadOptions && getItemsHasInvoked && items.length > 0) loadList(); - } - - function handleMultiItemClear(event) { - const { detail } = event; - const itemToRemove = value[detail ? detail.i : value.length - 1]; - - if (value.length === 1) { - $$invalidate(2, value = undefined); - } else { - $$invalidate(2, value = value.filter(item => { - return item !== itemToRemove; - })); - } - - dispatch("clear", itemToRemove); - getPosition(); - } - - async function getPosition() { - await tick(); - if (!target || !container) return; - const { top, height, width } = container.getBoundingClientRect(); - target.style["min-width"] = `${width}px`; - target.style.width = `${listAutoWidth ? "auto" : "100%"}`; - target.style.left = "0"; - - if (listPlacement === "top") { - target.style.bottom = `${height + 5}px`; - } else { - target.style.top = `${height + 5}px`; - } - - target = target; - - if (listPlacement === "auto" && isOutOfViewport(target).bottom) { - target.style.top = ``; - target.style.bottom = `${height + 5}px`; - } - - target.style.visibility = ""; - } - - function handleKeyDown(e) { - if (!isFocused) return; - - switch (e.key) { - case "ArrowDown": - e.preventDefault(); - $$invalidate(36, listOpen = true); - $$invalidate(25, activeValue = undefined); - break; - case "ArrowUp": - e.preventDefault(); - $$invalidate(36, listOpen = true); - $$invalidate(25, activeValue = undefined); - break; - case "Tab": - if (!listOpen) $$invalidate(1, isFocused = false); - break; - case "Backspace": - if (!isMulti || filterText.length > 0) return; - if (isMulti && value && value.length > 0) { - handleMultiItemClear(activeValue !== undefined - ? activeValue - : value.length - 1); - - if (activeValue === 0 || activeValue === undefined) break; - $$invalidate(25, activeValue = value.length > activeValue ? activeValue - 1 : undefined); - } - break; - case "ArrowLeft": - if (list) list.$set({ hoverItemIndex: -1 }); - if (!isMulti || filterText.length > 0) return; - if (activeValue === undefined) { - $$invalidate(25, activeValue = value.length - 1); - } else if (value.length > activeValue && activeValue !== 0) { - $$invalidate(25, activeValue -= 1); - } - break; - case "ArrowRight": - if (list) list.$set({ hoverItemIndex: -1 }); - if (!isMulti || filterText.length > 0 || activeValue === undefined) return; - if (activeValue === value.length - 1) { - $$invalidate(25, activeValue = undefined); - } else if (activeValue < value.length - 1) { - $$invalidate(25, activeValue += 1); - } - break; - } - } - - function handleFocus() { - $$invalidate(1, isFocused = true); - if (input) input.focus(); - } - - function removeList() { - resetFilter(); - $$invalidate(25, activeValue = undefined); - if (!list) return; - list.$destroy(); - $$invalidate(37, list = undefined); - if (!target) return; - if (target.parentNode) target.parentNode.removeChild(target); - target = undefined; - $$invalidate(37, list); - target = target; - } - - function handleWindowClick(event) { - if (!container) return; - - const eventTarget = event.path && event.path.length > 0 - ? event.path[0] - : event.target; - - if (container.contains(eventTarget)) return; - $$invalidate(1, isFocused = false); - $$invalidate(36, listOpen = false); - $$invalidate(25, activeValue = undefined); - if (input) input.blur(); - } - - function handleClick() { - if (isDisabled) return; - $$invalidate(1, isFocused = true); - $$invalidate(36, listOpen = !listOpen); - } - - function handleClear() { - $$invalidate(2, value = undefined); - $$invalidate(36, listOpen = false); - dispatch("clear", value); - handleFocus(); - } - - async function loadList() { - await tick(); - if (target && list) return; - - if (isVirtualList && !VirtualList) { - $$invalidate(39, VirtualList = await importInternalComponent("VirtualList")); - } - - const data = { - Item: Item$1, - filterText, - optionIdentifier, - noOptionsMessage, - hideEmptyState, - isVirtualList, - VirtualList, - value, - isMulti, - getGroupHeaderLabel, - items: filteredItems, - itemHeight - }; - - if (getOptionLabel) { - data.getOptionLabel = getOptionLabel; - } - - if (target) target.remove(); - target = document.createElement("div"); - - Object.assign(target.style, { - position: "absolute", - "z-index": 2, - visibility: "hidden" - }); - - if (list) list.$destroy(); - $$invalidate(37, list); - target = target; - if (container) container.appendChild(target); - $$invalidate(37, list = new List({ target, props: data })); - - list.$on("itemSelected", event => { - const { detail } = event; - - if (detail) { - const item = Object.assign({}, detail); - - if (!item.isGroupHeader || item.isSelectable) { - if (isMulti) { - $$invalidate(2, value = value ? value.concat([item]) : [item]); - } else { - $$invalidate(2, value = item); - } - - resetFilter(); - $$invalidate(2, value); - - setTimeout(() => { - $$invalidate(36, listOpen = false); - $$invalidate(25, activeValue = undefined); - }); - } - } - }); - - list.$on("itemCreated", event => { - const { detail } = event; - - if (isMulti) { - $$invalidate(2, value = value || []); - $$invalidate(2, value = [...value, createItem(detail)]); - } else { - $$invalidate(2, value = createItem(detail)); - } - - dispatch("itemCreated", detail); - $$invalidate(3, filterText = ""); - $$invalidate(36, listOpen = false); - $$invalidate(25, activeValue = undefined); - resetFilter(); - }); - - list.$on("closeList", () => { - $$invalidate(36, listOpen = false); - }); - - ($$invalidate(37, list), target = target); - getPosition(); - } - - onMount(async () => { - if (!List) $$invalidate(40, List = await importInternalComponent("List")); - if (isFocused && input) input.focus(); - if (listOpen) loadList(); - - if (items && items.length > 0) { - $$invalidate(62, originalItemsClone = JSON.stringify(items)); - } - }); - - onDestroy(() => { - removeList(); - }); - - const writable_props = [ - "container", - "input", - "Item", - "Selection", - "MultiSelection", - "isMulti", - "multiFullItemClearable", - "isDisabled", - "isCreatable", - "isFocused", - "value", - "filterText", - "placeholder", - "items", - "itemFilter", - "groupBy", - "groupFilter", - "isGroupHeaderSelectable", - "getGroupHeaderLabel", - "getOptionLabel", - "optionIdentifier", - "loadOptions", - "hasError", - "containerStyles", - "getSelectionLabel", - "createGroupHeaderItem", - "createItem", - "isSearchable", - "inputStyles", - "isClearable", - "isWaiting", - "listPlacement", - "listOpen", - "list", - "isVirtualList", - "loadOptionsInterval", - "noOptionsMessage", - "hideEmptyState", - "filteredItems", - "inputAttributes", - "listAutoWidth", - "itemHeight", - "Icon", - "iconProps", - "showChevron", - "showIndicator", - "containerClasses", - "indicatorSvg", - "ClearIcon", - "VirtualList", - "List" - ]; - - Object_1.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(`: Cannot set read-only property 'handleClear'"); - } -} - -/* src/List.svelte generated by Svelte v3.35.0 */ -const file$7 = "src/List.svelte"; - -function get_each_context$1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[33] = list[i]; - child_ctx[35] = i; - return child_ctx; -} - -// (241:0) {#if isVirtualList} -function create_if_block_3(ctx) { - let div; - let switch_instance; - let current; - var switch_value = /*VirtualList*/ ctx[2]; - - function switch_props(ctx) { - return { - props: { - items: /*items*/ ctx[5], - itemHeight: /*itemHeight*/ ctx[8], - $$slots: { - default: [ - create_default_slot, - ({ item, i }) => ({ 33: item, 35: i }), - ({ item, i }) => [0, (item ? 4 : 0) | (i ? 16 : 0)] - ] - }, - $$scope: { ctx } - }, - $$inline: true - }; - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - } - - const block = { - c: function create() { - div = element("div"); - if (switch_instance) create_component(switch_instance.$$.fragment); - attr_dev(div, "class", "listContainer virtualList svelte-1wmovev"); - add_location(div, file$7, 241, 4, 6877); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - - if (switch_instance) { - mount_component(switch_instance, div, null); - } - - /*div_binding*/ ctx[21](div); - current = true; - }, - p: function update(ctx, dirty) { - const switch_instance_changes = {}; - if (dirty[0] & /*items*/ 32) switch_instance_changes.items = /*items*/ ctx[5]; - if (dirty[0] & /*itemHeight*/ 256) switch_instance_changes.itemHeight = /*itemHeight*/ ctx[8]; - - if (dirty[0] & /*Item, filterText, getOptionLabel, value, optionIdentifier, hoverItemIndex, items*/ 9834 | dirty[1] & /*$$scope, item, i*/ 52) { - switch_instance_changes.$$scope = { dirty, ctx }; - } - - if (switch_value !== (switch_value = /*VirtualList*/ ctx[2])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; - - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); - - check_outros(); - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, div, null); - } else { - switch_instance = null; - } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - if (switch_instance) destroy_component(switch_instance); - /*div_binding*/ ctx[21](null); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_3.name, - type: "if", - source: "(241:0) {#if isVirtualList}", - ctx - }); - - return block; -} - -// (243:8) -function create_default_slot(ctx) { - let div; - let switch_instance; - let current; - let mounted; - let dispose; - var switch_value = /*Item*/ ctx[3]; - - function switch_props(ctx) { - return { - props: { - item: /*item*/ ctx[33], - filterText: /*filterText*/ ctx[13], - getOptionLabel: /*getOptionLabel*/ ctx[6], - isFirst: isItemFirst(/*i*/ ctx[35]), - isActive: isItemActive(/*item*/ ctx[33], /*value*/ ctx[9], /*optionIdentifier*/ ctx[10]), - isHover: isItemHover(/*hoverItemIndex*/ ctx[1], /*item*/ ctx[33], /*i*/ ctx[35], /*items*/ ctx[5]) - }, - $$inline: true - }; - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - } - - function mouseover_handler() { - return /*mouseover_handler*/ ctx[19](/*i*/ ctx[35]); - } - - function click_handler(...args) { - return /*click_handler*/ ctx[20](/*item*/ ctx[33], /*i*/ ctx[35], ...args); - } - - const block = { - c: function create() { - div = element("div"); - if (switch_instance) create_component(switch_instance.$$.fragment); - attr_dev(div, "class", "listItem"); - add_location(div, file$7, 249, 12, 7102); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - - if (switch_instance) { - mount_component(switch_instance, div, null); - } - - current = true; - - if (!mounted) { - dispose = [ - listen_dev(div, "mouseover", mouseover_handler, false, false, false), - listen_dev(div, "click", click_handler, false, false, false) - ]; - - mounted = true; - } - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - const switch_instance_changes = {}; - if (dirty[1] & /*item*/ 4) switch_instance_changes.item = /*item*/ ctx[33]; - if (dirty[0] & /*filterText*/ 8192) switch_instance_changes.filterText = /*filterText*/ ctx[13]; - if (dirty[0] & /*getOptionLabel*/ 64) switch_instance_changes.getOptionLabel = /*getOptionLabel*/ ctx[6]; - if (dirty[1] & /*i*/ 16) switch_instance_changes.isFirst = isItemFirst(/*i*/ ctx[35]); - if (dirty[0] & /*value, optionIdentifier*/ 1536 | dirty[1] & /*item*/ 4) switch_instance_changes.isActive = isItemActive(/*item*/ ctx[33], /*value*/ ctx[9], /*optionIdentifier*/ ctx[10]); - if (dirty[0] & /*hoverItemIndex, items*/ 34 | dirty[1] & /*item, i*/ 20) switch_instance_changes.isHover = isItemHover(/*hoverItemIndex*/ ctx[1], /*item*/ ctx[33], /*i*/ ctx[35], /*items*/ ctx[5]); - - if (switch_value !== (switch_value = /*Item*/ ctx[3])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; - - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); - - check_outros(); - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, div, null); - } else { - switch_instance = null; - } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - if (switch_instance) destroy_component(switch_instance); - mounted = false; - run_all(dispose); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_default_slot.name, - type: "slot", - source: "(243:8) ", - ctx - }); - - return block; -} - -// (273:0) {#if !isVirtualList} -function create_if_block(ctx) { - let div; - let current; - let each_value = /*items*/ ctx[5]; - validate_each_argument(each_value); - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); - } - - const out = i => transition_out(each_blocks[i], 1, 1, () => { - each_blocks[i] = null; - }); - - let each_1_else = null; - - if (!each_value.length) { - each_1_else = create_else_block_1(ctx); - } - - const block = { - c: function create() { - div = element("div"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - if (each_1_else) { - each_1_else.c(); - } - - attr_dev(div, "class", "listContainer svelte-1wmovev"); - add_location(div, file$7, 273, 4, 7836); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div, null); - } - - if (each_1_else) { - each_1_else.m(div, null); - } - - /*div_binding_1*/ ctx[24](div); - current = true; - }, - p: function update(ctx, dirty) { - if (dirty[0] & /*getGroupHeaderLabel, items, handleHover, handleClick, Item, filterText, getOptionLabel, value, optionIdentifier, hoverItemIndex, noOptionsMessage, hideEmptyState*/ 65258) { - each_value = /*items*/ ctx[5]; - validate_each_argument(each_value); - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$1(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - transition_in(each_blocks[i], 1); - } else { - each_blocks[i] = create_each_block$1(child_ctx); - each_blocks[i].c(); - transition_in(each_blocks[i], 1); - each_blocks[i].m(div, null); - } - } - - group_outros(); - - for (i = each_value.length; i < each_blocks.length; i += 1) { - out(i); - } - - check_outros(); - - if (!each_value.length && each_1_else) { - each_1_else.p(ctx, dirty); - } else if (!each_value.length) { - each_1_else = create_else_block_1(ctx); - each_1_else.c(); - each_1_else.m(div, null); - } else if (each_1_else) { - each_1_else.d(1); - each_1_else = null; - } - } - }, - i: function intro(local) { - if (current) return; - - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o: function outro(local) { - each_blocks = each_blocks.filter(Boolean); - - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } - - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - destroy_each(each_blocks, detaching); - if (each_1_else) each_1_else.d(); - /*div_binding_1*/ ctx[24](null); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block.name, - type: "if", - source: "(273:0) {#if !isVirtualList}", - ctx - }); - - return block; -} - -// (299:8) {:else} -function create_else_block_1(ctx) { - let if_block_anchor; - let if_block = !/*hideEmptyState*/ ctx[11] && create_if_block_2(ctx); - - const block = { - c: function create() { - if (if_block) if_block.c(); - if_block_anchor = empty(); - }, - m: function mount(target, anchor) { - if (if_block) if_block.m(target, anchor); - insert_dev(target, if_block_anchor, anchor); - }, - p: function update(ctx, dirty) { - if (!/*hideEmptyState*/ ctx[11]) { - if (if_block) { - if_block.p(ctx, dirty); - } else { - if_block = create_if_block_2(ctx); - if_block.c(); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - }, - d: function destroy(detaching) { - if (if_block) if_block.d(detaching); - if (detaching) detach_dev(if_block_anchor); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block_1.name, - type: "else", - source: "(299:8) {:else}", - ctx - }); - - return block; -} - -// (300:12) {#if !hideEmptyState} -function create_if_block_2(ctx) { - let div; - let t; - - const block = { - c: function create() { - div = element("div"); - t = text(/*noOptionsMessage*/ ctx[12]); - attr_dev(div, "class", "empty svelte-1wmovev"); - add_location(div, file$7, 300, 16, 8911); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, t); - }, - p: function update(ctx, dirty) { - if (dirty[0] & /*noOptionsMessage*/ 4096) set_data_dev(t, /*noOptionsMessage*/ ctx[12]); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_2.name, - type: "if", - source: "(300:12) {#if !hideEmptyState}", - ctx - }); - - return block; -} - -// (278:12) {:else} -function create_else_block(ctx) { - let div; - let switch_instance; - let t; - let current; - let mounted; - let dispose; - var switch_value = /*Item*/ ctx[3]; - - function switch_props(ctx) { - return { - props: { - item: /*item*/ ctx[33], - filterText: /*filterText*/ ctx[13], - getOptionLabel: /*getOptionLabel*/ ctx[6], - isFirst: isItemFirst(/*i*/ ctx[35]), - isActive: isItemActive(/*item*/ ctx[33], /*value*/ ctx[9], /*optionIdentifier*/ ctx[10]), - isHover: isItemHover(/*hoverItemIndex*/ ctx[1], /*item*/ ctx[33], /*i*/ ctx[35], /*items*/ ctx[5]) - }, - $$inline: true - }; - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - } - - function mouseover_handler_1() { - return /*mouseover_handler_1*/ ctx[22](/*i*/ ctx[35]); - } - - function click_handler_1(...args) { - return /*click_handler_1*/ ctx[23](/*item*/ ctx[33], /*i*/ ctx[35], ...args); - } - - const block = { - c: function create() { - div = element("div"); - if (switch_instance) create_component(switch_instance.$$.fragment); - t = space(); - attr_dev(div, "class", "listItem"); - add_location(div, file$7, 278, 16, 8092); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - - if (switch_instance) { - mount_component(switch_instance, div, null); - } - - append_dev(div, t); - current = true; - - if (!mounted) { - dispose = [ - listen_dev(div, "mouseover", mouseover_handler_1, false, false, false), - listen_dev(div, "click", click_handler_1, false, false, false) - ]; - - mounted = true; - } - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - const switch_instance_changes = {}; - if (dirty[0] & /*items*/ 32) switch_instance_changes.item = /*item*/ ctx[33]; - if (dirty[0] & /*filterText*/ 8192) switch_instance_changes.filterText = /*filterText*/ ctx[13]; - if (dirty[0] & /*getOptionLabel*/ 64) switch_instance_changes.getOptionLabel = /*getOptionLabel*/ ctx[6]; - if (dirty[0] & /*items, value, optionIdentifier*/ 1568) switch_instance_changes.isActive = isItemActive(/*item*/ ctx[33], /*value*/ ctx[9], /*optionIdentifier*/ ctx[10]); - if (dirty[0] & /*hoverItemIndex, items*/ 34) switch_instance_changes.isHover = isItemHover(/*hoverItemIndex*/ ctx[1], /*item*/ ctx[33], /*i*/ ctx[35], /*items*/ ctx[5]); - - if (switch_value !== (switch_value = /*Item*/ ctx[3])) { - if (switch_instance) { - group_outros(); - const old_component = switch_instance; - - transition_out(old_component.$$.fragment, 1, 0, () => { - destroy_component(old_component, 1); - }); - - check_outros(); - } - - if (switch_value) { - switch_instance = new switch_value(switch_props(ctx)); - create_component(switch_instance.$$.fragment); - transition_in(switch_instance.$$.fragment, 1); - mount_component(switch_instance, div, t); - } else { - switch_instance = null; - } - } else if (switch_value) { - switch_instance.$set(switch_instance_changes); - } - }, - i: function intro(local) { - if (current) return; - if (switch_instance) transition_in(switch_instance.$$.fragment, local); - current = true; - }, - o: function outro(local) { - if (switch_instance) transition_out(switch_instance.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - if (switch_instance) destroy_component(switch_instance); - mounted = false; - run_all(dispose); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_else_block.name, - type: "else", - source: "(278:12) {:else}", - ctx - }); - - return block; -} - -// (276:12) {#if item.isGroupHeader && !item.isSelectable} -function create_if_block_1(ctx) { - let div; - let t_value = /*getGroupHeaderLabel*/ ctx[7](/*item*/ ctx[33]) + ""; - let t; - - const block = { - c: function create() { - div = element("div"); - t = text(t_value); - attr_dev(div, "class", "listGroupTitle svelte-1wmovev"); - add_location(div, file$7, 276, 16, 7994); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, t); - }, - p: function update(ctx, dirty) { - if (dirty[0] & /*getGroupHeaderLabel, items*/ 160 && t_value !== (t_value = /*getGroupHeaderLabel*/ ctx[7](/*item*/ ctx[33]) + "")) set_data_dev(t, t_value); - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_1.name, - type: "if", - source: "(276:12) {#if item.isGroupHeader && !item.isSelectable}", - ctx - }); - - return block; -} - -// (275:8) {#each items as item, i} -function create_each_block$1(ctx) { - let current_block_type_index; - let if_block; - let if_block_anchor; - let current; - const if_block_creators = [create_if_block_1, create_else_block]; - const if_blocks = []; - - function select_block_type(ctx, dirty) { - if (/*item*/ ctx[33].isGroupHeader && !/*item*/ ctx[33].isSelectable) return 0; - return 1; - } - - current_block_type_index = select_block_type(ctx); - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - - const block = { - c: function create() { - if_block.c(); - if_block_anchor = empty(); - }, - m: function mount(target, anchor) { - if_blocks[current_block_type_index].m(target, anchor); - insert_dev(target, if_block_anchor, anchor); - current = true; - }, - p: function update(ctx, dirty) { - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type(ctx); - - if (current_block_type_index === previous_block_index) { - if_blocks[current_block_type_index].p(ctx, dirty); - } else { - group_outros(); - - transition_out(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); - - check_outros(); - if_block = if_blocks[current_block_type_index]; - - if (!if_block) { - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block.c(); - } else { - if_block.p(ctx, dirty); - } - - transition_in(if_block, 1); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - }, - i: function intro(local) { - if (current) return; - transition_in(if_block); - current = true; - }, - o: function outro(local) { - transition_out(if_block); - current = false; - }, - d: function destroy(detaching) { - if_blocks[current_block_type_index].d(detaching); - if (detaching) detach_dev(if_block_anchor); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block$1.name, - type: "each", - source: "(275:8) {#each items as item, i}", - ctx - }); - - return block; -} - -function create_fragment$7(ctx) { - let t; - let if_block1_anchor; - let current; - let mounted; - let dispose; - let if_block0 = /*isVirtualList*/ ctx[4] && create_if_block_3(ctx); - let if_block1 = !/*isVirtualList*/ ctx[4] && create_if_block(ctx); - - const block = { - c: function create() { - if (if_block0) if_block0.c(); - t = space(); - if (if_block1) if_block1.c(); - if_block1_anchor = empty(); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - if (if_block0) if_block0.m(target, anchor); - insert_dev(target, t, anchor); - if (if_block1) if_block1.m(target, anchor); - insert_dev(target, if_block1_anchor, anchor); - current = true; - - if (!mounted) { - dispose = listen_dev(window, "keydown", /*handleKeyDown*/ ctx[16], false, false, false); - mounted = true; - } - }, - p: function update(ctx, dirty) { - if (/*isVirtualList*/ ctx[4]) { - if (if_block0) { - if_block0.p(ctx, dirty); - - if (dirty[0] & /*isVirtualList*/ 16) { - transition_in(if_block0, 1); - } - } else { - if_block0 = create_if_block_3(ctx); - if_block0.c(); - transition_in(if_block0, 1); - if_block0.m(t.parentNode, t); - } - } else if (if_block0) { - group_outros(); - - transition_out(if_block0, 1, 1, () => { - if_block0 = null; - }); - - check_outros(); - } - - if (!/*isVirtualList*/ ctx[4]) { - if (if_block1) { - if_block1.p(ctx, dirty); - - if (dirty[0] & /*isVirtualList*/ 16) { - transition_in(if_block1, 1); - } - } else { - if_block1 = create_if_block(ctx); - if_block1.c(); - transition_in(if_block1, 1); - if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); - } - } else if (if_block1) { - group_outros(); - - transition_out(if_block1, 1, 1, () => { - if_block1 = null; - }); - - check_outros(); - } - }, - i: function intro(local) { - if (current) return; - transition_in(if_block0); - transition_in(if_block1); - current = true; - }, - o: function outro(local) { - transition_out(if_block0); - transition_out(if_block1); - current = false; - }, - d: function destroy(detaching) { - if (if_block0) if_block0.d(detaching); - if (detaching) detach_dev(t); - if (if_block1) if_block1.d(detaching); - if (detaching) detach_dev(if_block1_anchor); - mounted = false; - dispose(); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$7.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function isItemActive(item, value, optionIdentifier) { - return value && value[optionIdentifier] === item[optionIdentifier]; -} - -function isItemFirst(itemIndex) { - return itemIndex === 0; -} - -function isItemHover(hoverItemIndex, item, itemIndex, items) { - return hoverItemIndex === itemIndex || items.length === 1; -} - -function instance$7($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("List", slots, []); - const dispatch = createEventDispatcher(); - let { container = undefined } = $$props; - let { VirtualList = null } = $$props; - let { Item: Item$1 = Item } = $$props; - let { isVirtualList = false } = $$props; - let { items = [] } = $$props; - - let { getOptionLabel = (option, filterText) => { - if (option) return option.isCreator - ? `Create \"${filterText}\"` - : option.label; - } } = $$props; - - let { getGroupHeaderLabel = option => { - return option.label; - } } = $$props; - - let { itemHeight = 40 } = $$props; - let { hoverItemIndex = 0 } = $$props; - let { value = undefined } = $$props; - let { optionIdentifier = "value" } = $$props; - let { hideEmptyState = false } = $$props; - let { noOptionsMessage = "No options" } = $$props; - let { isMulti = false } = $$props; - let { activeItemIndex = 0 } = $$props; - let { filterText = "" } = $$props; - let isScrollingTimer = 0; - let isScrolling = false; - let prev_items; - - onMount(() => { - if (items.length > 0 && !isMulti && value) { - const _hoverItemIndex = items.findIndex(item => item[optionIdentifier] === value[optionIdentifier]); - - if (_hoverItemIndex) { - $$invalidate(1, hoverItemIndex = _hoverItemIndex); - } - } - - scrollToActiveItem("active"); - - container.addEventListener( - "scroll", - () => { - clearTimeout(isScrollingTimer); - - isScrollingTimer = setTimeout( - () => { - isScrolling = false; - }, - 100 - ); - }, - false - ); - }); - - beforeUpdate(() => { - if (items !== prev_items && items.length > 0) { - $$invalidate(1, hoverItemIndex = 0); - } - - prev_items = items; - }); - - function handleSelect(item) { - if (item.isCreator) return; - dispatch("itemSelected", item); - } - - function handleHover(i) { - if (isScrolling) return; - $$invalidate(1, hoverItemIndex = i); - } - - function handleClick(args) { - const { item, i, event } = args; - event.stopPropagation(); - if (value && !isMulti && value[optionIdentifier] === item[optionIdentifier]) return closeList(); - - if (item.isCreator) { - dispatch("itemCreated", filterText); - } else { - $$invalidate(17, activeItemIndex = i); - $$invalidate(1, hoverItemIndex = i); - handleSelect(item); - } - } - - function closeList() { - dispatch("closeList"); - } - - async function updateHoverItem(increment) { - if (isVirtualList) return; - let isNonSelectableItem = true; - - while (isNonSelectableItem) { - if (increment > 0 && hoverItemIndex === items.length - 1) { - $$invalidate(1, hoverItemIndex = 0); - } else if (increment < 0 && hoverItemIndex === 0) { - $$invalidate(1, hoverItemIndex = items.length - 1); - } else { - $$invalidate(1, hoverItemIndex = hoverItemIndex + increment); - } - - isNonSelectableItem = items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable; - } - - await tick(); - scrollToActiveItem("hover"); - } - - function handleKeyDown(e) { - switch (e.key) { - case "ArrowDown": - e.preventDefault(); - items.length && updateHoverItem(1); - break; - case "ArrowUp": - e.preventDefault(); - items.length && updateHoverItem(-1); - break; - case "Enter": - e.preventDefault(); - if (items.length === 0) break; - const hoverItem = items[hoverItemIndex]; - if (value && !isMulti && value[optionIdentifier] === hoverItem[optionIdentifier]) { - closeList(); - break; - } - if (hoverItem.isCreator) { - dispatch("itemCreated", filterText); - } else { - $$invalidate(17, activeItemIndex = hoverItemIndex); - handleSelect(items[hoverItemIndex]); - } - break; - case "Tab": - e.preventDefault(); - if (items.length === 0) break; - if (value && value[optionIdentifier] === items[hoverItemIndex][optionIdentifier]) return closeList(); - $$invalidate(17, activeItemIndex = hoverItemIndex); - handleSelect(items[hoverItemIndex]); - break; - } - } - - function scrollToActiveItem(className) { - if (isVirtualList || !container) return; - let offsetBounding; - const focusedElemBounding = container.querySelector(`.listItem .${className}`); - - if (focusedElemBounding) { - offsetBounding = container.getBoundingClientRect().bottom - focusedElemBounding.getBoundingClientRect().bottom; - } - - $$invalidate(0, container.scrollTop -= offsetBounding, container); - } - - const writable_props = [ - "container", - "VirtualList", - "Item", - "isVirtualList", - "items", - "getOptionLabel", - "getGroupHeaderLabel", - "itemHeight", - "hoverItemIndex", - "value", - "optionIdentifier", - "hideEmptyState", - "noOptionsMessage", - "isMulti", - "activeItemIndex", - "filterText" - ]; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - const mouseover_handler = i => handleHover(i); - const click_handler = (item, i, event) => handleClick({ item, i, event }); - - function div_binding($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - container = $$value; - $$invalidate(0, container); - }); - } - - const mouseover_handler_1 = i => handleHover(i); - const click_handler_1 = (item, i, event) => handleClick({ item, i, event }); - - function div_binding_1($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - container = $$value; - $$invalidate(0, container); - }); - } - - $$self.$$set = $$props => { - if ("container" in $$props) $$invalidate(0, container = $$props.container); - if ("VirtualList" in $$props) $$invalidate(2, VirtualList = $$props.VirtualList); - if ("Item" in $$props) $$invalidate(3, Item$1 = $$props.Item); - if ("isVirtualList" in $$props) $$invalidate(4, isVirtualList = $$props.isVirtualList); - if ("items" in $$props) $$invalidate(5, items = $$props.items); - if ("getOptionLabel" in $$props) $$invalidate(6, getOptionLabel = $$props.getOptionLabel); - if ("getGroupHeaderLabel" in $$props) $$invalidate(7, getGroupHeaderLabel = $$props.getGroupHeaderLabel); - if ("itemHeight" in $$props) $$invalidate(8, itemHeight = $$props.itemHeight); - if ("hoverItemIndex" in $$props) $$invalidate(1, hoverItemIndex = $$props.hoverItemIndex); - if ("value" in $$props) $$invalidate(9, value = $$props.value); - if ("optionIdentifier" in $$props) $$invalidate(10, optionIdentifier = $$props.optionIdentifier); - if ("hideEmptyState" in $$props) $$invalidate(11, hideEmptyState = $$props.hideEmptyState); - if ("noOptionsMessage" in $$props) $$invalidate(12, noOptionsMessage = $$props.noOptionsMessage); - if ("isMulti" in $$props) $$invalidate(18, isMulti = $$props.isMulti); - if ("activeItemIndex" in $$props) $$invalidate(17, activeItemIndex = $$props.activeItemIndex); - if ("filterText" in $$props) $$invalidate(13, filterText = $$props.filterText); - }; - - $$self.$capture_state = () => ({ - beforeUpdate, - createEventDispatcher, - onMount, - tick, - ItemComponent: Item, - dispatch, - container, - VirtualList, - Item: Item$1, - isVirtualList, - items, - getOptionLabel, - getGroupHeaderLabel, - itemHeight, - hoverItemIndex, - value, - optionIdentifier, - hideEmptyState, - noOptionsMessage, - isMulti, - activeItemIndex, - filterText, - isScrollingTimer, - isScrolling, - prev_items, - handleSelect, - handleHover, - handleClick, - closeList, - updateHoverItem, - handleKeyDown, - scrollToActiveItem, - isItemActive, - isItemFirst, - isItemHover - }); - - $$self.$inject_state = $$props => { - if ("container" in $$props) $$invalidate(0, container = $$props.container); - if ("VirtualList" in $$props) $$invalidate(2, VirtualList = $$props.VirtualList); - if ("Item" in $$props) $$invalidate(3, Item$1 = $$props.Item); - if ("isVirtualList" in $$props) $$invalidate(4, isVirtualList = $$props.isVirtualList); - if ("items" in $$props) $$invalidate(5, items = $$props.items); - if ("getOptionLabel" in $$props) $$invalidate(6, getOptionLabel = $$props.getOptionLabel); - if ("getGroupHeaderLabel" in $$props) $$invalidate(7, getGroupHeaderLabel = $$props.getGroupHeaderLabel); - if ("itemHeight" in $$props) $$invalidate(8, itemHeight = $$props.itemHeight); - if ("hoverItemIndex" in $$props) $$invalidate(1, hoverItemIndex = $$props.hoverItemIndex); - if ("value" in $$props) $$invalidate(9, value = $$props.value); - if ("optionIdentifier" in $$props) $$invalidate(10, optionIdentifier = $$props.optionIdentifier); - if ("hideEmptyState" in $$props) $$invalidate(11, hideEmptyState = $$props.hideEmptyState); - if ("noOptionsMessage" in $$props) $$invalidate(12, noOptionsMessage = $$props.noOptionsMessage); - if ("isMulti" in $$props) $$invalidate(18, isMulti = $$props.isMulti); - if ("activeItemIndex" in $$props) $$invalidate(17, activeItemIndex = $$props.activeItemIndex); - if ("filterText" in $$props) $$invalidate(13, filterText = $$props.filterText); - if ("isScrollingTimer" in $$props) isScrollingTimer = $$props.isScrollingTimer; - if ("isScrolling" in $$props) isScrolling = $$props.isScrolling; - if ("prev_items" in $$props) prev_items = $$props.prev_items; - }; - - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } - - return [ - container, - hoverItemIndex, - VirtualList, - Item$1, - isVirtualList, - items, - getOptionLabel, - getGroupHeaderLabel, - itemHeight, - value, - optionIdentifier, - hideEmptyState, - noOptionsMessage, - filterText, - handleHover, - handleClick, - handleKeyDown, - activeItemIndex, - isMulti, - mouseover_handler, - click_handler, - div_binding, - mouseover_handler_1, - click_handler_1, - div_binding_1 - ]; -} - -class List extends SvelteComponentDev { - constructor(options) { - super(options); - - init( - this, - options, - instance$7, - create_fragment$7, - safe_not_equal, - { - container: 0, - VirtualList: 2, - Item: 3, - isVirtualList: 4, - items: 5, - getOptionLabel: 6, - getGroupHeaderLabel: 7, - itemHeight: 8, - hoverItemIndex: 1, - value: 9, - optionIdentifier: 10, - hideEmptyState: 11, - noOptionsMessage: 12, - isMulti: 18, - activeItemIndex: 17, - filterText: 13 - }, - [-1, -1] - ); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "List", - options, - id: create_fragment$7.name - }); - } - - get container() { - return this.$$.ctx[0]; - } - - set container(container) { - this.$set({ container }); - flush(); - } - - get VirtualList() { - return this.$$.ctx[2]; - } - - set VirtualList(VirtualList) { - this.$set({ VirtualList }); - flush(); - } - - get Item() { - return this.$$.ctx[3]; - } - - set Item(Item) { - this.$set({ Item }); - flush(); - } - - get isVirtualList() { - return this.$$.ctx[4]; - } - - set isVirtualList(isVirtualList) { - this.$set({ isVirtualList }); - flush(); - } - - get items() { - return this.$$.ctx[5]; - } - - set items(items) { - this.$set({ items }); - flush(); - } - - get getOptionLabel() { - return this.$$.ctx[6]; - } - - set getOptionLabel(getOptionLabel) { - this.$set({ getOptionLabel }); - flush(); - } - - get getGroupHeaderLabel() { - return this.$$.ctx[7]; - } - - set getGroupHeaderLabel(getGroupHeaderLabel) { - this.$set({ getGroupHeaderLabel }); - flush(); - } - - get itemHeight() { - return this.$$.ctx[8]; - } - - set itemHeight(itemHeight) { - this.$set({ itemHeight }); - flush(); - } - - get hoverItemIndex() { - return this.$$.ctx[1]; - } - - set hoverItemIndex(hoverItemIndex) { - this.$set({ hoverItemIndex }); - flush(); - } - - get value() { - return this.$$.ctx[9]; - } - - set value(value) { - this.$set({ value }); - flush(); - } - - get optionIdentifier() { - return this.$$.ctx[10]; - } - - set optionIdentifier(optionIdentifier) { - this.$set({ optionIdentifier }); - flush(); - } - - get hideEmptyState() { - return this.$$.ctx[11]; - } - - set hideEmptyState(hideEmptyState) { - this.$set({ hideEmptyState }); - flush(); - } - - get noOptionsMessage() { - return this.$$.ctx[12]; - } - - set noOptionsMessage(noOptionsMessage) { - this.$set({ noOptionsMessage }); - flush(); - } - - get isMulti() { - return this.$$.ctx[18]; - } - - set isMulti(isMulti) { - this.$set({ isMulti }); - flush(); - } - - get activeItemIndex() { - return this.$$.ctx[17]; - } - - set activeItemIndex(activeItemIndex) { - this.$set({ activeItemIndex }); - flush(); - } - - get filterText() { - return this.$$.ctx[13]; - } - - set filterText(filterText) { - this.$set({ filterText }); - flush(); - } -} - -var List$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - 'default': List -}); - -/* test/src/TestIcon.svelte generated by Svelte v3.35.0 */ - -const file$6 = "test/src/TestIcon.svelte"; - -function create_fragment$6(ctx) { - let svg; - let path; - - const block = { - c: function create() { - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "d", "M11.0526 0.294881L9.28328 2.06416L13.9577 6.71672L15.7051 4.94744C16.0983\n 4.55427 16.0983 4.00819 15.7051 3.61502L12.4068 0.294881C11.9918 -0.0982935\n 11.4457 -0.0982935 11.0526 0.294881ZM2.11877 11.2164L1.66007 13.4881L2.51195\n 14.3618L4.78362 13.8812L2.11877 11.2164ZM0 15.5631L1.11399 10.2116L8.51877\n 2.80683L13.1932 7.45939L5.76655 14.8642L0.371331 15.9563C0.349488 15.9782\n 0.327645 15.9782 0.305802 15.9782C0.174744 15.9782 0 15.8471 0 15.5631Z"); - attr_dev(path, "fill", "currentColor"); - add_location(path, file$6, 6, 2, 110); - attr_dev(svg, "id", "testIcon"); - attr_dev(svg, "width", "16"); - attr_dev(svg, "height", "16"); - attr_dev(svg, "viewBox", "0 0 16 16"); - attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); - add_location(svg, file$6, 0, 0, 0); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, svg, anchor); - append_dev(svg, path); - }, - p: noop, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(svg); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$6.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$6($$self, $$props) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("TestIcon", slots, []); - const writable_props = []; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - return []; -} - -class TestIcon extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$6, create_fragment$6, safe_not_equal, {}); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "TestIcon", - options, - id: create_fragment$6.name - }); - } -} - -/* test/src/TestClearIcon.svelte generated by Svelte v3.35.0 */ - -const file$5 = "test/src/TestClearIcon.svelte"; - -function create_fragment$5(ctx) { - let svg; - let path; - - const block = { - c: function create() { - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "d", "m437 75c-100-100-262-100-362 0-100 100-100 262 0 362 100 100 262 100 362 0 100-100 100-262 0-362z m-86 274c-1 1-1 1 0 0-5 4-10 6-15 7-6 0-11-2-15-6l-65-65-65 65c-4 4-9 6-15 6-5 0-10-2-14-6-8-8-8-21-1-29 0 0 0 0 1 0l65-65-65-65c-8-8-8-21 0-29 8-8 21-8 29 0l65 65 65-65c8-8 21-8 29 0 8 8 8 21 0 29l-65 65 65 65c8 8 8 21 1 28z"); - attr_dev(path, "fill", "currentColor"); - add_location(path, file$5, 0, 76, 76); - attr_dev(svg, "class", "testClearIcon"); - attr_dev(svg, "width", "100%"); - attr_dev(svg, "height", "100%"); - attr_dev(svg, "viewBox", "0 0 512 512"); - add_location(svg, file$5, 0, 0, 0); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, svg, anchor); - append_dev(svg, path); - }, - p: noop, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(svg); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$5.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$5($$self, $$props) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("TestClearIcon", slots, []); - const writable_props = []; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - return []; -} - -class TestClearIcon extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$5, create_fragment$5, safe_not_equal, {}); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "TestClearIcon", - options, - id: create_fragment$5.name - }); - } -} - -/* test/src/Select/Select--default.svelte generated by Svelte v3.35.0 */ - -const file$4 = "test/src/Select/Select--default.svelte"; - -function create_fragment$4(ctx) { - let div; - let input; - - const block = { - c: function create() { - div = element("div"); - input = element("input"); - attr_dev(input, "autocomplete", "off"); - attr_dev(input, "autocorrect", "off"); - attr_dev(input, "spellcheck", false); - attr_dev(input, "placeholder", "Select..."); - add_location(input, file$4, 1, 2, 32); - attr_dev(div, "class", "selectContainer"); - add_location(div, file$4, 0, 0, 0); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - append_dev(div, input); - }, - p: noop, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$4.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$4($$self, $$props) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("Select_default", slots, []); - const writable_props = []; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - return []; -} - -class Select_default extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$4, create_fragment$4, safe_not_equal, {}); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "Select_default", - options, - id: create_fragment$4.name - }); - } -} - -/* test/src/Select/Select--multiSelected.svelte generated by Svelte v3.35.0 */ - -const file$3 = "test/src/Select/Select--multiSelected.svelte"; - -function create_fragment$3(ctx) { - let link; - let t0; - let div7; - let div2; - let div0; - let t2; - let div1; - let svg0; - let path0; - let t3; - let div5; - let div3; - let t5; - let div4; - let svg1; - let path1; - let t6; - let input; - let t7; - let div6; - let svg2; - let path2; - - const block = { - c: function create() { - link = element("link"); - t0 = space(); - div7 = element("div"); - div2 = element("div"); - div0 = element("div"); - div0.textContent = "Pizza"; - t2 = space(); - div1 = element("div"); - svg0 = svg_element("svg"); - path0 = svg_element("path"); - t3 = space(); - div5 = element("div"); - div3 = element("div"); - div3.textContent = "Chips"; - t5 = space(); - div4 = element("div"); - svg1 = svg_element("svg"); - path1 = svg_element("path"); - t6 = space(); - input = element("input"); - t7 = space(); - div6 = element("div"); - svg2 = svg_element("svg"); - path2 = svg_element("path"); - attr_dev(link, "rel", "stylesheet"); - attr_dev(link, "href", "../reset.css"); - add_location(link, file$3, 1, 0, 26); - attr_dev(div0, "class", "multiSelectItem_label svelte-1i6xooq"); - add_location(div0, file$3, 5, 6, 154); - attr_dev(path0, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124 l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); - add_location(path0, file$3, 10, 10, 370); - attr_dev(svg0, "width", "100%"); - attr_dev(svg0, "height", "100%"); - attr_dev(svg0, "viewBox", "-2 -2 50 50"); - attr_dev(svg0, "focusable", "false"); - attr_dev(svg0, "role", "presentation"); - attr_dev(svg0, "class", "svelte-1i6xooq"); - add_location(svg0, file$3, 9, 8, 267); - attr_dev(div1, "class", "multiSelectItem_clear svelte-1i6xooq"); - add_location(div1, file$3, 8, 6, 223); - attr_dev(div2, "class", "multiSelectItem svelte-1i6xooq"); - add_location(div2, file$3, 4, 4, 118); - attr_dev(div3, "class", "multiSelectItem_label svelte-1i6xooq"); - add_location(div3, file$3, 16, 6, 647); - attr_dev(path1, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124 l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); - add_location(path1, file$3, 21, 10, 863); - attr_dev(svg1, "width", "100%"); - attr_dev(svg1, "height", "100%"); - attr_dev(svg1, "viewBox", "-2 -2 50 50"); - attr_dev(svg1, "focusable", "false"); - attr_dev(svg1, "role", "presentation"); - attr_dev(svg1, "class", "svelte-1i6xooq"); - add_location(svg1, file$3, 20, 8, 760); - attr_dev(div4, "class", "multiSelectItem_clear svelte-1i6xooq"); - add_location(div4, file$3, 19, 6, 716); - attr_dev(div5, "class", "multiSelectItem svelte-1i6xooq"); - add_location(div5, file$3, 15, 4, 611); - attr_dev(input, "autocomplete", "off"); - attr_dev(input, "autocorrect", "off"); - attr_dev(input, "spellcheck", "true"); - attr_dev(input, "placeholder", ""); - attr_dev(input, "class", "svelte-1i6xooq"); - add_location(input, file$3, 26, 2, 1102); - attr_dev(path2, "fill", "currentColor"); - attr_dev(path2, "d", "M34.923,37.251L24,26.328L13.077,37.251L9.436,33.61l10.923-10.923L9.436,11.765l3.641-3.641L24,19.047L34.923,8.124 l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z"); - add_location(path2, file$3, 29, 6, 1311); - attr_dev(svg2, "width", "100%"); - attr_dev(svg2, "height", "100%"); - attr_dev(svg2, "viewBox", "-2 -2 50 50"); - attr_dev(svg2, "focusable", "false"); - attr_dev(svg2, "role", "presentation"); - add_location(svg2, file$3, 28, 4, 1212); - attr_dev(div6, "class", "clearSelect svelte-1i6xooq"); - add_location(div6, file$3, 27, 2, 1182); - attr_dev(div7, "class", "selectContainer multiSelect svelte-1i6xooq"); - add_location(div7, file$3, 3, 0, 72); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, link, anchor); - insert_dev(target, t0, anchor); - insert_dev(target, div7, anchor); - append_dev(div7, div2); - append_dev(div2, div0); - append_dev(div2, t2); - append_dev(div2, div1); - append_dev(div1, svg0); - append_dev(svg0, path0); - append_dev(div7, t3); - append_dev(div7, div5); - append_dev(div5, div3); - append_dev(div5, t5); - append_dev(div5, div4); - append_dev(div4, svg1); - append_dev(svg1, path1); - append_dev(div7, t6); - append_dev(div7, input); - append_dev(div7, t7); - append_dev(div7, div6); - append_dev(div6, svg2); - append_dev(svg2, path2); - }, - p: noop, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(link); - if (detaching) detach_dev(t0); - if (detaching) detach_dev(div7); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$3.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$3($$self, $$props) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("Select_multiSelected", slots, []); - const writable_props = []; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - return []; -} - -class Select_multiSelected extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$3, create_fragment$3, safe_not_equal, {}); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "Select_multiSelected", - options, - id: create_fragment$3.name - }); - } -} - -/* test/src/List/List--default.svelte generated by Svelte v3.35.0 */ - -const file$2 = "test/src/List/List--default.svelte"; - -function create_fragment$2(ctx) { - let link; - let t0; - let div10; - let div1; - let div0; - let t2; - let div3; - let div2; - let t4; - let div5; - let div4; - let t6; - let div7; - let div6; - let t8; - let div9; - let div8; - - const block = { - c: function create() { - link = element("link"); - t0 = space(); - div10 = element("div"); - div1 = element("div"); - div0 = element("div"); - div0.textContent = "Chocolate"; - t2 = space(); - div3 = element("div"); - div2 = element("div"); - div2.textContent = "Pizza"; - t4 = space(); - div5 = element("div"); - div4 = element("div"); - div4.textContent = "Cake"; - t6 = space(); - div7 = element("div"); - div6 = element("div"); - div6.textContent = "Chips"; - t8 = space(); - div9 = element("div"); - div8 = element("div"); - div8.textContent = "Ice Cream"; - attr_dev(link, "rel", "stylesheet"); - attr_dev(link, "href", "../reset.css"); - add_location(link, file$2, 1, 0, 26); - attr_dev(div0, "class", "item"); - add_location(div0, file$2, 4, 30, 130); - attr_dev(div1, "class", "listItem hover svelte-mj7ksi"); - add_location(div1, file$2, 4, 2, 102); - attr_dev(div2, "class", "item"); - add_location(div2, file$2, 5, 24, 194); - attr_dev(div3, "class", "listItem svelte-mj7ksi"); - add_location(div3, file$2, 5, 2, 172); - attr_dev(div4, "class", "item"); - add_location(div4, file$2, 6, 24, 254); - attr_dev(div5, "class", "listItem svelte-mj7ksi"); - add_location(div5, file$2, 6, 2, 232); - attr_dev(div6, "class", "item"); - add_location(div6, file$2, 7, 24, 313); - attr_dev(div7, "class", "listItem svelte-mj7ksi"); - add_location(div7, file$2, 7, 2, 291); - attr_dev(div8, "class", "item"); - add_location(div8, file$2, 8, 24, 373); - attr_dev(div9, "class", "listItem svelte-mj7ksi"); - add_location(div9, file$2, 8, 2, 351); - attr_dev(div10, "class", "listContainer svelte-mj7ksi"); - add_location(div10, file$2, 3, 0, 72); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, link, anchor); - insert_dev(target, t0, anchor); - insert_dev(target, div10, anchor); - append_dev(div10, div1); - append_dev(div1, div0); - append_dev(div10, t2); - append_dev(div10, div3); - append_dev(div3, div2); - append_dev(div10, t4); - append_dev(div10, div5); - append_dev(div5, div4); - append_dev(div10, t6); - append_dev(div10, div7); - append_dev(div7, div6); - append_dev(div10, t8); - append_dev(div10, div9); - append_dev(div9, div8); - }, - p: noop, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(link); - if (detaching) detach_dev(t0); - if (detaching) detach_dev(div10); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$2.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$2($$self, $$props) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("List_default", slots, []); - const writable_props = []; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - return []; -} - -class List_default extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$2, create_fragment$2, safe_not_equal, {}); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "List_default", - options, - id: create_fragment$2.name - }); - } -} - -/* test/src/Select/ParentContainer.svelte generated by Svelte v3.35.0 */ -const file$1 = "test/src/Select/ParentContainer.svelte"; - -function create_fragment$1(ctx) { - let div; - let select; - let updating_value; - let t0; - let p; - let t1_value = /*value*/ ctx[0].label + ""; - let t1; - let current; - - function select_value_binding(value) { - /*select_value_binding*/ ctx[2](value); - } - - let select_props = { items: /*items*/ ctx[1] }; - - if (/*value*/ ctx[0] !== void 0) { - select_props.value = /*value*/ ctx[0]; - } - - select = new Select({ props: select_props, $$inline: true }); - binding_callbacks.push(() => bind(select, "value", select_value_binding)); - - const block = { - c: function create() { - div = element("div"); - create_component(select.$$.fragment); - t0 = space(); - p = element("p"); - t1 = text(t1_value); - attr_dev(p, "class", "result"); - add_location(p, file$1, 10, 2, 178); - attr_dev(div, "class", "container"); - add_location(div, file$1, 7, 0, 112); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - mount_component(select, div, null); - append_dev(div, t0); - append_dev(div, p); - append_dev(p, t1); - current = true; - }, - p: function update(ctx, [dirty]) { - const select_changes = {}; - if (dirty & /*items*/ 2) select_changes.items = /*items*/ ctx[1]; - - if (!updating_value && dirty & /*value*/ 1) { - updating_value = true; - select_changes.value = /*value*/ ctx[0]; - add_flush_callback(() => updating_value = false); - } - - select.$set(select_changes); - if ((!current || dirty & /*value*/ 1) && t1_value !== (t1_value = /*value*/ ctx[0].label + "")) set_data_dev(t1, t1_value); - }, - i: function intro(local) { - if (current) return; - transition_in(select.$$.fragment, local); - current = true; - }, - o: function outro(local) { - transition_out(select.$$.fragment, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - destroy_component(select); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$1.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance$1($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("ParentContainer", slots, []); - let { value } = $$props; - let { items } = $$props; - const writable_props = ["value", "items"]; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - function select_value_binding(value$1) { - value = value$1; - $$invalidate(0, value); - } - - $$self.$$set = $$props => { - if ("value" in $$props) $$invalidate(0, value = $$props.value); - if ("items" in $$props) $$invalidate(1, items = $$props.items); - }; - - $$self.$capture_state = () => ({ Select, value, items }); - - $$self.$inject_state = $$props => { - if ("value" in $$props) $$invalidate(0, value = $$props.value); - if ("items" in $$props) $$invalidate(1, items = $$props.items); - }; - - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } - - return [value, items, select_value_binding]; -} - -class ParentContainer extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$1, create_fragment$1, safe_not_equal, { value: 0, items: 1 }); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "ParentContainer", - options, - id: create_fragment$1.name - }); - - const { ctx } = this.$$; - const props = options.props || {}; - - if (/*value*/ ctx[0] === undefined && !("value" in props)) { - console.warn(" was created without expected prop 'value'"); - } - - if (/*items*/ ctx[1] === undefined && !("items" in props)) { - console.warn(" was created without expected prop 'items'"); - } - } - - get value() { - return this.$$.ctx[0]; - } - - set value(value) { - this.$set({ value }); - flush(); - } - - get items() { - return this.$$.ctx[1]; - } - - set items(items) { - this.$set({ items }); - flush(); - } -} - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ -/* global Reflect, Promise */ - - - - - - - - - - - - - -function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [0, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -var fulfil; -var done = new Promise(function (f) { - fulfil = f; -}); -function start() { - if (!running) { - running = true; - console.log('TAP version 13'); - Promise.resolve().then(function () { - var hasOnly = tests.some(function (test) { return test.only; }); - tests.forEach(function (test) { - test.shouldRun = test.skip - ? false - : hasOnly ? test.only : true; - }); - dequeue(); - }); - } -} -var test = Object.assign(function test(name, fn) { - tests.push({ name: name, fn: fn, skip: false, only: false, shouldRun: false }); - start(); -}, { - skip: function (name, fn) { - tests.push({ name: name, fn: fn, skip: true, only: false, shouldRun: null }); - start(); - }, - only: function (name, fn) { - tests.push({ name: name, fn: fn, skip: false, only: true, shouldRun: null }); - start(); - } -}); -var i = 0; -var running = false; -var tests = []; -var passed = 0; -var failed = 0; -var skipped = 0; -var isNode = typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]'; -function logResult(ok, operator, msg, info) { - if (info === void 0) { info = {}; } - if (ok) { - console.log("ok " + i + " \u2014 " + msg); - passed += 1; - } - else { - console.log("not ok " + i + " \u2014 " + msg); - failed += 1; - console.log(' ---'); - console.log(" operator: " + operator); - if (isNode) { - var util = require('util'); - if ('expected' in info) - console.log(" expected:\n " + util.format(info.expected).replace(/\n/gm, "\n ")); - if ('actual' in info) - console.log(" actual:\n " + util.format(info.actual).replace(/\n/gm, "\n ")); - } - else { - if ('expected' in info) - console.log(" expected:", info.expected); - if ('actual' in info) - console.log(" actual:", info.actual); - } - // find where the error occurred, and try to clean it up - var lines = new Error().stack.split('\n').slice(3); - var cwd_1 = ''; - if (isNode) { - cwd_1 = process.cwd(); - if (/[\/\\]/.test(cwd_1[0])) - cwd_1 += cwd_1[0]; - var dirname = typeof __dirname === 'string' && __dirname.replace(/dist$/, ''); - for (var i_1 = 0; i_1 < lines.length; i_1 += 1) { - if (~lines[i_1].indexOf(dirname)) { - lines = lines.slice(0, i_1); - break; - } - } - } - var stack = lines - .map(function (line) { return " " + line.replace(cwd_1, '').trim(); }) - .join('\n'); - console.log(" stack: \n" + stack); - console.log(" ..."); - } -} -var assert = { - fail: function (msg) { return logResult(false, 'fail', msg); }, - pass: function (msg) { return logResult(true, 'pass', msg); }, - ok: function (value, msg) { - if (msg === void 0) { msg = 'should be truthy'; } - return logResult(Boolean(value), 'ok', msg, { - actual: value, - expected: true - }); - }, - equal: function (a, b, msg) { - if (msg === void 0) { msg = 'should be equal'; } - return logResult(a === b, 'equal', msg, { - actual: a, - expected: b - }); - }, - throws: function (fn, expected, msg) { - if (msg === void 0) { msg = 'should throw'; } - try { - fn(); - logResult(false, 'throws', msg, { - expected: expected - }); - } - catch (err) { - if (expected instanceof Error) { - logResult(err.name === expected.name, 'throws', msg, { - actual: err.name, - expected: expected.name - }); - } - else if (expected instanceof RegExp) { - logResult(expected.test(err.toString()), 'throws', msg, { - actual: err.toString(), - expected: expected - }); - } - else if (typeof expected === 'function') { - logResult(expected(err), 'throws', msg, { - actual: err - }); - } - else { - throw new Error("Second argument to t.throws must be an Error constructor, regex, or function"); - } - } - } -}; -function dequeue() { - return __awaiter(this, void 0, void 0, function () { - var test, err_1, total; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - test = tests[i++]; - if (!test) return [3 /*break*/, 5]; - if (!test.shouldRun) { - if (test.skip) { - console.log("# skip " + test.name); - } - skipped += 1; - dequeue(); - return [2 /*return*/]; - } - console.log("# " + test.name); - _a.label = 1; - case 1: - _a.trys.push([1, 3, , 4]); - return [4 /*yield*/, test.fn(assert)]; - case 2: - _a.sent(); - return [3 /*break*/, 4]; - case 3: - err_1 = _a.sent(); - failed += 1; - console.log("not ok " + i + " \u2014 " + err_1.message); - console.error(" " + err_1.stack.replace(/^\s+/gm, ' ')); - return [3 /*break*/, 4]; - case 4: - dequeue(); - return [3 /*break*/, 6]; - case 5: - total = passed + failed + skipped; - console.log("\n1.." + total); - console.log("# tests " + total); - if (passed) - console.log("# pass " + passed); - if (failed) - console.log("# fail " + failed); - if (skipped) - console.log("# skip " + skipped); - fulfil(); - if (isNode) - process.exit(failed ? 1 : 0); - _a.label = 6; - case 6: return [2 /*return*/]; - } - }); - }); -} - -function querySelectorClick(selector) { - document.querySelector(selector).click(); - return new Promise(f => setTimeout(f, 0)); -} - -function handleKeyboard(key) { - window.dispatchEvent(new KeyboardEvent('keydown', {'key': key})); - return new Promise(f => setTimeout(f, 0)); -} - -function handleSet(component, data) { - component.$set(data); - return new Promise(f => setTimeout(f, 0)); -} - -function focus(element, setFocus) { - return new Promise(fulfil => { - element.addEventListener('focus', function handler() { - element.removeEventListener('focus', handler); - fulfil(true); - }); - - if (setFocus) setFocus(); - }); -} - -// setup -const target = document.createElement('main'); -document.body.appendChild(target); - -const testTarget = document.createElement("div"); -testTarget.id = 'testTemplate'; -document.body.appendChild(testTarget); - -const extraTarget = document.createElement("div"); -extraTarget.id = 'extra'; -document.body.appendChild(extraTarget); - - - -const items = [ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - {value: 'chips', label: 'Chips'}, - {value: 'ice-cream', label: 'Ice Cream'}, -]; -const itemsWithGroup = [ - {value: 'chocolate', label: 'Chocolate', group: 'Sweet'}, - {value: 'pizza', label: 'Pizza', group: 'Savory'}, - {value: 'cake', label: 'Cake', group: 'Sweet'}, - {value: 'chips', label: 'Chips', group: 'Savory'}, - {value: 'ice-cream', label: 'Ice Cream', group: 'Sweet'} -]; -const itemsWithIndex = [ - {value: 'chocolate', label: 'Chocolate', index: 0}, - {value: 'pizza', label: 'Pizza', index: 1}, - {value: 'cake', label: 'Cake', index: 2}, - {value: 'chips', label: 'Chips', index: 3}, - {value: 'ice-cream', label: 'Ice Cream', index: 4}, -]; - -function wait(ms) { - return new Promise(f => setTimeout(f, ms)); -} - -assert.htmlEqual = (a, b) => { - assert.equal(normalizeHtml(a), normalizeHtml(b)); -}; - -assert.arrayEqual = (a, b) => { - assert.ok(Array.isArray(a)); - assert.ok(Array.isArray(b)); - assert.equal(a.length, b.length); - assert.ok(a.every((val, i) => val === b[i])); -}; - -// tests -test('with no data creates default elements', async (t) => { - const testTemplate = new Select_default({ - target: testTarget - }); - - const select = new Select({ - target, - }); - - t.htmlEqual(target.innerHTML, testTarget.innerHTML); - - testTemplate.$destroy(); - select.$destroy(); -}); - -test('when isFocused true container adds focused class', async (t) => { - const select = new Select({ - target, - props: { - isFocused: true - } - }); - - t.ok(target.querySelector('.focused')); - - select.$destroy(); -}); - -test('when isFocused changes to true input should focus', async (t) => { - const select = new Select({ - target, - props: { - isFocused: false - } - }); - - const setFocus = () => { - select.$set({isFocused: true}); - }; - - const hasFocused = await focus(target.querySelector('.selectContainer input'), setFocus); - t.ok(hasFocused); - select.$destroy(); -}); - -test('default empty list', async (t) => { - const list = new List({ - target, - }); - - t.ok(target.querySelector('.empty')); - - list.$destroy(); -}); - -test('default list with five items', async (t) => { - const list = new List({ - target, - props: { - items: itemsWithIndex - } - }); - - t.ok(target.getElementsByClassName('listItem').length); - - list.$destroy(); -}); - -test('should highlight active list item', async (t) => { - const list = new List({ - target, - props: { - items: itemsWithIndex, - value: {value: 'pizza', label: 'Pizza', index: 1} - } - }); - - t.ok(target.querySelector('.listItem .active').innerHTML === 'Pizza'); - - list.$destroy(); -}); - -test('list scrolls to active item', async (t) => { - const extras = [ - {value: 'chicken-schnitzel', label: 'Chicken Schnitzel', index: 5}, - {value: 'fried-chicken', label: 'Fried Chicken', index: 6}, - {value: 'sunday-roast', label: 'Sunday Roast', index: 7}, - ]; - const list = new List({ - target, - props: { - items: itemsWithIndex.concat(extras), - value: {value: 'sunday-roast', label: 'Sunday Roast'}, - } - }); - - let offsetBounding; - const container = target.querySelector('.listContainer'); - const focusedElemBounding = container.querySelector('.listItem .active'); - if (focusedElemBounding) { - offsetBounding = container.getBoundingClientRect().bottom - focusedElemBounding.getBoundingClientRect().bottom; - } - - t.equal(offsetBounding, 0); - list.$destroy(); -}); - -test('list scrolls to hovered item when navigating with keys', async (t) => { - const extras = [ - {value: 'chicken-schnitzel', label: 'Chicken Schnitzel', index: 5}, - {value: 'fried-chicken', label: 'Fried Chicken', index: 6}, - {value: 'sunday-roast', label: 'Sunday Roast', index: 7}, - ]; - const list = new List({ - target, - props: { - items: itemsWithIndex.concat(extras) - } - }); - - const container = target.querySelector('.listContainer'); - const totalListItems = container.querySelectorAll('.listItem').length; - let selectedItemsAreWithinBounds = true; - let loopCount = 1; - - do { - await handleKeyboard('ArrowDown'); - - const hoveredItem = container.querySelector('.listItem .hover'); - const isInViewport = container.getBoundingClientRect().bottom - hoveredItem.getBoundingClientRect().bottom >= 0; - - selectedItemsAreWithinBounds = selectedItemsAreWithinBounds && isInViewport; - - loopCount += 1; - } while (loopCount < totalListItems); - - - t.ok(selectedItemsAreWithinBounds); - list.$destroy(); -}); - -test('hover item updates on keyUp or keyDown', async (t) => { - const list = new List({ - target, - props: { - items: items, - activeItemIndex: 0, - } - }); - - await handleKeyboard('ArrowDown'); - const focusedElemBounding = target.querySelector('.listItem .hover'); - t.equal(focusedElemBounding.innerHTML.trim(), `Pizza`); - list.$destroy(); -}); - -test('on enter active item fires a itemSelected event', async (t) => { - const list = new List({ - target, - props: { - items: itemsWithIndex - } - }); - - let value = undefined; - list.$on('itemSelected', event => { - value = event; - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(JSON.stringify(value.detail), JSON.stringify({value: 'cake', label: 'Cake', index: 2})); - list.$destroy(); -}); - -test('on tab active item fires a itemSelected event', async (t) => { - const list = new List({ - target, - props: { - items: itemsWithIndex - } - }); - - let value = undefined; - list.$on('itemSelected', event => { - value = event; - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Tab'})); - t.equal(JSON.stringify(value.detail), JSON.stringify({value: 'cake', label: 'Cake', index: 2})); - list.$destroy(); -}); - -test('on selected of current active item does not fire a itemSelected event', async (t) => { - const list = new List({ - target, - props: { - items: itemsWithIndex, - value: { value: 'chocolate', label: 'Chocolate', index: 0 } - } - }); - - let itemSelectedFired = false; - - list.$on('itemSelected', () => { - itemSelectedFired = true; - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - - t.equal(itemSelectedFired, false); - list.$destroy(); -}); - -test('selected item\'s default view', async (t) => { - const select = new Select({ - target, - props: { - value: {value: 'chips', label: 'Chips'}, - } - }); - - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); - select.$destroy(); -}); - -test('select view updates with value updates', async (t) => { - const select = new Select({ - target, - }); - - await handleSet(select, {value: {value: 'chips', label: 'Chips'}}); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); - - select.$destroy(); -}); - -test('clear wipes value and updates view', async (t) => { - const select = new Select({ - target, - props: { - value: {value: 'chips', label: 'Chips'}, - } - }); - - await wait(0); - await handleSet(select, {value: undefined}); - t.ok(!target.querySelector('.selectedItem .selection')); - - select.$destroy(); -}); - -test('clicking on Select opens List', async (t) => { - const select = new Select({ - target, - }); - - await querySelectorClick('.selectContainer'); - const listContainer = document.querySelector('.listContainer'); - t.ok(listContainer); - - select.$destroy(); -}); - -test('Select opens List populated with items', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - await querySelectorClick('.selectContainer'); - t.ok(target.querySelector('.listItem')); - - select.$destroy(); -}); - -test('List starts with first item in hover state', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - await querySelectorClick('.selectContainer'); - t.ok(target.querySelector('.listItem .hover').innerHTML === 'Chocolate'); - - select.$destroy(); -}); - -test('List starts with first item in hover state', async (t) => { - const testTemplate = new List_default({ - target: testTarget - }); - - const select = new Select({ - target, - props: { - items, - } - }); - - document.querySelector('.selectContainer').click(); - - testTemplate.$destroy(); - select.$destroy(); -}); - -test('select item from list', async (t) => { - const select = new Select({ - target, - props: { - items, - } - }); - - await querySelectorClick('.selectContainer'); - await handleKeyboard('ArrowDown'); - await handleKeyboard('ArrowDown'); - await handleKeyboard('Enter'); - t.ok(document.querySelector('.selection').innerHTML === 'Cake'); - - select.$destroy(); -}); - -test('when listPosition is set to top list should be above the input', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true, - listPlacement: 'top' - } - }); - - await wait(0); - const distanceOfListBottomFromViewportTop = document.querySelector('.listContainer').getBoundingClientRect().bottom; - const distanceOfInputTopFromViewportTop = document.querySelector('.selectContainer').getBoundingClientRect().top; - - t.ok(distanceOfListBottomFromViewportTop <= distanceOfInputTopFromViewportTop); - - select.$destroy(); -}); - -test('when listPlacement is set to bottom the list should be below the input', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true, - listPlacement: 'bottom' - } - }); - - await wait(0); - const distanceOfListTopFromViewportTop = document.querySelector('.listContainer').getBoundingClientRect().top; - const distanceOfInputBottomFromViewportTop = document.querySelector('.selectContainer').getBoundingClientRect().bottom; - - t.ok(distanceOfListTopFromViewportTop >= distanceOfInputBottomFromViewportTop); - - select.$destroy(); -}); - -test('blur should close list and remove focus from select', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - - const select = new Select({ - target, - props: { - items - } - }); - - select.$set({isFocused: true}); - div.click(); - div.remove(); - t.ok(!document.querySelector('.listContainer')); - t.ok(document.querySelector('.selectContainer input') !== document.activeElement); - select.$destroy(); -}); - -test('selecting item should close list but keep focus on select', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer').click(); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - t.ok(!document.querySelector('.listContainer')); - t.ok(document.querySelector('.selectContainer.focused')); - select.$destroy(); -}); - -test('clicking Select with selected item should open list with item listed as active', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer').click(); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - document.querySelector('.selectContainer').click(); - await wait(0); - t.ok(document.querySelector('.listItem .hover').innerHTML === 'Cake'); - select.$destroy(); -}); - -test('focus on Select input updates focus state', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer input').focus(); - - t.ok(select.isFocused); - select.$destroy(); -}); - -test('key up and down when Select focused opens list', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer input').focus(); - await wait(0); - t.ok(select.isFocused); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - await wait(0); - t.ok(document.querySelector('.listContainer')); - - select.$destroy(); -}); - -test('List should keep width of parent Select', async (t) => { - const select = new Select({ - target, - props: { - items, - isFocused: true - } - }); - - document.querySelector('.selectContainer input').focus(); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - await wait(0); - const selectContainer = document.querySelector('.selectContainer'); - const listContainer = document.querySelector('.listContainer'); - t.equal(selectContainer.offsetWidth, listContainer.offsetWidth); - - select.$destroy(); -}); - -test('Placeholder text should reappear when List is closed', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer').click(); - div.click(); - div.remove(); - const selectInput = document.querySelector('.selectContainer input'); - t.equal(selectInput.attributes.placeholder.value, 'Select...'); - - select.$destroy(); -}); - -test('typing in Select filter will hide selected Item', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer').click(); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - select.$set({filterText: 'potato'}); - t.ok(!document.querySelector('.selectContainer .value')); - - select.$destroy(); -}); - -test('clearing selected item closes List if open', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer').click(); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - select.handleClear(); - await wait(0); - t.ok(!document.querySelector('.listContainer')); - - select.$destroy(); -}); - -test('closing List clears Select filter text', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer').click(); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - select.$set({filterText: 'potato'}); - div.click(); - div.remove(); - const selectInput = document.querySelector('.selectContainer input'); - t.equal(selectInput.attributes.placeholder.value, 'Select...'); - - select.$destroy(); -}); - -test('closing List clears Select filter text', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer').click(); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - select.$set({filterText: 'potato'}); - div.click(); - div.remove(); - const selectInput = document.querySelector('.selectContainer input'); - t.equal(selectInput.attributes.placeholder.value, 'Select...'); - - select.$destroy(); -}); - -test('closing List item clears Select filter text', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - - const select = new Select({ - target, - props: { - items - } - }); - - document.querySelector('.selectContainer').click(); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - select.$set({filterText: 'potato'}); - div.click(); - div.remove(); - const selectInput = document.querySelector('.selectContainer input'); - t.equal(selectInput.attributes.placeholder.value, 'Select...'); - - select.$destroy(); -}); - -test('typing while Select is focused populates Select filter text', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - select.$set({isFocused: true}); - document.querySelector('.selectContainer input').blur(); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 't'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'e'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 's'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 't'})); - // KeyboardEvent not firing in svelte - not sure why, manual test seems to work - - select.$destroy(); -}); - -test('Select input placeholder wipes while item is selected', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {name: 'Item #2'}, - } - }); - - const selectInput = document.querySelector('.selectContainer input'); - t.equal(selectInput.attributes.placeholder.value, ''); - - select.$destroy(); -}); - -test('Select listOpen state controls List', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true - } - }); - - await wait(0); - t.ok(document.querySelector('.listContainer')); - await handleSet(select, {listOpen: false}); - t.ok(!document.querySelector('.listContainer')); - - select.$destroy(); -}); - -test('clicking Select toggles List open state', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - t.ok(!document.querySelector('.listContainer')); - await querySelectorClick('.selectContainer'); - t.ok(document.querySelector('.listContainer')); - await querySelectorClick('.selectContainer'); - t.ok(!document.querySelector('.listContainer')); - - select.$destroy(); -}); - -test('Select filter text filters list', async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - await wait(0); - t.ok(select.filteredItems.length === 5); - await handleSet(select, {filterText: 'Ice'}); - t.ok(select.filteredItems.length === 1); - - select.$destroy(); -}); - -test('Select filter text filters list with itemFilter', async (t) => { - const select = new Select({ - target, - props: { - items, - itemFilter: (label, filterText, option) => label === 'Ice Cream' - } - }); - - await wait(0); - t.ok(select.filteredItems.length === 5); - await handleSet(select, {filterText: 'cream ice'}); - t.ok(select.filteredItems.length === 1); - - select.$destroy(); -}); - -test('Typing in the Select filter opens List', async (t) => { - const select = new Select({ - target, - props: { - items, - isFocused: true - } - }); - - await handleSet(select, {filterText: '5'}); - t.ok(document.querySelector('.listContainer')); - select.$destroy(); -}); - -test('While filtering, the first item in List should receive hover class', async (t) => { - const select = new Select({ - target, - props: { - items, - isFocused: true - } - }); - - await handleSet(select, {filterText: 'I'}); - t.ok(document.querySelector('.listItem .hover')); - select.$destroy(); -}); - -test('Select container styles can be overridden', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {name: 'Item #2'}, - containerStyles: `padding-left: 40px;` - } - }); - - t.equal(document.querySelector('.selectContainer').style.cssText, `padding-left: 40px;`); - select.$destroy(); -}); - -test('Select can be disabled', async (t) => { - const select = new Select({ - target, - props: { - items, - isDisabled: true, - } - }); - - t.ok(document.querySelector('.selectContainer.disabled')); - - select.$destroy(); -}); - -test('Select List closes when you click enter', async (t) => { - const select = new Select({ - target, - props: { - items, - isFocused: true - } - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - - - select.$destroy(); -}); - -test('tabbing should move between tabIndexes and others Selects', async (t) => { - const select = new Select({ - target, - props: { - items, - isFocused: false - } - }); - - const other = new Select({ - target: extraTarget, - props: { - items, - isFocused: false - } - }); - - // window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Tab'})); - // TAB not working from Puppeteer - not sure why. - - select.$destroy(); - other.$destroy(); -}); - -test(`shouldn't be able to clear a disabled Select`, async (t) => { - const select = new Select({ - target, - props: { - items, - isDisabled: true, - value: {name: 'Item #4'} - } - }); - - - t.ok(!document.querySelector('.clearSelect')); - - select.$destroy(); -}); - -test(`two way binding between Select and it's parent component`, async (t) => { - const parent = new ParentContainer({ - target, - props: { - items, - value: {value: 'chips', label: 'Chips'}, - } - }); - - t.equal(document.querySelector('.selection').innerHTML, document.querySelector('.result').innerHTML); - - parent.$set({ - value: {value: 'ice-cream', label: 'Ice Cream'}, - }); - - t.equal(document.querySelector('.selection').innerHTML, document.querySelector('.result').innerHTML); - document.querySelector('.selectContainer').click(); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(document.querySelector('.selection').innerHTML, document.querySelector('.result').innerHTML); - - parent.$destroy(); -}); - -test(`show ellipsis for overflowing text in a List item`, async (t) => { - const longest = 'super super super super super super super super super super super super super super super super super super super super super super super super super super super super loooooonnnng name'; - - target.style.width = '300px'; - - const list = new List({ - target, - props: { - items: [ - { - index: 0, - label: longest - }, - { - index: 1, - label: 'Not so loooooonnnng name' - } - ] - } - }); - - const first = document.querySelector('.listItem:first-child .item'); - const last = document.querySelector('.listItem:last-child .item'); - - t.ok(first.scrollWidth > first.clientWidth); - t.ok(last.scrollWidth === last.clientWidth); - - list.$destroy(); - target.style.width = ''; -}); - - -test('clicking between Selects should close and blur other Select', async (t) => { - const select = new Select({ - target, - props: { - items, - isFocused: false - } - }); - - const other = new Select({ - target: extraTarget, - props: { - items, - isFocused: false - } - }); - - await querySelectorClick('.selectContainer'); - t.ok(select.list); - await querySelectorClick('#extra .selectContainer'); - t.ok(!select.list); - t.ok(other.list); - - select.$destroy(); - other.$destroy(); -}); - -test('if only one item in list it should have hover state', async (t) => { - const list = new List({ - target, - props: { - items: [{ - index: 0, - name: 'test one' - }] - } - }); - - t.ok(document.querySelector('.listItem .item').classList.contains('hover')); - - list.$destroy(); -}); - -test(`hovered item in a filtered list shows hover state`, async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - select.$set({filterText: 'i'}); - - // const lastItem = document.querySelector('.listItem:last-child'); - // hover item and check for hover state - - t.ok(true); - - select.$destroy(); -}); - -test(`data shouldn't be stripped from item - currently only saves name`, async (t) => { - const select = new Select({ - target, - props: { - items - } - }); - - await querySelectorClick('.selectContainer'); - await querySelectorClick('.listItem'); - t.equal(JSON.stringify(select.value), JSON.stringify({value: 'chocolate', label: 'Chocolate'})); - - select.$destroy(); -}); - -test('should not be able to clear when clearing is disabled', async (t) => { - const select = new Select({ - target, - props: { - items, - isClearable: false - } - }); - - document.querySelector('.selectContainer').click(); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - - t.ok(!document.querySelector('.clearSelect')); - - select.$destroy(); -}); - -test('should not be able to search when searching is disabled', async (t) => { - const select = new Select({ - target, - props: { - items, - isSearchable: false - } - }); - - const selectInput = document.querySelector('.selectContainer input'); - t.ok(selectInput.attributes.readonly); - - select.$destroy(); -}); - -test('should display indicator when searching is disabled', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - - const select = new Select({ - target, - props: { - items, - isSearchable: false - } - }); - - t.ok(document.querySelector('.indicator')); - - select.$destroy(); -}); - -test('placeholder should be prop value', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - - const placeholder = 'Test placeholder value'; - - const select = new Select({ - target, - props: { - items: itemsWithGroup, - placeholder - } - }); - - const selectInput = document.querySelector('.selectContainer input'); - t.equal(selectInput.attributes.placeholder.value, placeholder); - - select.$destroy(); -}); - -test('should display spinner when waiting is enabled', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - - const select = new Select({ - target, - props: { - items, - isWaiting: true - } - }); - - t.ok(document.querySelector('.spinner')); - - select.$destroy(); -}); - -test('inputStyles prop applies css to select input', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'pizza', label: 'Pizza'}, - inputStyles: `padding-left: 40px;` - } - }); - - t.equal(document.querySelector('.selectContainer input').style.cssText, `padding-left: 40px;`); - select.$destroy(); -}); - -test('items should be grouped by groupBy expression', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - items: itemsWithGroup, - groupBy - } - }); - - function groupBy(item) { - return item.group; - } - - await wait(0); - - const groupedListItems = select.list.items; - - groupedListItems.forEach((item, itemIndex) => { - if(itemIndex > 0) { - const prevItem = groupedListItems[itemIndex - 1]; - const prevItemIsHeaderOrInSameGroup = item.group === (prevItem.isGroupHeader ? prevItem.value : prevItem.group); - t.ok(item.isGroupHeader || prevItemIsHeaderOrInSameGroup); - } - }); - - select.$destroy(); -}); - - -test('clicking group header should not make a selected', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - items: itemsWithGroup, - groupBy: (item) => item.group - } - }); - - await wait(0); - await querySelectorClick('.listGroupTitle'); - - t.equal(select.value, undefined); - - select.$destroy(); -}); - -test('when groupBy, no active item and keydown enter is fired then list should close without selecting item', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - items: itemsWithGroup, - groupBy: (item) => item.group - } - }); - - await wait(0); - await querySelectorClick('.selectContainer'); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(select.value, undefined); - - select.$destroy(); -}); - -test('when isGroupHeaderSelectable clicking group header should select createGroupHeaderItem(groupValue,item)', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - items: itemsWithGroup, - isGroupHeaderSelectable: true, - groupBy, - createGroupHeaderItem - } - }); - - function groupBy(item) { - return item.group; - } - - function createGroupHeaderItem(groupValue, item) { - return { - label: `XXX ${groupValue} XXX ${item.label}` - }; - } - - await querySelectorClick('.selectContainer'); - - const groupHeaderItem = select.list.items[0]; - const groupItem = select.list.items.find((item) => { - return item.group === groupHeaderItem.id; - }); - - await querySelectorClick('.listItem'); - - t.ok(select.value.isGroupHeader); - t.equal(select.value.label, createGroupHeaderItem(groupBy(groupItem), groupItem).label); - - select.$destroy(); -}); - -test('group headers label should be created by getGroupHeaderLabel(item)', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - items: itemsWithGroup, - groupBy, - getGroupHeaderLabel - } - }); - - function groupBy(item) { - return item.group; - } - - function getGroupHeaderLabel(item) { - return `Group label is ${item.id}`; - } - - await querySelectorClick('.selectContainer'); - - const groupHeaderItem = select.list.items[0]; - - t.equal(target.querySelector('.listGroupTitle').textContent, getGroupHeaderLabel(groupHeaderItem)); - - select.$destroy(); -}); - -test('groups should be sorted by expression', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - items: itemsWithGroup, - groupBy: (item) => item.group, - groupFilter: (groups) => groups.reverse() - } - }); - - await wait(); - - t.ok(target.querySelector('.listGroupTitle').textContent.trim() === 'Savory'); - t.ok(target.querySelector('.listItem').textContent.trim() === 'Pizza'); - - select.$destroy(); -}); - -test('when isMulti is true show each item in value', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'chips', label: 'Chips'}, - ], - } - }); - - const all = target.querySelectorAll('.multiSelectItem .multiSelectItem_label'); - t.ok(all[0].innerHTML === 'Pizza'); - t.ok(all[1].innerHTML === 'Chips'); - - select.$destroy(); -}); - -test('when isMulti is true and value is undefined show placeholder text', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: undefined - } - }); - - t.ok(!target.querySelector('.multiSelectItem')); - - select.$destroy(); -}); - -test('when isMulti is true clicking item in List will populate value', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: undefined - } - }); - - await querySelectorClick('.selectContainer'); - await querySelectorClick('.listItem'); - - t.equal(JSON.stringify(select.value), JSON.stringify([{value: 'chocolate', label: 'Chocolate'}])); - - select.$destroy(); -}); - -test('when isMulti is true items in value will not appear in List', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [{value: 'chocolate', label: 'Chocolate'}] - } - }); - - t.equal(JSON.stringify(select.filteredItems), JSON.stringify([ - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - {value: 'chips', label: 'Chips'}, - {value: 'ice-cream', label: 'Ice Cream'} - ])); - - select.$destroy(); -}); - -test('when isMulti is true both value and filterText filters List', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - isMulti: true, - items, - filterText: 'Pizza', - value: [{value: 'chocolate', label: 'Chocolate'}] - } - }); - - t.equal(JSON.stringify(select.filteredItems), JSON.stringify([ - {value: 'pizza', label: 'Pizza'} - ])); - - select.$destroy(); -}); - -test('when isMulti is true clicking X on a selected item will remove it from value', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] - } - }); - - document.querySelector('.multiSelectItem_clear').click(); - t.equal(JSON.stringify(select.value), JSON.stringify([{value: 'pizza', label: 'Pizza'}])); - - select.$destroy(); -}); - -test('when isMulti is true and all selected items have been removed then placeholder should show and clear all should hide', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [{value: 'chocolate', label: 'Chocolate'}] - } - }); - - document.querySelector('.multiSelectItem_clear').click(); - - select.$destroy(); -}); - -test('when isMulti is true and items are selected then clear all should wipe all selected items', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] - } - }); - - document.querySelector('.clearSelect').click(); - t.equal(select.value, undefined); - - select.$destroy(); -}); - -test('when isMulti and groupBy is active then items should be selectable', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items: itemsWithGroup, - groupBy: (item) => item.group - } - }); - - target.style.maxWidth = '400px'; - await querySelectorClick('.selectContainer'); - await querySelectorClick('.listItem'); - t.equal(JSON.stringify(select.value), JSON.stringify([{"isGroupItem":true,"value":"chocolate","label":"Chocolate","group":"Sweet"}])); - - select.$destroy(); -}); - -test('when isMulti and selected items reach edge of container then Select height should increase and selected items should wrap to new line', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items - } - }); - - target.style.maxWidth = '250px'; - t.ok(document.querySelector('.selectContainer').scrollHeight === 42); - await handleSet(select, {value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}]}); - t.ok(document.querySelector('.selectContainer').scrollHeight > 44); - select.$destroy(); -}); - -test('when isMulti and value is populated then navigating with LeftArrow updates activevalue', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], - isFocused: true - } - }); - - target.style.maxWidth = '100%'; - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - t.ok(select.$capture_state().activevalue === 1); - - select.$destroy(); -}); - -test('when isMulti and value is populated then navigating with ArrowRight updates activevalue', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], - isFocused: true - } - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowRight'})); - t.ok(select.$capture_state().activevalue === 1); - - select.$destroy(); -}); - -test('when isMulti and value has items and list opens then first item in list should be active', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - isFocused: true - } - }); - - await querySelectorClick('.selectContainer'); - await querySelectorClick('.listItem'); - await handleKeyboard('ArrowDown'); - - t.ok(document.querySelector('.listItem .hover')); - - select.$destroy(); -}); - -test('when isMulti, isDisabled, and value has items then items should be locked', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - isDisabled: true, - value: [{value: 'chocolate', label: 'Chocolate'}], - } - }); - - t.ok(document.querySelector('.multiSelectItem.disabled')); - - select.$destroy(); -}); - -test('when isMulti is true show each item in value if simple arrays are used', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - test: true, - items: ['pizza', 'chips', 'chocolate'], - value: ['pizza', 'chocolate'] - } - }); - - const all = target.querySelectorAll('.multiSelectItem .multiSelectItem_label'); - t.ok(all[0].innerHTML === 'pizza'); - t.ok(all[1].innerHTML === 'chocolate'); - - select.$destroy(); -}); - -test('when getValue method is set should use that key to update value', async (t) => { - const select = new Select({ - target, - props: { - items: [{id: 0, label: 'ONE'}, {id: 1, label: 'TWO'}], - value: {id: 0, label: 'ONE'}, - optionIdentifier: 'id' - } - }); - - t.ok(select.value.id === 0); - await querySelectorClick('.selectContainer'); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.value.id === 1); - - select.$destroy(); -}); - -test('when loadOptions method is supplied and filterText has length then items should populate via promise resolve', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - Item: CustomItem, - Selection: CustomItem - } - }); - - select.$set({filterText: 'Juniper'}); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - - select.$destroy(); -}); - -test('when noOptionsMessage is set and there are no items then show message', async (t) => { - const select = new Select({ - target, - props: { - noOptionsMessage: 'SO SO SO SCANDALOUS', - isFocused: true - } - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - await wait(0); - t.ok(document.querySelector('.empty').innerHTML === 'SO SO SO SCANDALOUS'); - - select.$destroy(); -}); - -test('when getSelectionLabel method is supplied and value are no items then display result of getSelectionLabel', async (t) => { - const select = new Select({ - target, - props: { - getSelectionLabel: (option) => option.notLabel, - value: {notLabel: 'This is not a label', value: 'not important'}, - } - }); - - - t.ok(document.querySelector('.selection').innerHTML === 'This is not a label'); - - select.$destroy(); -}); - -test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.notLabel, - isFocused: true, - items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], - } - }); - - await handleKeyboard('ArrowDown'); - t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); - - select.$destroy(); -}); - -test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.notLabel, - isFocused: true, - items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], - } - }); - - await handleKeyboard('ArrowDown'); - t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); - - select.$destroy(); -}); - - -test('when a custom Item component is supplied then use to display each item', async (t) => { - const select = new Select({ - target, - props: { - Item: CustomItem, - getOptionLabel: (option) => option.name, - isFocused: true, - items: [{ - image_url: 'https://images.punkapi.com/v2/keg.png', - name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], - } - }); - - await handleKeyboard('ArrowDown'); - t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); - - select.$destroy(); -}); - -test('when a custom Selection component is supplied then use to display selection', async (t) => { - const select = new Select({ - target, - props: { - Item: CustomItem, - Selection: CustomItem, - getOptionLabel: (option) => option.name, - isFocused: true, - items: [{ - image_url: 'https://images.punkapi.com/v2/keg.png', - name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], - } - }); - - await handleKeyboard('ArrowDown'); - await handleKeyboard('Enter'); - - t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); - - select.$destroy(); -}); - -test('when loadOptions method is supplied, isMulti is true and filterText has length then items should populate via promise resolve', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.name, - getSelectionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - Item: CustomItem, - isMulti: true - } - }); - - await wait(0); - await handleSet(select, {filterText: 'Juniper'}); - await wait(600); - await handleKeyboard('ArrowDown'); - await handleKeyboard('Enter'); - t.ok(document.querySelector('.multiSelectItem_label').innerHTML === 'Juniper Wheat Beer'); - select.$destroy(); -}); - -test('when getSelectionLabel contains HTML then render the HTML', async (t) => { - const select = new Select({ - target, - props: { - value: items[0], - getSelectionLabel: (option) => `

${option.label}

`, - } - }); - - t.ok(document.querySelector('.selection').innerHTML === '

Chocolate

'); - - select.$destroy(); -}); - -test('when getOptionLabel contains HTML then render the HTML', async (t) => { - const select = new Select({ - target, - props: { - items, - getOptionLabel: (option) => `

${option.label}

`, - isFocused: true - } - }); - - await handleKeyboard('ArrowDown'); - t.ok(document.querySelector('.item').innerHTML === '

Chocolate

'); - - select.$destroy(); -}); - -test('when isMulti is true, value populated and arrowLeft is pressed then no items in list should be active', async (t) => { - const selectMultiSelected = new Select_multiSelected({ - target: testTarget, - }); - - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'chips', label: 'Chips'}, - ], - isFocused: true - - } - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - t.ok(!document.querySelector('.hover')); - select.$destroy(); - selectMultiSelected.$destroy(); -}); - -test('when hideEmptyState true then do not show "no options" div ', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true, - filterText: 'x', - hideEmptyState: true - } - }); - - await wait(0); - - t.ok(!document.querySelector('.empty')); - - select.$destroy(); -}); - -test('when value changes then select event should fire', async (t) => { - const select = new Select({ - target, - props: { - items, - } - }); - - let selectEvent = undefined; - - select.$on('select', event => { - selectEvent = event; - }); - - await handleSet(select, {isFocused: true}); - await handleKeyboard('ArrowDown'); - await handleKeyboard('Enter'); - - t.ok(selectEvent); - - select.$destroy(); -}); - -test('when value is cleared the clear event is fired', async (t) => { - const select = new Select({ - target, - props: { - items, - value: items[0], - } - }); - - let clearEvent = false; - select.$on('clear', () => { - clearEvent = true; - }); - - document.querySelector('.clearSelect').click(); - t.ok(clearEvent); - - select.$destroy(); -}); - -test('when multi item is cleared the clear event is fired with removed item', async (t) => { - const itemToRemove = items[0]; - - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [itemToRemove] - } - }); - - let removedItem; - - select.$on('clear', (event) => { - removedItem = event.detail; - }); - - document.querySelector('.multiSelectItem_clear').click(); - t.equal(JSON.stringify(removedItem), JSON.stringify(itemToRemove)); - - select.$destroy(); -}); - -test('when items in list filter or update then first item in list should highlight', async (t) => { - const select = new Select({ - target, - props: { - items, - isFocused: true - } - }); - - await handleKeyboard('ArrowDown'); - await handleKeyboard('ArrowDown'); - await handleKeyboard('ArrowDown'); - - t.ok(document.querySelector('.hover').innerHTML === 'Cake'); - await handleSet(select, {filterText: 'c'}); - t.ok(document.querySelector('.hover').innerHTML === 'Chocolate'); - - select.$destroy(); -}); - -test('when item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'cake', label: 'Cake'} - } - }); - - let item = undefined; - - select.$on('select', () => { - item = true; - }); - - await handleSet(select, {value: {value: 'cake', label: 'Cake'}}); - - t.ok(!item); - select.$destroy(); -}); - -test('when isMulti and item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'chips', label: 'Chips'}, - ], - } - }); - - let item = undefined; - - select.$on('select', () => { - item = true; - }); - - await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'},{value: 'chips', label: 'Chips'}]}); - t.ok(!item); - item = false; - await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'}]}); - - t.ok(item); - select.$destroy(); -}); - -test('when isFocused turns to false then check Select is no longer in focus', async (t) => { - const select = new Select({ - target, - props: { - isFocused: true, - items, - } - }); - - const selectSecond = new Select({ - target: extraTarget, - props: { - isFocused: false, - items, - } - }); - - select.$on('select', () => { - setTimeout(() => { - select.$set({ - isFocused: false, - }); - }, 0); - - selectSecond.$set({ - isFocused: true - }); - }); - - await handleSet(select, {value: {value: 'pizza', label: 'Pizza'}}); - - - await wait(0); - - t.ok(selectSecond.isFocused); - t.ok(!select.isFocused); - - selectSecond.$destroy(); - select.$destroy(); -}); - -test('when items and loadOptions method are both supplied then fallback to items until filterText changes', async (t) => { - const items = [{name: 'test1', id: 0}, {name: 'test2', id: 1}, {name: 'test3', id: 2}]; - - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.name, - getSelectionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - items, - isFocused: true, - listOpen: true - } - }); - - select.$on('state', ({current, changed}) => { - if (changed.filterText && current.filterText === '' && !current.value) { - select.$set({ - items - }); - } - }); - - await wait(0); - t.ok(document.querySelector('.item').innerHTML === 'test1'); - await handleSet(select, {filterText: 'Juniper'}); - await wait(500); - t.ok(document.querySelector('.item').innerHTML === 'Juniper Wheat Beer'); - await handleSet(select, {filterText: ''}); - t.ok(document.querySelector('.item').innerHTML === 'test1'); - - select.$destroy(); -}); - -test('when items is just an array of strings then render list', async (t) => { - const items = ['one', 'two', 'three']; - - const select = new Select({ - target, - props: { - items, - listOpen: true - } - }); - - await wait(0); - t.ok(document.querySelector('.item').innerHTML === 'one'); - - select.$destroy(); -}); - -test('when items are just strings then value should render', async (t) => { - const items = ['one', 'two', 'three']; - - const select = new Select({ - target, - props: { - items, - value: {value: 'one', label: 'one', index: 0} - } - }); - - t.ok(document.querySelector('.selection').innerHTML === 'one'); - select.$destroy(); -}); - -test('when isVirtualList then render list', async (t) => { - function fill(len, fn) { - return Array(len).fill().map((_, i) => fn(i)); - } - - const items = fill(10000, (i) => { - const name = nameyMcNameface(); - return name - }); - - const select = new Select({ - target, - props: { - items, - isVirtualList: true, - listOpen: true - } - }); - - await wait(0); - t.ok(document.querySelector('.listItem')); - - select.$destroy(); -}); - -test('when isVirtualList and filterText changes then rendered list scrolls to top', async (t) => { - function fill(len, fn) { - return Array(len).fill().map((_, i) => fn(i)); - } - - const items = fill(10000, (i) => { - const name = nameyMcNameface(); - return name - }); - - const select = new Select({ - target, - props: { - items, - isVirtualList: true, - listOpen: true - } - }); - - await wait(0); - const virtual = document.querySelector('svelte-virtual-list-viewport'); - virtual.scrollTop = 120000; - - select.$set({ - filterText: 'swift' - }); - - await wait(0); - t.ok(virtual.scrollTop === 0); - - select.$destroy(); -}); - -test('when loadOptions method is supplied but filterText is empty then do not run loadOptions and clean list', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - Item: CustomItem, - Selection: CustomItem - } - }); - - await wait(0); - select.$set({filterText: 'Juniper'}); - await wait(500); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(document.querySelector('.customItem_name').innerHTML === 'Juniper Wheat Beer'); - select.$set({value: undefined, filterText: ''}); - await wait(0); - select.$set({listOpen: true}); - await wait(0); - t.ok(document.querySelector('.empty')); - - select.$destroy(); -}); - -test('when isMulti and value has items then check each item is unique', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - ], - } - }); - - t.ok(select.value.length === 2); - - select.$destroy(); -}); - -test('when isMulti and textFilter has length then enter should select item', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - isFocused: true, - filterText: 'p', - listOpen: true - } - }); - - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.value[0].value === 'pizza'); - - select.$destroy(); -}); - -test('when isMulti and textFilter has length and no items in list then enter should do nothing', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - isFocused: true, - filterText: 'zc', - listOpen: true - } - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.value === undefined); - - select.$destroy(); -}); - -test('When isMulti and no selected item then delete should do nothing', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items, - isFocused: true, - listOpen: true - } - }); - - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Backspace'})); - t.ok(select.listOpen === true); - - select.$destroy(); -}); - -test('When list is open, filterText applied and Enter/Tab key pressed should select and show highlighted value', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - isFocused: true, - filterText: 'A5', - items: ['A5', 'test string', 'something else'] - } - }); - - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(select.value.value, 'A5'); - await wait(0); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'A5'); - - select.$destroy(); -}); - - -test('When inputAttributes is supplied each attribute is placed on the Select input field', async (t) => { - const select = new Select({ - target, - props: { - items, - inputAttributes: { - id: 'testId', - autocomplete: 'custom-value' - } - } - }); - - const el = document.getElementById('testId'); - - t.equal(el.id, 'testId'); - t.equal(el.getAttribute('autocomplete'), 'custom-value'); - - select.$destroy(); -}); - -test('when items and value supplied as just strings then value should render correctly', async (t) => { - const select = new Select({ - target, - props: { - items: ['Pizza', 'Chocolate', 'Crisps'], - value: 'Pizza' - } - }); - - t.equal(document.querySelector('.selectedItem .selection').innerHTML, 'Pizza'); - - select.$destroy(); -}); - -test('when isMulti with items and value supplied as just strings then value should render correctly', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items: ['Pizza', 'Chocolate', 'Crisps'], - value: ['Pizza'] - } - }); - - t.equal(document.querySelector('.multiSelectItem_label').innerHTML, 'Pizza'); - - select.$destroy(); -}); - -test('when isMulti, groupBy and value are supplied then list should be filtered', async (t) => { - let _items = [ - { id: 1, name: "Foo", group: "first" }, - { id: 2, name: "Bar", group: "second" }, - { id: 3, name: "Baz", group: "second" }, - { id: 4, name: "Qux", group: "first" } - ]; - - const select = new Select({ - target, - props: { - isMulti: true, - items: _items, - groupBy: (item) => item.group, - optionIdentifier: 'id', - getSelectionLabel: (item) => item.name, - getOptionLabel: (item) => item.name, - value: [{ id: 2, name: "Bar", group: "second" }], - listOpen: true - } - }); - - t.ok(!select.filteredItems.find(item => item.name === 'Bar')); - - select.$destroy(); -}); - -test('When isCreatable disabled, creator is not displayed', async (t) => { - const filterText = 'abc'; - - const select = new Select({ - target, - props: { - items, - isFocused: true, - listOpen: true - } - }); - - select.$set({ filterText }); - - await wait(0); - - t.ok(document.querySelector('.listContainer > .empty')); - - select.$destroy(); -}); - -test('When isCreatable enabled, creator displays getOptionLabel for isCreator', async (t) => { - const filterText = 'abc_XXXX'; - - function getOptionLabel(item, filterText) { - return item.isCreator ? `Wanna add ${filterText}?`: item.label; - } - - const creatorItem = { label: filterText, value: filterText, isCreator: true }; - - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true, - getOptionLabel - } - }); - - await wait(0); - select.$set({ filterText }); - await wait(0); - const listItems = document.querySelectorAll('.listContainer > .listItem'); - t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, getOptionLabel(creatorItem, filterText)); - - select.$destroy(); -}); - -test('When isCreatable enabled, creator is not displayed when duplicate item value in item list', async (t) => { - const dupeValueForCheck = 'xxxxxx'; - const item = { - value: dupeValueForCheck, - label: dupeValueForCheck - }; - - const select = new Select({ - target, - props: { - items: [item], - isCreatable: true, - listOpen: true - } - }); - - await wait(0); - select.$set({ filterText: dupeValueForCheck }); - await wait(0); - - const listItems = document.querySelectorAll('.listContainer > .listItem'); - t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, dupeValueForCheck); - - select.$destroy(); -}); - -test('When creator selected, selected item is set to created item', async (t) => { - const filterText = 'abc'; - - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true - } - }); - - await wait(0); - select.$set({ filterText }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - - const { value } = select; - t.ok(value.value === 'abc'); - t.ok(value.label === 'abc'); - - select.$destroy(); -}); - -test('When creator is selected, created item it added to multi selection', async (t) => { - const filterText = 'abc'; - - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true, - isMulti: true - } - }); - - await wait(0); - select.$set({ filterText }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - - const { value } = select; - t.ok(value[0].value === 'abc'); - t.ok(value[0].label === 'abc'); - - select.$destroy(); -}); - -test('When creator is selected multiple times, items are all added to multi selection', async (t) => { - const filterTextForItem1 = 'abc'; - const filterTextForItem2 = 'def'; - - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true, - isMulti: true - } - }); - - select.$set({ filterText: filterTextForItem1 }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - t.ok(select.value[0].value === 'abc'); - - select.$set({ filterText: filterTextForItem2 }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - t.ok(select.value[1].value === 'def'); - - select.$destroy(); -}); - -test('When isMulti and an items remove icon is clicked then item should be removed from value', async (t) => { - const select = new Select({ - target, - props: { - items, - isCreatable: true, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - ], - isMulti: true - } - }); - - await querySelectorClick('.multiSelectItem_clear'); - t.ok(select.value[0].value === 'cake'); - await querySelectorClick('.multiSelectItem_clear'); - t.ok(select.value === undefined); - - select.$destroy(); -}); - -test('When isCreatable with non-default item structure, item creator displays getCreatorLabel label for isCreator', async (t) => { - const _items = [ - {country: 'Italy', food: 'Pizza'}, - {country: 'Australia', food: 'Meat Pie'}, - {country: 'China', food: 'Fried Rice'} - ]; - - const filterText = 'Fried Chicken Roll'; - - function creatorLabel(filterText) { - return `Do you want to create ${ filterText } as an added food?`; - } - - function itemDisplay(item, filterText) { - return item.isCreator ? creatorLabel(filterText) : `${item.food} (${item.country})`; - } - - const select = new Select({ - target, - props: { - optionIdentifier: 'food', - getOptionLabel: itemDisplay, - getSelectionLabel: itemDisplay, - items: _items, - isCreatable: true, - createItem(filterText) { - return { - food: filterText, - country: 'Added' - }; - } - } - }); - - await wait(0); - select.$set({ filterText }); - await wait(0); - const listItems = document.querySelectorAll('.listContainer > .listItem'); - t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, creatorLabel(filterText)); - - select.$destroy(); -}); - -test('When isCreatable and isMulti and optionIdentifier is supplied creator displays getCreatorLabel label', async (t) => { - const filterText = 'abc'; - const _items = [ - {foo: 'chocolate', label: 'Chocolate'}, - {foo: 'pizza', label: 'Pizza'} - ]; - - const select = new Select({ - target, - props: { - optionIdentifier: 'foo', - isMulti: true, - items: _items, - isCreatable: true - } - }); - - await wait(0); - select.$set({ filterText }); - await wait(0); - const listItems = document.querySelectorAll('.listContainer > .listItem'); - t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, `Create \"${ filterText }\"`); - - select.$destroy(); -}); - -test('When isCreatable and isMulti and optionIdentifier is supplied multiple creatable items can be added', async (t) => { - const filterText = 'foo'; - const filterText2 = 'bar'; - - const _items = [ - {id: 1, tag_name: 'Banana'}, - {id: 5, tag_name: 'Orange'}, - {id: 4, tag_name: 'Tree'}, - {id: 3, tag_name: 'Guns'}, - {id: 2, tag_name: 'Cars'}, - ]; - - const optionIdentifier = 'tag_name'; - const getOptionLabel = (option) => option.tag_name; - const getSelectionLabel = (option) => option.tag_name; - const createItem = (filterText) => ({id:undefined, tag_name:filterText}); - - const select = new Select({ - target, - props: { - optionIdentifier, - isMulti: true, - items: _items, - isCreatable: true, - getOptionLabel, - getSelectionLabel, - createItem, - } - }); - - await wait(0); - select.$set({ filterText }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - select.$set({ filterText: filterText2 }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - - t.ok(select.value.length === 2); - t.ok(select.value[0].tag_name); - - select.$destroy(); -}); - -test('When isCreatable and item is created then createItem method should only run once', async (t) => { - let createItemRun = 0; - const createItem = (filterText) => { - createItemRun += 1; - return { - value: filterText, - label: filterText - }; - }; - - const select = new Select({ - target, - props: { - isCreatable: true, - items, - createItem - } - }); - - await wait(0); - select.$set({ filterText: 'foo' }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - - t.ok(createItemRun === 2); - - select.$destroy(); -}); - -test('When items are collection and value a string then lookup item using optionIdentifier and update value to match', async (t) => { - const select = new Select({ - target, - props: { - items, - value: 'cake' - } - }); - - await wait(0); - t.ok(select.value.value === 'cake'); - select.$set({ value: 'pizza' }); - await wait(0); - t.ok(select.value.value === 'pizza'); - select.$destroy(); -}); - -test('When listAutoWidth is set to false list container should have style of width:100%', async (t) => { - const select = new Select({ - target, - props: { - items, - listAutoWidth: false, - listOpen: true - } - }); - - await wait(0); - const listWidth = document.querySelectorAll('.selectContainer > div')[0].style.width; - t.ok(listWidth === '100%'); - select.$destroy(); -}); - - -test('When item is already active and is selected from list then close list', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true, - value: 'pizza' - } - }); - - await wait(0); - await querySelectorClick('.listContainer > .listItem > .item.active'); - await wait(0); - t.ok(select.value.value === 'pizza'); - select.$destroy(); -}); - - -test('When Icon prop is supplied then render on Select', async (t) => { - const select = new Select({ - target, - props: { - items, - Icon: TestIcon - } - }); - - t.ok(document.querySelectorAll('#testIcon')[0]); - - select.$destroy(); -}); - -test('When showChevron prop is true only show chevron when there is no value on Select', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'chocolate', label: 'Chocolate'}, - showChevron: true - } - }); - - t.ok(document.querySelectorAll('.indicator').length === 0); - - select.$destroy(); -}); - -test('When showChevron prop is true and no value show chevron on Select', async (t) => { - const select = new Select({ - target, - props: { - items, - showChevron: true - } - }); - - t.ok(document.querySelectorAll('.indicator')[0]); - - select.$destroy(); -}); - -test('When showIndicator prop is true always show chevron on Select', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'chocolate', label: 'Chocolate'}, - showIndicator: true - } - }); - - t.ok(document.querySelectorAll('.indicator')[0]); - - select.$destroy(); -}); - -test('When items and loadItems then listOpen should be false', async (t) => { - const select = new Select({ - target, - props: { - getSelectionLabel: (option) => option.name, - getOptionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - items: [{ - id: 1, - name: 'Initial Items #1' - }] - - } - }); - - t.ok(select.listOpen === false); - - select.$destroy(); -}); - -test('Select container classes can be injected', async (t) => { - const select = new Select({ - target, - props: { - items, - value: { name: 'Item #2' }, - containerClasses: 'testclass', - }, - }); - - t.ok( - document.querySelector('.selectContainer').classList.contains('testclass') - ); - select.$destroy(); -}); - - -test('When noOptionsMessage is changed after List component has been created then propagate update', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - Item: CustomItem, - Selection: CustomItem, - noOptionsMessage: 'FIRST' - }, - }); - - await wait(0); - select.$set({listOpen: true}); - await wait(0); - t.ok(document.querySelector('.empty').innerHTML === 'FIRST'); - select.$set({noOptionsMessage: 'SECOND'}); - await wait(0); - t.ok(document.querySelector('.empty').innerHTML === 'SECOND'); - select.$set({filterText: 'sdfsf ssdfsdfs fs'}); - select.$set({noOptionsMessage: 'THIRD'}); - await wait(0); - t.ok(document.querySelector('.empty').innerHTML === 'THIRD'); - - select.$destroy(); -}); - - -test('When loadOptions promise is resolved then dispatch loaded', async (t) => { - const select = new Select({ - target, - props: { - loadOptions: resolvePromise, - }, - }); - - let loadedEventData = undefined; - const loadedOff = select.$on('loaded', event => { - loadedEventData = event; - }); - let errorEventData = undefined; - const errorOff = select.$on('error', event => { - errorEventData = event; - }); - - await wait(0); - select.$set({listOpen: true}); - await wait(0); - select.$set({filterText: 'test'}); - await wait(500); - t.arrayEqual(loadedEventData.detail.items, ['a', 'b', 'c']); - t.equal(errorEventData, undefined); - - loadedOff(); - errorOff(); - select.$destroy(); -}); - -test('When loadOptions promise is rejected then dispatch error', async (t) => { - const select = new Select({ - target, - props: { - loadOptions: rejectPromise, - }, - }); - - let loadedEventData = undefined; - const loadedOff = select.$on('loaded', event => { - loadedEventData = event; - }); - let errorEventData = undefined; - const errorOff = select.$on('error', event => { - errorEventData = event; - }); - - await wait(0); - select.$set({listOpen: true}); - await wait(0); - select.$set({filterText: 'test'}); - await wait(500); - t.equal(loadedEventData, undefined); - t.equal(errorEventData.detail.type, 'loadOptions'); - t.equal(errorEventData.detail.details, 'error 123'); - - loadedOff(); - errorOff(); - select.$destroy(); -}); - -test('When items change then value should also update', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'chips', label: 'Chips'}, - }, - }); - - await wait(0); - - select.$set({items: [ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - {value: 'chips', label: 'Loaded Fries'}, - {value: 'ice-cream', label: 'Ice Cream'}, - ]}); - - await wait(0); - - t.ok(select.value.label === 'Loaded Fries'); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Loaded Fries'); - - select.$destroy(); - - await wait(0); - - const multiSelect = new Select({ - target, - props: { - isMulti: true, - items, - value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], - }, - }); - - await wait(0); - - multiSelect.$set({items: [ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'pizza', label: 'Cheese Pizza'}, - {value: 'cake', label: 'Cake'}, - {value: 'chips', label: 'Loaded Fries'}, - {value: 'ice-cream', label: 'Ice Cream'}, - ]}); - - await wait(0); - - t.ok(multiSelect.value[0].label === 'Loaded Fries'); - t.ok(multiSelect.value[1].label === 'Cheese Pizza'); - - multiSelect.$destroy(); -}); - -test('When items change then value should also update but only if found in items', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'chips', label: 'Chips'}, - }, - }); - - await wait(0); - - select.$set({items: [ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - {value: 'loaded-fries', label: 'Loaded Fries'}, - {value: 'ice-cream', label: 'Ice Cream'}, - ]}); - - await wait(0); - - t.ok(select.value.label === 'Chips'); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); - - select.$destroy(); -}); - -test('When isMulti and multiFullItemClearable then clicking anywhere on the item will remove item', async (t) => { - const multiSelect = new Select({ - target, - props: { - isMulti: true, - items, - multiFullItemClearable: true, - value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], - }, - }); - - await wait(0); - await querySelectorClick('.multiSelectItem'); - await wait(0); - t.ok(multiSelect.value[0].label === 'Pizza'); - - multiSelect.$destroy(); -}); - -test('when loadOptions and items is supplied then list should close on blur', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - let items=[{value:1, label:1}, {value:2, label:2}]; - let loadOptions = async(filterText) => { - const res = await fetch(`https://api.punkapi.com/v2/beers?beer_name=${filterText}`); - const data = await res.json(); - return data.map((beer)=> ({value: beer.id, label: beer.name})); - }; - - const select = new Select({ - target, - props: { - items, - loadOptions, - } - }); - - select.$set({isFocused: true}); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - await wait(0); - select.$set(({ filterText: 's'})); - await wait(600); - div.click(); - div.remove(); - - select.$destroy(); -}); - - - -test('when isCreatable and item created then event "itemCreated" should dispatch', async (t) => { - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true, - isMulti: true - } - }); - - let eventDetail; - select.$on('itemCreated', (event) => { - eventDetail = event.detail; - }); - - select.$set({ filterText: 'TestCreate' }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - t.ok(eventDetail === 'TestCreate'); - - select.$destroy(); -}); - -async function getCancelledRes() { -} - -test('when loadOptions response returns cancelled true then dont end loading state', async (t) => { - const select = new Select({ - target, - props: { - loadOptions: getCancelledRes, - } - }); - - select.$set({filterText: 'Juniper'}); - await wait(0); - - - select.$destroy(); -}); - -test('when ClearItem replace clear icon', async (t) => { - const select = new Select({ - target, - props: { - items, - ClearIcon: TestClearIcon, - value: {value: 'chips', label: 'Chips'} - } - }); - - t.ok(target.querySelector('.testClearIcon')); - - select.$destroy(); -}); - - -function getPosts(filterText) { - filterText = filterText ? filterText.replace(' ','_') : ''; - - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.open('GET', `https://api.punkapi.com/v2/beers?beer_name=${filterText}`); - xhr.send(); - - xhr.onload = () => { - if (xhr.status >= 200 && xhr.status < 300) { - setTimeout(resolve(JSON.parse(xhr.response).sort((a, b) => { - if (a.name > b.name) return 1; - if (a.name < b.name) return -1; - })), 2000); - } else { - reject(); - } - }; - }); -} - -function resolvePromise() { - return new Promise((resolve, reject) => { - resolve(['a', 'b', 'c']); - }) -} - -function rejectPromise() { - return new Promise((resolve, reject) => { - reject('error 123'); - }) -} - -// this allows us to close puppeteer once tests have completed -window.done = done; - -var index = {}; - -/* src/VirtualList.svelte generated by Svelte v3.35.0 */ -const file = "src/VirtualList.svelte"; - -function get_each_context(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[23] = list[i]; - return child_ctx; -} - -const get_default_slot_changes = dirty => ({ - item: dirty & /*visible*/ 32, - i: dirty & /*visible*/ 32, - hoverItemIndex: dirty & /*hoverItemIndex*/ 2 -}); - -const get_default_slot_context = ctx => ({ - item: /*row*/ ctx[23].data, - i: /*row*/ ctx[23].index, - hoverItemIndex: /*hoverItemIndex*/ ctx[1] -}); - -// (157:21) Missing template -function fallback_block(ctx) { - let t; - - const block = { - c: function create() { - t = text("Missing template"); - }, - m: function mount(target, anchor) { - insert_dev(target, t, anchor); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(t); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: fallback_block.name, - type: "fallback", - source: "(157:21) Missing template", - ctx - }); - - return block; -} - -// (154:8) {#each visible as row (row.index)} -function create_each_block(key_1, ctx) { - let svelte_virtual_list_row; - let t; - let current; - const default_slot_template = /*#slots*/ ctx[15].default; - const default_slot = create_slot(default_slot_template, ctx, /*$$scope*/ ctx[14], get_default_slot_context); - const default_slot_or_fallback = default_slot || fallback_block(ctx); - - const block = { - key: key_1, - first: null, - c: function create() { - svelte_virtual_list_row = element("svelte-virtual-list-row"); - if (default_slot_or_fallback) default_slot_or_fallback.c(); - t = space(); - set_custom_element_data(svelte_virtual_list_row, "class", "svelte-g2cagw"); - add_location(svelte_virtual_list_row, file, 154, 12, 3784); - this.first = svelte_virtual_list_row; - }, - m: function mount(target, anchor) { - insert_dev(target, svelte_virtual_list_row, anchor); - - if (default_slot_or_fallback) { - default_slot_or_fallback.m(svelte_virtual_list_row, null); - } - - append_dev(svelte_virtual_list_row, t); - current = true; - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - - if (default_slot) { - if (default_slot.p && dirty & /*$$scope, visible, hoverItemIndex*/ 16418) { - update_slot(default_slot, default_slot_template, ctx, /*$$scope*/ ctx[14], dirty, get_default_slot_changes, get_default_slot_context); - } - } - }, - i: function intro(local) { - if (current) return; - transition_in(default_slot_or_fallback, local); - current = true; - }, - o: function outro(local) { - transition_out(default_slot_or_fallback, local); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(svelte_virtual_list_row); - if (default_slot_or_fallback) default_slot_or_fallback.d(detaching); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block.name, - type: "each", - source: "(154:8) {#each visible as row (row.index)}", - ctx - }); - - return block; -} - -function create_fragment(ctx) { - let svelte_virtual_list_viewport; - let svelte_virtual_list_contents; - let each_blocks = []; - let each_1_lookup = new Map(); - let svelte_virtual_list_viewport_resize_listener; - let current; - let mounted; - let dispose; - let each_value = /*visible*/ ctx[5]; - validate_each_argument(each_value); - const get_key = ctx => /*row*/ ctx[23].index; - validate_each_keys(ctx, each_value, get_each_context, get_key); - - for (let i = 0; i < each_value.length; i += 1) { - let child_ctx = get_each_context(ctx, each_value, i); - let key = get_key(child_ctx); - each_1_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); - } - - const block = { - c: function create() { - svelte_virtual_list_viewport = element("svelte-virtual-list-viewport"); - svelte_virtual_list_contents = element("svelte-virtual-list-contents"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - set_style(svelte_virtual_list_contents, "padding-top", /*top*/ ctx[6] + "px"); - set_style(svelte_virtual_list_contents, "padding-bottom", /*bottom*/ ctx[7] + "px"); - set_custom_element_data(svelte_virtual_list_contents, "class", "svelte-g2cagw"); - add_location(svelte_virtual_list_contents, file, 149, 4, 3598); - set_style(svelte_virtual_list_viewport, "height", /*height*/ ctx[0]); - set_custom_element_data(svelte_virtual_list_viewport, "class", "svelte-g2cagw"); - add_render_callback(() => /*svelte_virtual_list_viewport_elementresize_handler*/ ctx[18].call(svelte_virtual_list_viewport)); - add_location(svelte_virtual_list_viewport, file, 143, 0, 3437); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, svelte_virtual_list_viewport, anchor); - append_dev(svelte_virtual_list_viewport, svelte_virtual_list_contents); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(svelte_virtual_list_contents, null); - } - - /*svelte_virtual_list_contents_binding*/ ctx[16](svelte_virtual_list_contents); - /*svelte_virtual_list_viewport_binding*/ ctx[17](svelte_virtual_list_viewport); - svelte_virtual_list_viewport_resize_listener = add_resize_listener(svelte_virtual_list_viewport, /*svelte_virtual_list_viewport_elementresize_handler*/ ctx[18].bind(svelte_virtual_list_viewport)); - current = true; - - if (!mounted) { - dispose = listen_dev(svelte_virtual_list_viewport, "scroll", /*handle_scroll*/ ctx[8], false, false, false); - mounted = true; - } - }, - p: function update(ctx, [dirty]) { - if (dirty & /*$$scope, visible, hoverItemIndex*/ 16418) { - each_value = /*visible*/ ctx[5]; - validate_each_argument(each_value); - group_outros(); - validate_each_keys(ctx, each_value, get_each_context, get_key); - each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each_1_lookup, svelte_virtual_list_contents, outro_and_destroy_block, create_each_block, null, get_each_context); - check_outros(); - } - - if (!current || dirty & /*top*/ 64) { - set_style(svelte_virtual_list_contents, "padding-top", /*top*/ ctx[6] + "px"); - } - - if (!current || dirty & /*bottom*/ 128) { - set_style(svelte_virtual_list_contents, "padding-bottom", /*bottom*/ ctx[7] + "px"); - } - - if (!current || dirty & /*height*/ 1) { - set_style(svelte_virtual_list_viewport, "height", /*height*/ ctx[0]); - } - }, - i: function intro(local) { - if (current) return; - - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } - - current = true; - }, - o: function outro(local) { - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } - - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(svelte_virtual_list_viewport); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].d(); - } - - /*svelte_virtual_list_contents_binding*/ ctx[16](null); - /*svelte_virtual_list_viewport_binding*/ ctx[17](null); - svelte_virtual_list_viewport_resize_listener(); - mounted = false; - dispose(); - } - }; - - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment.name, - type: "component", - source: "", - ctx - }); - - return block; -} - -function instance($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots("VirtualList", slots, ['default']); - let { items = undefined } = $$props; - let { height = "100%" } = $$props; - let { itemHeight = 40 } = $$props; - let { hoverItemIndex = 0 } = $$props; - let { start = 0 } = $$props; - let { end = 0 } = $$props; - let height_map = []; - let rows; - let viewport; - let contents; - let viewport_height = 0; - let visible; - let mounted; - let top = 0; - let bottom = 0; - let average_height; - - async function refresh(items, viewport_height, itemHeight) { - const { scrollTop } = viewport; - await tick(); - let content_height = top - scrollTop; - let i = start; - - while (content_height < viewport_height && i < items.length) { - let row = rows[i - start]; - - if (!row) { - $$invalidate(10, end = i + 1); - await tick(); - row = rows[i - start]; - } - - const row_height = height_map[i] = itemHeight || row.offsetHeight; - content_height += row_height; - i += 1; - } - - $$invalidate(10, end = i); - const remaining = items.length - end; - average_height = (top + content_height) / end; - $$invalidate(7, bottom = remaining * average_height); - height_map.length = items.length; - if (viewport) $$invalidate(3, viewport.scrollTop = 0, viewport); - } - - async function handle_scroll() { - const { scrollTop } = viewport; - const old_start = start; - - for (let v = 0; v < rows.length; v += 1) { - height_map[start + v] = itemHeight || rows[v].offsetHeight; - } - - let i = 0; - let y = 0; - - while (i < items.length) { - const row_height = height_map[i] || average_height; - - if (y + row_height > scrollTop) { - $$invalidate(9, start = i); - $$invalidate(6, top = y); - break; - } - - y += row_height; - i += 1; - } - - while (i < items.length) { - y += height_map[i] || average_height; - i += 1; - if (y > scrollTop + viewport_height) break; - } - - $$invalidate(10, end = i); - const remaining = items.length - end; - average_height = y / end; - while (i < items.length) height_map[i++] = average_height; - $$invalidate(7, bottom = remaining * average_height); - - if (start < old_start) { - await tick(); - let expected_height = 0; - let actual_height = 0; - - for (let i = start; i < old_start; i += 1) { - if (rows[i - start]) { - expected_height += height_map[i]; - actual_height += itemHeight || rows[i - start].offsetHeight; - } - } - - const d = actual_height - expected_height; - viewport.scrollTo(0, scrollTop + d); - } - } - - onMount(() => { - rows = contents.getElementsByTagName("svelte-virtual-list-row"); - $$invalidate(13, mounted = true); - }); - - const writable_props = ["items", "height", "itemHeight", "hoverItemIndex", "start", "end"]; - - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console.warn(` was created with unknown prop '${key}'`); - }); - - function svelte_virtual_list_contents_binding($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - contents = $$value; - $$invalidate(4, contents); - }); - } - - function svelte_virtual_list_viewport_binding($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - viewport = $$value; - $$invalidate(3, viewport); - }); - } - - function svelte_virtual_list_viewport_elementresize_handler() { - viewport_height = this.offsetHeight; - $$invalidate(2, viewport_height); - } - - $$self.$$set = $$props => { - if ("items" in $$props) $$invalidate(11, items = $$props.items); - if ("height" in $$props) $$invalidate(0, height = $$props.height); - if ("itemHeight" in $$props) $$invalidate(12, itemHeight = $$props.itemHeight); - if ("hoverItemIndex" in $$props) $$invalidate(1, hoverItemIndex = $$props.hoverItemIndex); - if ("start" in $$props) $$invalidate(9, start = $$props.start); - if ("end" in $$props) $$invalidate(10, end = $$props.end); - if ("$$scope" in $$props) $$invalidate(14, $$scope = $$props.$$scope); - }; - - $$self.$capture_state = () => ({ - onMount, - tick, - items, - height, - itemHeight, - hoverItemIndex, - start, - end, - height_map, - rows, - viewport, - contents, - viewport_height, - visible, - mounted, - top, - bottom, - average_height, - refresh, - handle_scroll - }); - - $$self.$inject_state = $$props => { - if ("items" in $$props) $$invalidate(11, items = $$props.items); - if ("height" in $$props) $$invalidate(0, height = $$props.height); - if ("itemHeight" in $$props) $$invalidate(12, itemHeight = $$props.itemHeight); - if ("hoverItemIndex" in $$props) $$invalidate(1, hoverItemIndex = $$props.hoverItemIndex); - if ("start" in $$props) $$invalidate(9, start = $$props.start); - if ("end" in $$props) $$invalidate(10, end = $$props.end); - if ("height_map" in $$props) height_map = $$props.height_map; - if ("rows" in $$props) rows = $$props.rows; - if ("viewport" in $$props) $$invalidate(3, viewport = $$props.viewport); - if ("contents" in $$props) $$invalidate(4, contents = $$props.contents); - if ("viewport_height" in $$props) $$invalidate(2, viewport_height = $$props.viewport_height); - if ("visible" in $$props) $$invalidate(5, visible = $$props.visible); - if ("mounted" in $$props) $$invalidate(13, mounted = $$props.mounted); - if ("top" in $$props) $$invalidate(6, top = $$props.top); - if ("bottom" in $$props) $$invalidate(7, bottom = $$props.bottom); - if ("average_height" in $$props) average_height = $$props.average_height; - }; - - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*items, start, end*/ 3584) { - $$invalidate(5, visible = items.slice(start, end).map((data, i) => { - return { index: i + start, data }; - })); - } - - if ($$self.$$.dirty & /*mounted, items, viewport_height, itemHeight*/ 14340) { - if (mounted) refresh(items, viewport_height, itemHeight); - } - }; - - return [ - height, - hoverItemIndex, - viewport_height, - viewport, - contents, - visible, - top, - bottom, - handle_scroll, - start, - end, - items, - itemHeight, - mounted, - $$scope, - slots, - svelte_virtual_list_contents_binding, - svelte_virtual_list_viewport_binding, - svelte_virtual_list_viewport_elementresize_handler - ]; -} - -class VirtualList extends SvelteComponentDev { - constructor(options) { - super(options); - - init(this, options, instance, create_fragment, safe_not_equal, { - items: 11, - height: 0, - itemHeight: 12, - hoverItemIndex: 1, - start: 9, - end: 10 - }); - - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "VirtualList", - options, - id: create_fragment.name - }); - } - - get items() { - return this.$$.ctx[11]; - } - - set items(items) { - this.$set({ items }); - flush(); - } - - get height() { - return this.$$.ctx[0]; - } - - set height(height) { - this.$set({ height }); - flush(); - } - - get itemHeight() { - return this.$$.ctx[12]; - } - - set itemHeight(itemHeight) { - this.$set({ itemHeight }); - flush(); - } - - get hoverItemIndex() { - return this.$$.ctx[1]; - } - - set hoverItemIndex(hoverItemIndex) { - this.$set({ hoverItemIndex }); - flush(); - } - - get start() { - return this.$$.ctx[9]; - } - - set start(start) { - this.$set({ start }); - flush(); - } - - get end() { - return this.$$.ctx[10]; - } - - set end(end) { - this.$set({ end }); - flush(); - } -} - -var VirtualList$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - 'default': VirtualList -}); - -export default index; diff --git a/test/src/index.js b/test/src/index.js index ef7bd829..84d2041f 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -29,16 +29,24 @@ function handleSet(component, data) { } function focus(element, setFocus) { - return new Promise(fulfil => { + return new Promise(resolve => { element.addEventListener('focus', function handler() { element.removeEventListener('focus', handler); - fulfil(true); + resolve(true); }); if (setFocus) setFocus(); }); } +function selectReady(select) { + return new Promise(resolve => { + select.$on('ready', () => { + resolve(); + }); + }); +} + // setup const target = document.createElement('main'); document.body.appendChild(target); @@ -1228,7 +1236,7 @@ test('when isGroupHeaderSelectable clicking group header should select createGro }; } - await querySelectorClick('.selectContainer'); + await selectReady(select); const groupHeaderItem = select.list.items[0]; const groupItem = select.list.items.find((item) => { @@ -1262,7 +1270,7 @@ test('group headers label should be created by getGroupHeaderLabel(item)', async return `Group label is ${item.id}`; } - await querySelectorClick('.selectContainer'); + await selectReady(select); const groupHeaderItem = select.list.items[0]; @@ -1463,7 +1471,7 @@ test('when isMulti and selected items reach edge of container then Select height select.$destroy(); }); -test('when isMulti and value is populated then navigating with LeftArrow updates activevalue', async (t) => { +test('when isMulti and value is populated then navigating with LeftArrow updates activeValue', async (t) => { const select = new Select({ target, props: { @@ -1477,12 +1485,13 @@ test('when isMulti and value is populated then navigating with LeftArrow updates target.style.maxWidth = '100%'; window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - t.ok(select.$capture_state().activevalue === 1); + + t.ok(select.$capture_state().activeValue === 1); select.$destroy(); }); -test('when isMulti and value is populated then navigating with ArrowRight updates activevalue', async (t) => { +test('when isMulti and value is populated then navigating with ArrowRight updates activeValue', async (t) => { const select = new Select({ target, props: { @@ -1497,7 +1506,7 @@ test('when isMulti and value is populated then navigating with ArrowRight update window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowRight'})); - t.ok(select.$capture_state().activevalue === 1); + t.ok(select.$capture_state().activeValue === 1); select.$destroy(); }); From 65a2aa8cf6eef0fdd6c7f565734f17fcabe2e93f Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 30 Mar 2021 11:47:01 +1100 Subject: [PATCH 166/635] Tests tests tests --- .gitignore | 5 +- package.json | 2 +- src/Select.svelte | 113 +++++++++++++++++++++++++++++------------- test/runner.js | 2 +- test/src/index.js | 123 ++++++++++++++++++++++++++++------------------ 5 files changed, 158 insertions(+), 87 deletions(-) diff --git a/.gitignore b/.gitignore index f0ee4766..6348f67b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,7 @@ node_modules .nova /dist/ /test/public/index.js -/test/public/bundle.css \ No newline at end of file +/test/public/bundle.css +/examples/webpack/public/*.js +/examples/webpack/public/*.css +/examples/webpack/public/build/ \ No newline at end of file diff --git a/package.json b/package.json index b65e054f..1f92f397 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.0.0-beta.4", + "version": "4.0.0-beta.5", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 194b805e400599d173061d13e0409a38ee0e4695 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 6 Apr 2021 09:58:19 +1000 Subject: [PATCH 168/635] format fix for customitem test --- test/src/CustomItem.svelte | 131 +++++++++++++++++++------------------ test/src/index.js | 1 + 2 files changed, 69 insertions(+), 63 deletions(-) diff --git a/test/src/CustomItem.svelte b/test/src/CustomItem.svelte index 6769f623..14a32b69 100644 --- a/test/src/CustomItem.svelte +++ b/test/src/CustomItem.svelte @@ -1,78 +1,83 @@ -
- {item.name} -
-
{item.name}
-
{item.tagline}
-
-
- + +
+ {item.name} +
+
{item.name}
+
{item.tagline}
+
+
diff --git a/test/src/index.js b/test/src/index.js index bc5413f4..4cd1589e 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1630,6 +1630,7 @@ test('when loadOptions method is supplied and filterText has length then items s } }); + await wait(0); select.$set({filterText: 'Juniper'}); await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); From c1bc96246fd67318a093d90f59f5272f7f6e88d3 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 6 Apr 2021 09:58:43 +1000 Subject: [PATCH 169/635] #206 added itemHoverBG --- src/Item.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Item.svelte b/src/Item.svelte index d3676b84..d04668ae 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -64,6 +64,7 @@ .item.hover:not(.active) { background: var(--itemHoverBG, #e7f2ff); + color: var(--itemHoverBG, inherit); } From 6cf25bab6a05b0d46331658db65a3173cd7f1e76 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 6 Apr 2021 10:32:52 +1000 Subject: [PATCH 170/635] #219 input readOnly and listBorder --- docs/theming_variables.md | 2 ++ src/List.svelte | 1 + src/Select.svelte | 40 +++++++++++++++------------------------ test/src/index.js | 14 ++++++++++++++ 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 09653d91..79f4ea0e 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -40,6 +40,7 @@ You can override the following variables to style a Select component. - `--inputFontSize` - `--inputLeft` - `--inputLetterSpacing` +- `--inputMargin` - `--inputPadding` - `--itemActiveBackground` - `--itemColor` @@ -49,6 +50,7 @@ You can override the following variables to style a Select component. - `--itemIsActiveColor` - `--itemPadding` - `--listBackground` +- `--listBorder` - `--listBorderRadius` - `--listEmptyColor` - `--listEmptyPadding` diff --git a/src/List.svelte b/src/List.svelte index 9c2d5e63..a77e3684 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -209,6 +209,7 @@ max-height: var(--listMaxHeight, 250px); overflow-y: auto; background: var(--listBackground, #fff); + border: var(--listBorder, none); } .virtualList { diff --git a/src/Select.svelte b/src/Select.svelte index 8ff96fab..c4c411dc 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -254,7 +254,7 @@ if (loadOptions) { getItems(); - } else { + } else { loadList(); listOpen = true; @@ -506,7 +506,7 @@ async function setList(items) { if (!listOpen) return; - + if (loadOptions && getItemsHasInvoked && items.length > 0) { list.$destroy(); list = null; @@ -672,8 +672,8 @@ } if (target && list) { - return - }; + return; + } if (isVirtualList && !VirtualList) { VirtualList = await importInternalComponent('VirtualList'); @@ -706,7 +706,7 @@ 'z-index': 2, visibility: 'hidden', }); - + if (list) list.$destroy(); list = list; target = target; @@ -974,26 +974,16 @@ /> {/if} - {#if isDisabled} - - {:else} - - {/if} + {#if !isMulti && showSelectedItem}
diff --git a/test/src/index.js b/test/src/index.js index 4cd1589e..184c5bda 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -3116,6 +3116,20 @@ test('when switching between isMulti true/false ensure Select continues working' select.$destroy(); }); +test('when isSearchable is false then input should be readonly', async (t) => { + const select = new Select({ + target, + props: { + items, + isSearchable: false + } + }); + + let elem = target.querySelector('.selectContainer input'); + t.ok(elem.hasAttribute('readonly')); + + select.$destroy(); +}); // this allows us to close puppeteer once tests have completed From 429ec6809686549df6c32b68ba8bdc9e9835e20e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 6 Apr 2021 10:44:36 +1000 Subject: [PATCH 171/635] #225 escape key closes list --- src/List.svelte | 4 ++++ test/src/index.js | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/List.svelte b/src/List.svelte index a77e3684..33ced7d0 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -125,6 +125,10 @@ function handleKeyDown(e) { switch (e.key) { + case 'Escape': + e.preventDefault(); + closeList(); + break; case 'ArrowDown': e.preventDefault(); items.length && updateHoverItem(1); diff --git a/test/src/index.js b/test/src/index.js index 184c5bda..6cf01443 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -3132,6 +3132,25 @@ test('when isSearchable is false then input should be readonly', async (t) => { }); +test('when esc key pressed should close list', async (t) => { + const select = new Select({ + target, + props: { + items, + listOpen: true + } + }); + + await wait(0); + t.ok(select.listOpen === true); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Escape'})); + t.ok(select.listOpen === false); + + select.$destroy(); +}); + + + // this allows us to close puppeteer once tests have completed window.done = done; export default {}; From d8227aa880212d05c686b5450d2a34bf4a8b379e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 6 Apr 2021 11:12:01 +1000 Subject: [PATCH 172/635] #228 placeholderAlwaysShow --- README.md | 1 + src/Select.svelte | 3 ++- test/src/index.js | 24 +++++++++++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ad9a0db3..77d821b2 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ yarn add svelte-select - `ClearIcon` Default: `ClearIcon`. ClearIcon component. - `isVirtualList: Boolean` Default: `false`. Uses [svelte-virtual-list](https://github.com/sveltejs/svelte-virtual-list) to render list (experimental). - `filteredItems: Array` Default: `[]`. List of items that are filtered by `filterText` +- `placeholderAlwaysShow: Boolean` Default: `false`. When `isMulti` then placeholder text will always still show. ### Exposed methods If you really want to get your hands dirty these internal functions are exposed as props to override if needed. See the adv demo or look through the test file (test/src/index.js) for examples. diff --git a/src/Select.svelte b/src/Select.svelte index c4c411dc..f7fa5c71 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -29,6 +29,7 @@ export let value = undefined; export let filterText = ''; export let placeholder = 'Select...'; + export let placeholderAlwaysShow = false; export let items = []; export let itemFilter = (label, filterText, option) => label.toLowerCase().includes(filterText.toLowerCase()); @@ -439,7 +440,7 @@ } $: showSelectedItem = value && filterText.length === 0; - $: placeholderText = value ? '' : placeholder; + $: placeholderText = placeholderAlwaysShow && isMulti ? placeholder : (value ? '' : placeholder); async function setupList() { List = await importInternalComponent('List'); diff --git a/test/src/index.js b/test/src/index.js index 6cf01443..1723cfb5 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -3100,9 +3100,6 @@ test('when switching between isMulti true/false ensure Select continues working' select.isMulti = true; select.loadOptions = itemsPromise; - - // console.log('select :>> ', select.value); - // console.log('select :>> ', select.items); t.ok(JSON.stringify(select.value) === JSON.stringify([{value: 'chips', label: 'Chips'}])); t.ok(Array.isArray(select.value)); @@ -3150,6 +3147,27 @@ test('when esc key pressed should close list', async (t) => { }); +test('when isMulti and placeholderAlwaysShow then always show placeholder text', async (t) => { + const select = new Select({ + target, + props: { + items, + value: [{value: 'chocolate', label: 'Chocolate'}, + {value: 'pizza', label: 'Pizza'},], + isMulti: true, + placeholderAlwaysShow: true, + placeholder: 'foo bar' + } + }); + + await wait(0); + let elem = target.querySelector('.selectContainer input'); + t.ok(elem.placeholder === 'foo bar'); + + select.$destroy(); +}); + + // this allows us to close puppeteer once tests have completed window.done = done; From cf06aafc790b3b42ecc7ab535bb00f5b2bbb407e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 15 Apr 2021 13:50:02 +1000 Subject: [PATCH 173/635] moving Llist into svelte:component, test fixes, clean up --- src/List.svelte | 66 ++++++---- src/Select.svelte | 323 +++++++++++++++++----------------------------- test/src/index.js | 38 +++--- 3 files changed, 177 insertions(+), 250 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index 33ced7d0..5efa9b99 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -1,5 +1,6 @@ - + {#if isVirtualList} -
+
+ >
@@ -276,7 +302,7 @@ {/if} {#if !isVirtualList} -
+
{#each items as item, i} {#if item.isGroupHeader && !item.isSelectable}
{getGroupHeaderLabel(item)}
@@ -292,11 +318,7 @@ {filterText} {getOptionLabel} isFirst={isItemFirst(i)} - isActive={isItemActive( - item, - value, - optionIdentifier - )} + isActive={isItemActive(item, value, optionIdentifier)} isHover={isItemHover(hoverItemIndex, item, i, items)} />
diff --git a/src/Select.svelte b/src/Select.svelte index f7fa5c71..0b5c3549 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -7,20 +7,18 @@ tick, } from 'svelte'; - import ItemComponent from './Item.svelte'; - import SelectionComponent from './Selection.svelte'; - import MultiSelectionComponent from './MultiSelection.svelte'; - - import isOutOfViewport from './utils/isOutOfViewport'; + import _List from './List.svelte'; + import _Item from './Item.svelte'; + import _Selection from './Selection.svelte'; + import _MultiSelection from './MultiSelection.svelte'; + import _VirtualList from './VirtualList.svelte'; import debounce from './utils/debounce'; import DefaultClearIcon from './ClearIcon.svelte'; const dispatch = createEventDispatcher(); + export let container = undefined; export let input = undefined; - export let Item = ItemComponent; - export let Selection = SelectionComponent; - export let MultiSelection = MultiSelectionComponent; export let isMulti = false; export let multiFullItemClearable = false; export let isDisabled = false; @@ -86,6 +84,11 @@ export let containerClasses = ''; export let indicatorSvg = undefined; export let ClearIcon = DefaultClearIcon; + export let Item = _Item; + export let List = _List; + export let Selection = _Selection; + export let MultiSelection = _MultiSelection; + export let VirtualList = _VirtualList; let target; let activeValue; @@ -167,7 +170,8 @@ } function resetFilteredItems() { - filteredItems = JSON.parse(originalItemsClone); + if (originalItemsClone) filteredItems = JSON.parse(originalItemsClone); + if (groupBy) filterItems(); } function filterItem(item) { @@ -191,13 +195,15 @@ ? [] : items : items.filter((item) => filterItem(item)); + + if (groupBy) filterGroupedItems(); } function filterGroupedItems() { const groupValues = []; const groups = {}; - items.forEach((item) => { + filteredItems.forEach((item) => { const groupValue = groupBy(item); if (!groupValues.includes(groupValue)) { @@ -248,32 +254,6 @@ } } - function setupFilterText() { - if (filterText.length > 0) { - isFocused = true; - listOpen = true; - - if (loadOptions) { - getItems(); - } else { - loadList(); - listOpen = true; - - if (isMulti) { - activeValue = undefined; - } - } - } else { - setList([]); - } - - if (list) { - list.$set({ - filterText, - }); - } - } - function setupFocus() { if (isFocused || listOpen) { handleFocus(); @@ -297,25 +277,6 @@ if (value) value = null; } - export let VirtualList = null; - export let List = null; - - async function importInternalComponent(componentName) { - let file; - - switch (componentName) { - case 'VirtualList': - file = await import(`./VirtualList.svelte`); - break; - - case 'List': - file = await import(`./List.svelte`); - break; - } - - return file.default; - } - $: { if (value) setValue(); } @@ -337,12 +298,12 @@ resetFilteredItems(); } - if (!groupBy && filterText && filterText.length > 0) { + if (filterText && filterText.length > 0) { filterItems(); } if (groupBy) { - filterGroupedItems(); + filterItems(); } } @@ -368,14 +329,6 @@ } } - $: { - if (listOpen) { - loadList(); - } else { - removeList(); - } - } - $: { if (isFocused !== prev_isFocused) { setupFocus(); @@ -388,6 +341,25 @@ } } + function setupFilterText() { + if (filterText.length > 0) { + isFocused = true; + listOpen = true; + + if (loadOptions) { + getItems(); + } else { + listOpen = true; + + if (isMulti) { + activeValue = undefined; + } + } + } else { + resetFilteredItems(); + } + } + function setupFilteredItem() { let _filteredItems = [...filteredItems]; @@ -430,7 +402,7 @@ filterItems(); } - setList(_filteredItems); + filteredItems = _filteredItems; } $: { @@ -440,11 +412,12 @@ } $: showSelectedItem = value && filterText.length === 0; - $: placeholderText = placeholderAlwaysShow && isMulti ? placeholder : (value ? '' : placeholder); - - async function setupList() { - List = await importInternalComponent('List'); - } + $: placeholderText = + placeholderAlwaysShow && isMulti + ? placeholder + : value + ? '' + : placeholder; beforeUpdate(async () => { prev_value = value; @@ -505,19 +478,6 @@ } } - async function setList(items) { - if (!listOpen) return; - - if (loadOptions && getItemsHasInvoked && items.length > 0) { - list.$destroy(); - list = null; - return loadList(); - } - - if (!list) await loadList(); - list.$set({ items }); - } - function handleMultiItemClear(event) { const { detail } = event; const itemToRemove = value[detail ? detail.i : value.length - 1]; @@ -533,33 +493,6 @@ filterItems(); dispatch('clear', itemToRemove); - - getPosition(); - } - - async function getPosition() { - await tick(); - if (!target || !container) return; - const { top, height, width } = container.getBoundingClientRect(); - - target.style['min-width'] = `${width}px`; - target.style.width = `${listAutoWidth ? 'auto' : '100%'}`; - target.style.left = '0'; - - if (listPlacement === 'top') { - target.style.bottom = `${height + 5}px`; - } else { - target.style.top = `${height + 5}px`; - } - - target = target; - - if (listPlacement === 'auto' && isOutOfViewport(target).bottom) { - target.style.top = ``; - target.style.bottom = `${height + 5}px`; - } - - target.style.visibility = ''; } function handleKeyDown(e) { @@ -667,115 +600,80 @@ handleFocus(); } - async function loadList() { - if (!List && listOpen) { - await setupList(); - } - - if (target && list) { - return; - } - - if (isVirtualList && !VirtualList) { - VirtualList = await importInternalComponent('VirtualList'); - } - - const data = { - Item, - filterText, - optionIdentifier, - noOptionsMessage, - hideEmptyState, - isVirtualList, - VirtualList, - value, - isMulti, - getGroupHeaderLabel, - items: filteredItems, - itemHeight, - }; - - if (getOptionLabel) { - data.getOptionLabel = getOptionLabel; - } - - if (target) target.remove(); - target = document.createElement('div'); - - Object.assign(target.style, { - position: 'absolute', - 'z-index': 2, - visibility: 'hidden', - }); - - if (list) list.$destroy(); - list = list; - target = target; - if (container) container.appendChild(target); + onMount(() => { + originalItemsClone = JSON.stringify(items ? items : []); - list = new List({ - target, - props: data, - }); + if (isFocused && input) input.focus(); + if (!groupBy) filterItems(); + }); - list.$on('itemSelected', (event) => { - const { detail } = event; + onDestroy(() => { + removeList(); + }); - if (detail) { - const item = Object.assign({}, detail); + $: listProps = { + Item, + filterText, + optionIdentifier, + noOptionsMessage, + hideEmptyState, + isVirtualList, + VirtualList, + value, + isMulti, + getGroupHeaderLabel, + items: filteredItems, + itemHeight, + getOptionLabel, + listPlacement, + parent: container, + listAutoWidth, + }; - if (!item.isGroupHeader || item.isSelectable) { - if (isMulti) { - value = value ? value.concat([item]) : [item]; - filterItems(); - } else { - value = item; - } + function itemSelected(event) { + const { detail } = event; - resetFilter(); - value = value; + if (detail) { + const item = Object.assign({}, detail); - setTimeout(() => { - listOpen = false; - activeValue = undefined; - }); + if (!item.isGroupHeader || item.isSelectable) { + if (isMulti) { + value = value ? value.concat([item]) : [item]; + filterItems(); + } else { + value = item; } - } - }); - - list.$on('itemCreated', (event) => { - const { detail } = event; - if (isMulti) { - value = value || []; - value = [...value, createItem(detail)]; - } else { - value = createItem(detail); - } - dispatch('itemCreated', detail); - filterText = ''; - listOpen = false; - activeValue = undefined; - resetFilter(); - }); - - list.$on('closeList', () => { - listOpen = false; - }); + resetFilter(); + value = value; - getPosition(); + setTimeout(() => { + listOpen = false; + activeValue = undefined; + }); + } + } } - onMount(() => { - originalItemsClone = JSON.stringify(items ? items : []); + function itemCreated(event) { + const { detail } = event; + if (isMulti) { + value = value || []; + value = [...value, createItem(detail)]; + } else { + value = createItem(detail); + } - if (isFocused && input) input.focus(); - if (!groupBy) filterItems(); - }); + dispatch('itemCreated', detail); + filterText = ''; + listOpen = false; + activeValue = undefined; + resetFilter(); + } - onDestroy(() => { - removeList(); - }); + function closeList() { + listOpen = false; + } - +
Date: Sat, 24 Apr 2021 11:32:08 +1000 Subject: [PATCH 175/635] theme docs --- docs/theming_variables.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 79f4ea0e..d5822f35 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -56,7 +56,9 @@ You can override the following variables to style a Select component. - `--listEmptyPadding` - `--listEmptyTextAlign` - `--listMaxHeight` +- `--listPosition` - `--listShadow` +- `--listZIndex` - `--margin` - `--multiClearBG` - `--multiClearFill` From 9391d8d1c61478d71ed3420ce5add79d43e615fd Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sat, 24 Apr 2021 12:10:26 +1000 Subject: [PATCH 176/635] more clean up --- src/List.svelte | 1 - src/Select.svelte | 45 ++------------------------------------------- test/src/index.js | 3 ++- 3 files changed, 4 insertions(+), 45 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index 5efa9b99..ae25ab95 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -152,7 +152,6 @@ closeList(); break; } - if (hoverItem.isCreator) { dispatch('itemCreated', filterText); } else { diff --git a/src/Select.svelte b/src/Select.svelte index da02af37..4c01a371 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -2,9 +2,7 @@ import { beforeUpdate, createEventDispatcher, - onDestroy, onMount, - tick, } from 'svelte'; import _List from './List.svelte'; @@ -68,7 +66,6 @@ export let isWaiting = false; export let listPlacement = 'auto'; export let listOpen = false; - export let list = undefined; export let isVirtualList = false; export let loadOptionsInterval = 300; export let noOptionsMessage = 'No options'; @@ -98,7 +95,6 @@ ); } - let target; let activeValue; let originalItemsClone; let prev_value; @@ -107,11 +103,6 @@ let prev_filteredItems; let prev_isMulti; - async function resetFilter() { - await tick(); - filterText = ''; - } - const getItems = debounce(async () => { isWaiting = true; let res = await loadOptions(filterText).catch((err) => { @@ -146,6 +137,8 @@ typeof item === 'string' ? { value: item, label: item } : item ); } + + filterText = ''; } let _inputAttributes; @@ -263,7 +256,6 @@ if (isFocused || listOpen) { handleFocus(); } else { - resetFilter(); if (input) input.blur(); } } @@ -286,10 +278,6 @@ if (value) setValue(); } - $: { - if (noOptionsMessage && list) list.$set({ noOptionsMessage }); - } - $: { if (inputAttributes || !isSearchable) assignInputAttributes(); } @@ -533,9 +521,7 @@ } break; case 'ArrowLeft': - if (list) list.$set({ hoverItemIndex: -1 }); if (!isMulti || filterText.length > 0) return; - if (activeValue === undefined) { activeValue = value.length - 1; } else if (value.length > activeValue && activeValue !== 0) { @@ -543,7 +529,6 @@ } break; case 'ArrowRight': - if (list) list.$set({ hoverItemIndex: -1 }); if ( !isMulti || filterText.length > 0 || @@ -564,22 +549,6 @@ if (input) input.focus(); } - function removeList() { - resetFilter(); - activeValue = undefined; - - if (!list) return; - list.$destroy(); - list = undefined; - - if (!target) return; - if (target.parentNode) target.parentNode.removeChild(target); - target = undefined; - - list = list; - target = target; - } - function handleWindowClick(event) { if (!container) return; const eventTarget = @@ -612,10 +581,6 @@ if (!groupBy) filterItems(); }); - onDestroy(() => { - removeList(); - }); - $: listProps = { Item, filterText, @@ -649,7 +614,6 @@ value = item; } - resetFilter(); value = value; setTimeout(() => { @@ -673,16 +637,11 @@ filterText = ''; listOpen = false; activeValue = undefined; - resetFilter(); } function closeList() { listOpen = false; } - - $: { - if (value) selectedValue = value; - } From a1ba3a74433b6aa3acfbaa02c75a10f9499954a9 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 11 May 2021 14:27:01 +1000 Subject: [PATCH 185/635] beta bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7fd32e3c..9a868a8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.0.0-beta.10", + "version": "4.0.0-beta.11", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 824a0d86a44176bc750a712ce497775223df901e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Gonz=C3=A1lez?= Date: Fri, 4 Jun 2021 11:05:37 +0200 Subject: [PATCH 188/635] Add labelIdentifier option --- README.md | 1 + index.d.ts | 1 + src/List.svelte | 5 +++-- src/Select.svelte | 5 +++-- test/src/index.js | 16 ++++++++++++++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 36d68feb..eaade45e 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ yarn add svelte-select - `placeholder: String` Default: `'Select...'`. Placeholder text. - `noOptionsMessage: String` Default: `'No options'`. Message to display in list when there are no `items`. - `optionIdentifier: String` Default: `'value'`. Override default identifier. +- `labelIdentifier: String` Default: `'label'`. Override default identifier. - `listOpen: Boolean` Default: `false`. Open/close list. - `hideEmptyState: Boolean` Default: `false`. Hide list and don't show `noOptionsMessage` when there are no `items`. - `containerClasses: String` Default: `''`. Add extra container classes, for example 'global-x local-y'. diff --git a/index.d.ts b/index.d.ts index a393cde0..94f1a481 100644 --- a/index.d.ts +++ b/index.d.ts @@ -21,6 +21,7 @@ export interface SelectProps { getGroupHeaderLabel?: (option: any) => string; getOptionLabel?: (option: any, filterText: string) => string; optionIdentifier?: string; + labelIdentifier?: string; loadOptions?: (filterText: string) => Promise; hasError?: boolean; containerStyles?: string; diff --git a/src/List.svelte b/src/List.svelte index 3db8a646..fe9cc8b0 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -11,10 +11,11 @@ export let Item = ItemComponent; export let isVirtualList = false; export let items = []; + export let labelIdentifier = 'label'; export let getOptionLabel = (option, filterText) => { - if (option) return option.isCreator ? `Create \"${filterText}\"` : option.label; + if (option) return option.isCreator ? `Create \"${filterText}\"` : option[labelIdentifier]; }; - export let getGroupHeaderLabel = (option) => { return option.label }; + export let getGroupHeaderLabel = (option) => { return option[labelIdentifier] }; export let itemHeight = 40; export let hoverItemIndex = 0; export let selectedValue = undefined; diff --git a/src/Select.svelte b/src/Select.svelte index ee4c406a..6b64c01f 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -37,15 +37,16 @@ export let getGroupHeaderLabel = option => { return option.label; }; + export let labelIdentifier = 'label'; export let getOptionLabel = (option, filterText) => { - return option.isCreator ? `Create \"${filterText}\"` : option.label; + return option.isCreator ? `Create \"${filterText}\"` : option[labelIdentifier]; }; export let optionIdentifier = "value"; export let loadOptions = undefined; export let hasError = false; export let containerStyles = ""; export let getSelectionLabel = option => { - if (option) return option.label; + if (option) return option[labelIdentifier]; }; export let createGroupHeaderItem = groupValue => { diff --git a/test/src/index.js b/test/src/index.js index 9a78238d..e01ce8ab 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1532,6 +1532,22 @@ test('when isMulti is true show each item in selectedValue if simple arrays are select.$destroy(); }); +test('when labelIdentifier is set you can pass a string and see the right label', async (t) => { + const select = new Select({ + target, + props: { + items: [{id: 0, name: 'ONE'}, {id: 1, name: 'TWO'}], + selectedValue: {id: 0, name: 'ONE'}, + optionIdentifier: 'id', + labelIdentifier: 'name', + } + }); + + t.ok(document.querySelector('.selection').innerHTML === 'ONE'); + + select.$destroy(); +}); + test('when getValue method is set should use that key to update selectedValue', async (t) => { const select = new Select({ target, From fc03b9f096ba3ba98034ebdaa677697ffc3ee0d4 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 29 Jun 2021 07:53:10 +1000 Subject: [PATCH 189/635] import clean up --- src/Select.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index 5a69877f..5c4c349b 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -6,8 +6,8 @@ import _Selection from './Selection.svelte'; import _MultiSelection from './MultiSelection.svelte'; import _VirtualList from './VirtualList.svelte'; + import _ClearIcon from './ClearIcon.svelte'; import debounce from './utils/debounce'; - import DefaultClearIcon from './ClearIcon.svelte'; const dispatch = createEventDispatcher(); @@ -75,7 +75,7 @@ export let showIndicator = false; export let containerClasses = ''; export let indicatorSvg = undefined; - export let ClearIcon = DefaultClearIcon; + export let ClearIcon = _ClearIcon; export let Item = _Item; export let List = _List; export let Selection = _Selection; From af383953a22580ca2660f0d2d09c5f4d53fe76ae Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 29 Jun 2021 08:24:43 +1000 Subject: [PATCH 190/635] format clean up --- src/Select.svelte | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index 5c4c349b..4b44d344 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -410,7 +410,8 @@ } $: showSelectedItem = value && filterText.length === 0; - $: showClearIcon = showSelectedItem && isClearable && !isDisabled && !isWaiting; + $: showClearIcon = + showSelectedItem && isClearable && !isDisabled && !isWaiting; $: placeholderText = placeholderAlwaysShow && isMulti ? placeholder @@ -860,13 +861,13 @@
{/if} - {#if showClearIcon } + {#if showClearIcon}
{/if} - {#if !showClearIcon && (showIndicator || (showChevron && !value) || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem))) } + {#if !showClearIcon && (showIndicator || (showChevron && !value) || (!isSearchable && !isDisabled && !isWaiting && ((showSelectedItem && !isClearable) || !showSelectedItem)))}
{#if indicatorSvg} {@html indicatorSvg} From c0a52eaa8c9255fcc6dacced62079d3bee04d03e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 29 Jun 2021 08:26:40 +1000 Subject: [PATCH 191/635] #250 #264 adding tests for clicking outside of component --- test/src/index.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/src/index.js b/test/src/index.js index d19955a9..6cb8a67d 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -3059,6 +3059,42 @@ test('when ClearItem replace clear icon', async (t) => { select.$destroy(); }); +test('clicking outside the Select should close and blur it', async (t) => { + const select = new Select({ + target, + props: { + items, + } + }); + + await querySelectorClick('.selectContainer'); + t.ok(select.listOpen); + await querySelectorClick('#extra'); + t.ok(!select.listOpen); + + select.$destroy(); +}); + +test('clicking on an external textarea should close and blur it', async (t) => { + const textarea = document.createElement('textarea'); + document.body.appendChild(textarea); + const select = new Select({ + target, + props: { + items, + } + }); + + await querySelectorClick('.selectContainer'); + t.ok(select.listOpen); + await querySelectorClick('textarea'); + t.ok(!select.listOpen); + + textarea.remove(); + select.$destroy(); +}); + + test('when switching between isMulti true/false ensure Select continues working', async (t) => { const select = new Select({ From d476ddca6e1c91baf85a63007315c2ab07af447a Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 29 Jun 2021 08:32:18 +1000 Subject: [PATCH 192/635] beta 13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8b2916f5..febda16b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.0.0-beta.12", + "version": "4.0.0-beta.13", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From e448f6e2d4d3d726d6129439c00aa967a0e6e21a Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 29 Jun 2021 09:04:11 +1000 Subject: [PATCH 196/635] readme fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e804dbf5..3d5bc2f9 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,7 @@ You can also use the `inputStyles` prop to write in any override styles needed f | Event Name | Callback | Description | |------|------|----------| | select | { detail } | fires when value changes -| clear | { null || item } | fires when clear all is invoked or item is removed (by user) from multi select +| clear | { detail } | fires when clear all is invoked or item is removed (by user) from multi select | loaded | { items } | fires when `loadOptions` resolves | error | { type, details } | fires when error is caught From b79e9947133433846b5f0c0fbe0b9b83e999fc02 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 29 Jun 2021 09:27:47 +1000 Subject: [PATCH 197/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e27a479..eeb9fabc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 4.1.0 + +* Add labelIdentifier prop - thanks to @martgnz + ## 4.0.0 * selectedValue deprecated please use value going forward From b978cc07dddcdf1de7a88b897f0646b43aee0a9b Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 29 Jun 2021 09:27:58 +1000 Subject: [PATCH 198/635] 4.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42d03c07..1071cac3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.0.0", + "version": "4.1.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 508582d5d09f5093853d06e516cc7d202bf97523 Mon Sep 17 00:00:00 2001 From: David Fournier Date: Sun, 4 Jul 2021 12:52:38 +0200 Subject: [PATCH 204/635] Remove focus when an external field is focused programmatically --- src/Select.svelte | 4 ++-- test/src/index.js | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index c4ee1bd4..64d8255f 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -559,7 +559,7 @@ if (input) input.focus(); } - function handleWindowClick(event) { + function handleWindowEvent(event) { if (!container) return; const eventTarget = event.path && event.path.length > 0 ? event.path[0] : event.target; @@ -819,7 +819,7 @@ } - +
{ target.style.width = ''; }); +test('focusing in an external textarea should close and blur it', async (t) => { + const textarea = document.createElement('textarea'); + document.body.appendChild(textarea); + const select = new Select({ + target, + props: { + items, + } + }); + + await querySelectorClick('.selectContainer'); + t.ok(select.listOpen); + textarea.focus(); + await wait(0); + t.ok(!select.listOpen); + + textarea.remove(); + select.$destroy(); +}); test('clicking between Selects should close and blur other Select', async (t) => { const select = new Select({ From a6704f37f8ef3f906359a4d649870d5b2df17618 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 5 Jul 2021 08:20:12 +1000 Subject: [PATCH 205/635] readme handleClear --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3ff00016..abfdf760 100644 --- a/README.md +++ b/README.md @@ -200,7 +200,7 @@ You can also use the `inputStyles` prop to write in any override styles needed f // event.detail will contain the selected value ... } - function onClear(event) { + function handleClear(event) { // event.detail will be null unless isMulti is true and user has removed a single item ... } From 2c9f5f664d12f3bc207b7ccb378d300c3d1b7d9d Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 6 Jul 2021 07:51:13 +1000 Subject: [PATCH 206/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ba1e96e..126f534d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 4.2.1 + +* Bug fix to remove focus when an external field is focused programmatically - thanks to @davidfou + ## 4.2.0 * Added listOffset prop From 4996506afd9e7f249b89c033a66399251a02f762 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 6 Jul 2021 07:51:17 +1000 Subject: [PATCH 207/635] 4.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 45f9fa32..315a875d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.0", + "version": "4.2.1", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 919bd9dd52d924677ba95157cd8fabc255b93d4b Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 7 Jul 2021 16:59:17 +1000 Subject: [PATCH 211/635] #274 filtering updates --- src/List.svelte | 1 + src/Select.svelte | 242 ++++++++++++++++++---------------------------- test/src/index.js | 78 ++++++++++----- 3 files changed, 151 insertions(+), 170 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index 9291a1ce..80c62c0d 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -63,6 +63,7 @@ }); beforeUpdate(() => { + if (!items) items = []; if (items !== prev_items && items.length > 0) { hoverItemIndex = 0; } diff --git a/src/Select.svelte b/src/Select.svelte index c1e5a301..93ce34c0 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -11,6 +11,10 @@ const dispatch = createEventDispatcher(); + export const getFilteredItems = () => { + return filteredItems; + }; + export let container = undefined; export let input = undefined; export let isMulti = false; @@ -22,9 +26,9 @@ export let filterText = ''; export let placeholder = 'Select...'; export let placeholderAlwaysShow = false; - export let items = []; + export let items = null; export let itemFilter = (label, filterText, option) => - label.toLowerCase().includes(filterText.toLowerCase()); + `${label}`.toLowerCase().includes(filterText.toLowerCase()); export let groupBy = undefined; export let groupFilter = (groups) => groups; export let isGroupHeaderSelectable = false; @@ -33,7 +37,9 @@ }; export let labelIdentifier = 'label'; export let getOptionLabel = (option, filterText) => { - return option.isCreator ? `Create \"${filterText}\"` : option[labelIdentifier]; + return option.isCreator + ? `Create \"${filterText}\"` + : option[labelIdentifier]; }; export let optionIdentifier = 'value'; export let loadOptions = undefined; @@ -85,34 +91,78 @@ export let MultiSelection = _MultiSelection; export let VirtualList = _VirtualList; - export let selectedValue = null; - $: { - if (selectedValue) - console.warn( - 'selectedValue is no longer used. Please use value instead.' + function filterMethod(args) { + if (args.loadOptions && args.filterText.length > 0) return; + if (!args.items) return []; + + if ( + args.items && + args.items.length > 0 && + typeof args.items[0] !== 'object' + ) { + args.items = convertStringItemsToObjects(args.items); + } + + let filterResults = args.items.filter((item) => { + let matchesFilter = itemFilter( + getOptionLabel(item, args.filterText), + args.filterText, + item ); - } - function originalItemsClone(newItems) { - let _items = JSON.parse(JSON.stringify(newItems || [])); + if ( + matchesFilter && + args.isMulti && + args.value && + Array.isArray(args.value) + ) { + matchesFilter = !args.value.some((x) => { + return ( + x[args.optionIdentifier] === item[args.optionIdentifier] + ); + }); + } + + return matchesFilter; + }); - if (_items && _items.length > 0 && typeof _items[0] !== 'object') { - _items = convertStringItemsToObjects(); + if (args.groupBy) { + filterResults = filterGroupedItems(filterResults); } - return _items; - }; + if (args.isCreatable && filterResults.length === 0) { + const itemToCreate = createItem(args.filterText); + itemToCreate.isCreator = true; + + filterResults = [...filterResults, itemToCreate]; + } + return filterResults; + } + + $: filteredItems = filterMethod({ + loadOptions, + filterText, + items, + value, + isMulti, + optionIdentifier, + groupBy, + isCreatable, + }); + + export let selectedValue = null; $: { - items = originalItemsClone(items); + if (selectedValue) + console.warn( + 'selectedValue is no longer used. Please use value instead.' + ); } - let unfilteredItems; let activeValue; let prev_value; let prev_filterText; let prev_isFocused; - let prev_items; let prev_isMulti; const getItems = debounce(async () => { @@ -124,10 +174,13 @@ if (res && !res.cancelled) { if (res) { - items = [...res]; - dispatch('loaded', { items }); + if (res && res.length > 0 && typeof res[0] !== 'object') { + res = convertStringItemsToObjects(res); + } + filteredItems = [...res]; + dispatch('loaded', { items: filteredItems }); } else { - items = []; + filteredItems = []; } isWaiting = false; @@ -171,50 +224,21 @@ } } - function convertStringItemsToObjects() { - return items.map((item, index) => { + function convertStringItemsToObjects(_items) { + return _items.map((item, index) => { return { index, value: item, - label: item, + label: `${item}`, }; }); } - function resetFilteredItems() { - if (loadOptions) return; - if (unfilteredItems) items = originalItemsClone(unfilteredItems); - unfilteredItems = null; - - if (groupBy) filterItems(); - } - - function filterItem(item) { - let keepItem = true; - - if (isMulti && value) { - keepItem = !value.some((x) => { - return x[optionIdentifier] === item[optionIdentifier]; - }); - } - - if (!keepItem) return false; - if (filterText.length < 1) return true; - return itemFilter(getOptionLabel(item, filterText), filterText, item); - } - - function filterItems() { - if (loadOptions) return; - if (!unfilteredItems) unfilteredItems = originalItemsClone(items); - items = unfilteredItems.filter((item) => filterItem(item)); - if (groupBy) filterGroupedItems(); - } - - function filterGroupedItems() { + function filterGroupedItems(_items) { const groupValues = []; const groups = {}; - items.forEach((item) => { + _items.forEach((item) => { const groupValue = groupBy(item); if (!groupValues.includes(groupValue)) { @@ -243,7 +267,7 @@ sortedGroupedItems.push(...groups[groupValue]); }); - items = sortedGroupedItems; + return sortedGroupedItems; } function dispatchSelectedItem() { @@ -295,25 +319,6 @@ if (inputAttributes || !isSearchable) assignInputAttributes(); } - $: { - if ( - loadOptions && - filterText.length === 0 && - unfilteredItems && - unfilteredItems.length > 0 - ) { - resetFilteredItems(); - } - - if (filterText && filterText.length > 0) { - filterItems(); - } - - if (groupBy) { - filterItems(); - } - } - $: { if (isMulti) { setupMulti(); @@ -349,74 +354,19 @@ } function setupFilterText() { - if (filterText.length > 0) { - isFocused = true; - listOpen = true; + if (filterText.length === 0) return; - if (loadOptions) { - getItems(); - } else { - listOpen = true; + isFocused = true; + listOpen = true; - if (isMulti) { - activeValue = undefined; - } - } + if (loadOptions) { + getItems(); } else { - resetFilteredItems(); - } - } - - function setupFilteredItem() { - if (loadOptions) return; - - let _filteredItems = [...items]; - - if (isCreatable && filterText) { - const itemToCreate = createItem(filterText); - itemToCreate.isCreator = true; - - const existingItemWithFilterValue = _filteredItems.find((item) => { - return ( - item[optionIdentifier] === itemToCreate[optionIdentifier] - ); - }); - - let existingSelectionWithFilterValue; - - if (value) { - if (isMulti) { - existingSelectionWithFilterValue = value.find( - (selection) => { - return ( - selection[optionIdentifier] === - itemToCreate[optionIdentifier] - ); - } - ); - } else if ( - value[optionIdentifier] === itemToCreate[optionIdentifier] - ) { - existingSelectionWithFilterValue = value; - } - } + listOpen = true; - if ( - !existingItemWithFilterValue && - !existingSelectionWithFilterValue - ) { - _filteredItems = [..._filteredItems, itemToCreate]; + if (isMulti) { + activeValue = undefined; } - } else if (isMulti && value && value.length > 0) { - filterItems(); - } - - items = _filteredItems; - } - - $: { - if (prev_items !== items) { - setupFilteredItem(); } } @@ -434,7 +384,6 @@ prev_value = value; prev_filterText = filterText; prev_isFocused = isFocused; - prev_items = items; prev_isMulti = isMulti; }); @@ -501,8 +450,6 @@ }); } - filterItems(); - dispatch('clear', itemToRemove); } @@ -588,14 +535,11 @@ value = undefined; listOpen = false; dispatch('clear', value); - if (isMulti) filterItems(); handleFocus(); } onMount(() => { if (isFocused && input) input.focus(); - if (loadOptions && items) items = [...items]; - if (isMulti && value) filterItems(); }); $: listProps = { @@ -609,13 +553,13 @@ value, isMulti, getGroupHeaderLabel, - items, + items: filteredItems, itemHeight, getOptionLabel, listPlacement, parent: container, listAutoWidth, - listOffset + listOffset, }; function itemSelected(event) { @@ -627,7 +571,6 @@ if (!item.isGroupHeader || item.isSelectable) { if (isMulti) { value = value ? value.concat([item]) : [item]; - filterItems(); } else { value = item; } @@ -827,7 +770,10 @@ } - +
{ } }); - await wait(0); - t.ok(select.items.length === 5); - await handleSet(select, {filterText: 'Ice'}) - t.ok(select.items.length === 1); + t.ok(select.getFilteredItems().length === 5); + select.filterText = 'Ice'; + t.ok(select.getFilteredItems().length === 1); select.$destroy(); }); @@ -825,10 +824,9 @@ test('Select filter text filters list with itemFilter', async (t) => { } }); - await wait(0); - t.ok(select.items.length === 5); - await handleSet(select, {filterText: 'cream ice'}) - t.ok(select.items.length === 1); + t.ok(select.getFilteredItems().length === 1); + select.filterText = 'cream ice'; + t.ok(select.getFilteredItems().length === 1); select.$destroy(); }); @@ -1289,8 +1287,8 @@ test('when isGroupHeaderSelectable clicking group header should select createGro await wait(0); - const groupHeaderItem = select.items[0]; - const groupItem = select.items.find((item) => { + const groupHeaderItem = select.getFilteredItems()[0]; + const groupItem = select.getFilteredItems().find((item) => { return item.group === groupHeaderItem.id; }); @@ -1323,7 +1321,7 @@ test('group headers label should be created by getGroupHeaderLabel(item)', async await wait(0); - const groupHeaderItem = select.items[0]; + const groupHeaderItem = select.getFilteredItems()[0]; t.equal(target.querySelector('.listGroupTitle').textContent, getGroupHeaderLabel(groupHeaderItem)); @@ -1414,7 +1412,7 @@ test('when isMulti is true items in value will not appear in List', async (t) => await wait(0); - t.equal(JSON.stringify(select.items), JSON.stringify([ + t.equal(JSON.stringify(select.getFilteredItems()), JSON.stringify([ {value: 'pizza', label: 'Pizza'}, {value: 'cake', label: 'Cake'}, {value: 'chips', label: 'Chips'}, @@ -1437,7 +1435,7 @@ test('when isMulti is true both value and filterText filters List', async (t) => select.filterText = 'Pizza', - t.equal(JSON.stringify(select.items), JSON.stringify([ + t.equal(JSON.stringify(select.getFilteredItems()), JSON.stringify([ {value: 'pizza', label: 'Pizza'} ])); @@ -2336,7 +2334,7 @@ test('when isMulti, groupBy and value are supplied then list should be filtered' } }); - t.ok(!select.items.find(item => item.name === 'Bar')); + t.ok(!select.getFilteredItems().find(item => item.name === 'Bar')); select.$destroy(); }); @@ -2865,7 +2863,8 @@ test('When loadOptions promise is resolved then dispatch loaded', async (t) => { await wait(0); select.$set({filterText: 'test'}); await wait(500); - t.arrayEqual(loadedEventData.detail.items, ['a', 'b', 'c']); + + t.equal(loadedEventData.detail.items[0].value, 'a'); t.equal(errorEventData, undefined); loadedOff(); @@ -3005,6 +3004,21 @@ test('When isMulti and multiFullItemClearable then clicking anywhere on the item multiSelect.$destroy(); }); +test('When isMulti and filterText then items should filter out already selected items', async (t) => { + const multiSelect = new Select({ + target, + props: { + isMulti: true, + items, + value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], + }, + }); + + t.ok(multiSelect.getFilteredItems().length === 3); + + multiSelect.$destroy(); +}); + test('when loadOptions and items is supplied then list should close on blur', async (t) => { const div = document.createElement('div'); document.body.appendChild(div); @@ -3034,8 +3048,6 @@ test('when loadOptions and items is supplied then list should close on blur', as select.$destroy(); }); - - test('when isCreatable and item created then event "itemCreated" should dispatch', async (t) => { const select = new Select({ target, @@ -3131,8 +3143,6 @@ test('clicking on an external textarea should close and blur it', async (t) => { select.$destroy(); }); - - test('when switching between isMulti true/false ensure Select continues working', async (t) => { const select = new Select({ target, @@ -3235,7 +3245,7 @@ test('when loadOptions and value then items should show on promise resolve',asyn }); await wait(300); - t.ok(select.items.length === 3); + t.ok(select.getFilteredItems().length === 3); select.$destroy(); }); @@ -3320,8 +3330,32 @@ test('When items are updated post onMount ensure filtering still works', async ( select.filterText = 'Two'; select.listOpen = true; - t.ok(select.items.length === 1); - t.ok(select.items[0].value === 'Two'); + t.ok(select.getFilteredItems().length === 1); + t.ok(select.getFilteredItems()[0].value === 'Two'); + + select.$destroy(); +}); + +test('When grouped items are updated post onMount ensure filtering still works', async (t) => { + const select = new Select({ + target, + props: { + // items: null, + // items: ['One', 'Two', 'Three'].map(item => ({ value: item, label: item, group: item.includes('T') ? '2nd Group' : '1st Group' })), + groupBy: item => item.group + }, + }); + + await wait(0); + + select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item, group: item.includes('T') ? '2nd Group' : '1st Group' })); + select.filterText = 'Tw'; + select.listOpen = true; + + t.ok(select.getFilteredItems().length === 2); + t.ok(select.getFilteredItems()[0].label === '2nd Group'); + t.ok(select.getFilteredItems()[1].label === 'Two'); + select.$destroy(); }); From 62fe68443d0fb9b0f819fd869b27432a72f3a4fa Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 7 Jul 2021 17:01:56 +1000 Subject: [PATCH 212/635] 4.2.3-beta.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fc9703f8..d21ba8b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.2", + "version": "4.2.3-beta.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 12468eb56c1724fbbe95c662dbe4c02c84644eac Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 8 Jul 2021 07:43:25 +1000 Subject: [PATCH 215/635] #274 filtering fixes --- src/Select.svelte | 1 + test/src/index.js | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/Select.svelte b/src/Select.svelte index 4b857d1f..f7b9350e 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -602,6 +602,7 @@ } function closeList() { + filterText = ''; listOpen = false; } diff --git a/test/src/index.js b/test/src/index.js index ac49f1a0..269cff7d 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -3377,6 +3377,26 @@ test('When groupBy and value selected ensure filtering still works', async (t) = select.$destroy(); }); +test('When value selected and filterText then ensure selecting the active value still clears filterText', async (t) => { + const select = new Select({ + target, + props: { + items, + }, + }); + + select.filterText = 'Cake'; + document.querySelector('.listItem .item').click(); + await wait(0); + select.listOpen = true; + select.filterText = 'Cake'; + document.querySelector('.listItem .item').click(); + + t.ok(select.filterText.length === 0); + + select.$destroy(); +}); + // this allows us to close puppeteer once tests have completed window.done = done; export default {}; From cbed56a26e762b57f97c03d54db2a881402cf2ce Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 8 Jul 2021 07:43:39 +1000 Subject: [PATCH 216/635] 4.2.3-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 36de613f..e42d6a77 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.3-beta.1", + "version": "4.2.3-beta.2", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 94d8645426ef280d2c3d5a2ab42b909a10bb3580 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 9 Jul 2021 11:22:29 +1000 Subject: [PATCH 218/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5a1938f..13cbd791 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 4.2.3 + +* Filtering refactor (#274) + ## 4.2.2 * Bug fix for filtering items (#274) From faa38a379e69f8f2ae496388cc1d2abd990b29e5 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sun, 11 Jul 2021 12:35:12 +1000 Subject: [PATCH 219/635] #275 createGroupHeaderItem fix --- src/List.svelte | 4 +--- src/Select.svelte | 2 +- test/src/index.js | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index 80c62c0d..ef225553 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -15,9 +15,7 @@ if (option) return option.isCreator ? `Create \"${filterText}\"` : option[labelIdentifier]; }; - export let getGroupHeaderLabel = (option) => { - return option[labelIdentifier]; - }; + export let getGroupHeaderLabel = null; export let itemHeight = 40; export let hoverItemIndex = 0; export let value = undefined; diff --git a/src/Select.svelte b/src/Select.svelte index f7b9350e..88e807b3 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -29,7 +29,7 @@ export let groupFilter = (groups) => groups; export let isGroupHeaderSelectable = false; export let getGroupHeaderLabel = (option) => { - return option[labelIdentifier]; + return option[labelIdentifier] || option.id; }; export let labelIdentifier = 'label'; export let getOptionLabel = (option, filterText) => { diff --git a/test/src/index.js b/test/src/index.js index 269cff7d..7eed6329 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -108,6 +108,14 @@ const itemsWithIndex = [ {value: 'ice-cream', label: 'Ice Cream', index: 4}, ]; +const itemsWithGroupIds = [ + {_id: 'chocolate', name: 'Chocolate', groupie: 'Sweet'}, + {_id: 'pizza', name: 'Pizza', groupie: 'Savory'}, + {_id: 'cake', name: 'Cake', groupie: 'Sweet'}, + {_id: 'chips', name: 'Chips', groupie: 'Savory'}, + {_id: 'ice-cream', name: 'Ice Cream', groupie: 'Sweet'} +]; + function itemsPromise() { return new Promise(resolve => { setTimeout(() => { @@ -3397,6 +3405,57 @@ test('When value selected and filterText then ensure selecting the active value select.$destroy(); }); + +test('When groupBy, optionIdentifier and labelIdentifier then ensure list displays correctly', async (t) => { + const select = new Select({ + target, + props: { + items: itemsWithGroupIds, + optionIdentifier: '_id', + labelIdentifier: 'name', + groupBy: (item) => item.groupie, + listOpen: true, + }, + }); + + let titles = document.querySelectorAll('.listGroupTitle'); + let items = document.querySelectorAll('.listItem .item'); + t.equal(titles[0].innerHTML, 'Sweet'); + t.equal(titles[1].innerHTML, 'Savory'); + t.equal(items[0].innerHTML, 'Chocolate'); + t.equal(items[4].innerHTML, 'Chips'); + + select.$destroy(); +}); + + +test('When groupBy, optionIdentifier, labelIdentifier and createGroupHeaderItem then ensure list displays correctly', async (t) => { + const select = new Select({ + target, + props: { + items: itemsWithGroupIds, + optionIdentifier: '_id', + labelIdentifier: 'name', + groupBy: (item) => item.groupie, + listOpen: true, + createGroupHeaderItem: (groupValue, item) => { + return { + name: `XXX ${groupValue} XXX ${item.name}` + }; + } + }, + }); + + let titles = document.querySelectorAll('.listGroupTitle'); + let items = document.querySelectorAll('.listItem .item'); + t.equal(titles[0].innerHTML, 'XXX Sweet XXX Chocolate'); + t.equal(titles[1].innerHTML, 'XXX Savory XXX Pizza'); + t.equal(items[0].innerHTML, 'Chocolate'); + t.equal(items[4].innerHTML, 'Chips'); + + select.$destroy(); +}); + // this allows us to close puppeteer once tests have completed window.done = done; export default {}; From 53d85cd3666c5d731271787531de5aa1d6894e58 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sun, 11 Jul 2021 12:35:32 +1000 Subject: [PATCH 220/635] 4.2.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6794aa60..90b4bbe6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.3", + "version": "4.2.4", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From e82da471b36af93081b3e74e95f1b4523e4e4cde Mon Sep 17 00:00:00 2001 From: David Fournier Date: Sun, 11 Jul 2021 12:18:40 +0200 Subject: [PATCH 225/635] Mention typescript declaration file in package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 6794aa60..aed781fd 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "svelte": "src/index.js", "module": "dist/index.mjs", "main": "dist/index.js", + "types": "./src/index.d.ts", "scripts": { "build": "rollup -c", "dev": "rollup -cw", From ffdccad3349ee9c27a71b8aa90612a0381ab6c5c Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 12 Jul 2021 07:43:22 +1000 Subject: [PATCH 226/635] changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6e78cf3..8eab42b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # svelte-select changelog +## 4.2.6 + +* TypeScript declaration in package.json (#277) - thanks to @davidfou ## 4.2.5 From 0b366853f3eab2f21f23e6aa1e9ac552806c52c7 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 12 Jul 2021 07:43:31 +1000 Subject: [PATCH 227/635] 4.2.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 15ea5ae1..d7c48129 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.5", + "version": "4.2.6", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 44ccc326c017f1bcd0917a708dfefbb62b956813 Mon Sep 17 00:00:00 2001 From: David Fournier Date: Sun, 18 Jul 2021 18:02:16 +0200 Subject: [PATCH 231/635] Fix selecting an item when a parent ancestor is focusable --- .gitignore | 3 +- package.json | 6 +++- playwright.config.js | 16 ++++++++++ src/Select.svelte | 3 +- test/src/Select/Select--default.svelte | 2 +- tests/page/public/index.html | 16 ++++++++++ tests/page/src/index.js | 15 ++++++++++ tests/page/src/reset.css | 27 +++++++++++++++++ tests/selectItem.spec.js | 39 ++++++++++++++++++++++++ tests/setup.js | 41 ++++++++++++++++++++++++++ 10 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 playwright.config.js create mode 100644 tests/page/public/index.html create mode 100644 tests/page/src/index.js create mode 100644 tests/page/src/reset.css create mode 100644 tests/selectItem.spec.js create mode 100644 tests/setup.js diff --git a/.gitignore b/.gitignore index f0ee4766..2fddeab5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ node_modules .nova /dist/ /test/public/index.js -/test/public/bundle.css \ No newline at end of file +/test/public/bundle.css +/tests/page/public/build diff --git a/package.json b/package.json index d7c48129..0ca1e1d4 100644 --- a/package.json +++ b/package.json @@ -14,17 +14,21 @@ "test": "node test/runner.js", "test:browser": "npm run build && serve test/public", "gen:docs": "node docs/generate_theming_variables_md.js", - "pretest": "npm run build" + "pretest": "npm run build", + "test:new": "playwright test" }, "devDependencies": { "@babel/polyfill": "7.12.1", + "@playwright/test": "1.12.3", "find-in-files": "^0.5.0", + "playwright-chromium": "1.12.3", "port-authority": "^1.0.5", "puppeteer": "^1.9.0", "rollup": "^2.41.2", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-serve": "1.1.0", "rollup-plugin-svelte": "^7.1.0", "rollup-plugin-terser": "^7.0.2", "sirv": "^0.2.2", diff --git a/playwright.config.js b/playwright.config.js new file mode 100644 index 00000000..73f5ba54 --- /dev/null +++ b/playwright.config.js @@ -0,0 +1,16 @@ +module.exports = { + use: { + // Browser options + headless: false, + slowMo: 50, + + // Context options + viewport: { width: 1280, height: 720 }, + ignoreHTTPSErrors: true, + + // Artifacts + screenshot: "only-on-failure", + video: "retry-with-video", + }, + globalSetup: "tests/setup.js", +}; diff --git a/src/Select.svelte b/src/Select.svelte index 6c3c48b1..37aaec59 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -788,7 +788,8 @@ class:focused={isFocused} style={containerStyles} on:click={handleClick} - bind:this={container}> + bind:this={container} + tabindex="-1"> {#if Icon} {/if} diff --git a/test/src/Select/Select--default.svelte b/test/src/Select/Select--default.svelte index 9af9c746..d1a13310 100644 --- a/test/src/Select/Select--default.svelte +++ b/test/src/Select/Select--default.svelte @@ -1,3 +1,3 @@ -
+
diff --git a/tests/page/public/index.html b/tests/page/public/index.html new file mode 100644 index 00000000..6309fa52 --- /dev/null +++ b/tests/page/public/index.html @@ -0,0 +1,16 @@ + + + + svelte-select tests + + + + + + +
+
+
+ + + diff --git a/tests/page/src/index.js b/tests/page/src/index.js new file mode 100644 index 00000000..89ede37b --- /dev/null +++ b/tests/page/src/index.js @@ -0,0 +1,15 @@ +import "./reset.css"; +import Select from "../../../src/Select.svelte"; + +const items = [ + { value: "chocolate", label: "Chocolate" }, + { value: "pizza", label: "Pizza" }, + { value: "cake", label: "Cake" }, + { value: "chips", label: "Chips" }, + { value: "ice-cream", label: "Ice Cream" }, +]; + +window.testExports = { + Select, + items, +}; diff --git a/tests/page/src/reset.css b/tests/page/src/reset.css new file mode 100644 index 00000000..6ba26fdf --- /dev/null +++ b/tests/page/src/reset.css @@ -0,0 +1,27 @@ +html { + width: 100%; + height: 100%; + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, + Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; +} + +body { + font-size: 14px; + width: 100%; + height: 100%; + min-height: 100%; + min-width: 100%; + padding: 20px; + margin: 0; +} + +* { + box-sizing: border-box; + -webkit-font-smoothing: antialiased; +} + +main { + width: 390px; +} diff --git a/tests/selectItem.spec.js b/tests/selectItem.spec.js new file mode 100644 index 00000000..dbda8822 --- /dev/null +++ b/tests/selectItem.spec.js @@ -0,0 +1,39 @@ +const { test, expect } = require("@playwright/test"); + +test.beforeEach(async ({ page }) => { + await page.goto(`http://localhost:${process.env.SERVER_PORT}`); +}); + +test("allows the user to select an item by clicking with a focusable ancestor", async ({ + page, +}) => { + await page.evaluate(() => { + const { Select, items } = window.testExports; + const target = document.createElement("main"); + document.body.appendChild(target); + + const ancestor = document.createElement("div"); + ancestor.setAttribute("tabindex", "-1"); + target.appendChild(ancestor); + + const select = new Select({ + target: ancestor, + props: { + items, + }, + }); + window.selectInstance = select; + }); + + await page.click(".selectContainer"); + await page.click(".listItem"); + + const value = await page.evaluate(() => { + return window.selectInstance.value; + }); + + expect(value).toEqual({ + value: "chocolate", + label: "Chocolate", + }); +}); diff --git a/tests/setup.js b/tests/setup.js new file mode 100644 index 00000000..c7b6dc82 --- /dev/null +++ b/tests/setup.js @@ -0,0 +1,41 @@ +const http = require("http"); +const ports = require("port-authority"); +const rollup = require("rollup"); +const svelte = require("rollup-plugin-svelte"); +const resolve = require("rollup-plugin-node-resolve"); +const css = require("rollup-plugin-css-only"); +const serve = require("rollup-plugin-serve"); + +module.exports = async () => { + const port = await ports.find(1234); + process.env.SERVER_PORT = port; + + const bundle = await rollup.rollup({ + input: "./tests/page/src/index.js", + plugins: [ + svelte({ + emitCss: true, + compilerOptions: { + accessors: true, + dev: true, + }, + }), + css({ output: { dir: "./tests/page/public/build" } }), + resolve(), + serve({ + contentBase: "./tests/page/public", + host: "localhost", + port, + }), + ], + }); + + await bundle.write({ + output: { + dir: "./tests/page/public/build", + inlineDynamicImports: true, + }, + }); + + return () => bundle.close(); +}; From 9cf15bf3193af631a392cbdd0b68576d53f72243 Mon Sep 17 00:00:00 2001 From: David Fournier Date: Mon, 19 Jul 2021 20:04:02 +0200 Subject: [PATCH 232/635] Add test about navigation with Tab --- .gitignore | 1 + tests/container.spec.js | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 tests/container.spec.js diff --git a/.gitignore b/.gitignore index 2fddeab5..d0ede2f2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ node_modules /test/public/index.js /test/public/bundle.css /tests/page/public/build +/test-results diff --git a/tests/container.spec.js b/tests/container.spec.js new file mode 100644 index 00000000..1c2aa953 --- /dev/null +++ b/tests/container.spec.js @@ -0,0 +1,46 @@ +const { test, expect } = require("@playwright/test"); + +test.beforeEach(async ({ page }) => { + await page.goto(`http://localhost:${process.env.SERVER_PORT}`); +}); + +test("the user can navigate through multiple form elements by using Tab", async ({ + page, +}) => { + const inputs = await page.evaluate(() => { + const { Select, items } = window.testExports; + const target = document.createElement("main"); + document.body.appendChild(target); + + const input1 = document.createElement("input"); + input1.setAttribute("type", "text"); + input1.classList.add("input1"); + target.appendChild(input1); + + new Select({ + target, + props: { + items, + }, + }); + + const input2 = document.createElement("input"); + input2.setAttribute("type", "text"); + input2.classList.add("input2"); + target.appendChild(input2); + }); + + await page.click(".input1"); + + // Pressing Tab gives the focus from input1 to the select component + await page.keyboard.press("Tab"); + await expect( + page.$eval(".selectContainer input", (el) => document.activeElement === el) + ).resolves.toBe(true); + + // Pressing Tab gives the focus from the select component to input2 + await page.keyboard.press("Tab"); + await expect( + page.$eval(".input2", (el) => document.activeElement === el) + ).resolves.toBe(true); +}); From 856b4c79171a7e205c665c3c022fd30fc3252bf5 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 20 Jul 2021 07:19:15 +1000 Subject: [PATCH 233/635] moving tabindex to List, cleaning up tests --- .gitignore | 2 +- package.json | 4 +- playwright.config.js | 2 +- {tests => spec}/container.spec.js | 0 {tests => spec}/page/public/index.html | 0 {tests => spec}/page/src/index.js | 0 {tests => spec}/page/src/reset.css | 0 {tests => spec}/selectItem.spec.js | 0 {tests => spec}/setup.js | 8 +- src/List.svelte | 26 +- src/Select.svelte | 3 +- test/src/List/List--default.svelte | 32 - test/src/Select/Select--default.svelte | 2 +- test/src/index.js | 19 - yarn.lock | 1043 +++++++++++++++++++++++- 15 files changed, 1061 insertions(+), 80 deletions(-) rename {tests => spec}/container.spec.js (100%) rename {tests => spec}/page/public/index.html (100%) rename {tests => spec}/page/src/index.js (100%) rename {tests => spec}/page/src/reset.css (100%) rename {tests => spec}/selectItem.spec.js (100%) rename {tests => spec}/setup.js (81%) delete mode 100644 test/src/List/List--default.svelte diff --git a/.gitignore b/.gitignore index d0ede2f2..41d84e5c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,5 @@ node_modules /dist/ /test/public/index.js /test/public/bundle.css -/tests/page/public/build +/spec/page/public/build /test-results diff --git a/package.json b/package.json index 0ca1e1d4..ce217aa6 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,9 @@ "prepublishOnly": "npm test", "test": "node test/runner.js", "test:browser": "npm run build && serve test/public", + "test:playwright": "playwright test", "gen:docs": "node docs/generate_theming_variables_md.js", - "pretest": "npm run build", - "test:new": "playwright test" + "pretest": "npm run build" }, "devDependencies": { "@babel/polyfill": "7.12.1", diff --git a/playwright.config.js b/playwright.config.js index 73f5ba54..e5cf63a2 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -12,5 +12,5 @@ module.exports = { screenshot: "only-on-failure", video: "retry-with-video", }, - globalSetup: "tests/setup.js", + globalSetup: "spec/setup.js", }; diff --git a/tests/container.spec.js b/spec/container.spec.js similarity index 100% rename from tests/container.spec.js rename to spec/container.spec.js diff --git a/tests/page/public/index.html b/spec/page/public/index.html similarity index 100% rename from tests/page/public/index.html rename to spec/page/public/index.html diff --git a/tests/page/src/index.js b/spec/page/src/index.js similarity index 100% rename from tests/page/src/index.js rename to spec/page/src/index.js diff --git a/tests/page/src/reset.css b/spec/page/src/reset.css similarity index 100% rename from tests/page/src/reset.css rename to spec/page/src/reset.css diff --git a/tests/selectItem.spec.js b/spec/selectItem.spec.js similarity index 100% rename from tests/selectItem.spec.js rename to spec/selectItem.spec.js diff --git a/tests/setup.js b/spec/setup.js similarity index 81% rename from tests/setup.js rename to spec/setup.js index c7b6dc82..41f7ee1b 100644 --- a/tests/setup.js +++ b/spec/setup.js @@ -11,7 +11,7 @@ module.exports = async () => { process.env.SERVER_PORT = port; const bundle = await rollup.rollup({ - input: "./tests/page/src/index.js", + input: "./spec/page/src/index.js", plugins: [ svelte({ emitCss: true, @@ -20,10 +20,10 @@ module.exports = async () => { dev: true, }, }), - css({ output: { dir: "./tests/page/public/build" } }), + css({ output: { dir: "./spec/page/public/build" } }), resolve(), serve({ - contentBase: "./tests/page/public", + contentBase: "./spec/page/public", host: "localhost", port, }), @@ -32,7 +32,7 @@ module.exports = async () => { await bundle.write({ output: { - dir: "./tests/page/public/build", + dir: "./spec/page/public/build", inlineDynamicImports: true, }, }); diff --git a/src/List.svelte b/src/List.svelte index ef225553..70bb1775 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -13,7 +13,9 @@ export let labelIdentifier = 'label'; export let getOptionLabel = (option, filterText) => { if (option) - return option.isCreator ? `Create \"${filterText}\"` : option[labelIdentifier]; + return option.isCreator + ? `Create \"${filterText}\"` + : option[labelIdentifier]; }; export let getGroupHeaderLabel = null; export let itemHeight = 40; @@ -270,11 +272,13 @@ -{#if isVirtualList} -
+
+ {#if isVirtualList}
-
-{/if} - -{#if !isVirtualList} -
+ {:else} {#each items as item, i} {#if item.isGroupHeader && !item.isSelectable}
{getGroupHeaderLabel(item)}
@@ -323,5 +323,5 @@
{noOptionsMessage}
{/if} {/each} -
-{/if} + {/if} +
diff --git a/src/Select.svelte b/src/Select.svelte index 37aaec59..6c3c48b1 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -788,8 +788,7 @@ class:focused={isFocused} style={containerStyles} on:click={handleClick} - bind:this={container} - tabindex="-1"> + bind:this={container}> {#if Icon} {/if} diff --git a/test/src/List/List--default.svelte b/test/src/List/List--default.svelte deleted file mode 100644 index ae7a3190..00000000 --- a/test/src/List/List--default.svelte +++ /dev/null @@ -1,32 +0,0 @@ - - - -
-
Chocolate
-
Pizza
-
Cake
-
Chips
-
Ice Cream
-
- - diff --git a/test/src/Select/Select--default.svelte b/test/src/Select/Select--default.svelte index d1a13310..9af9c746 100644 --- a/test/src/Select/Select--default.svelte +++ b/test/src/Select/Select--default.svelte @@ -1,3 +1,3 @@ -
+
diff --git a/test/src/index.js b/test/src/index.js index b8aeee98..5d14275a 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -9,7 +9,6 @@ import TestIcon from './TestIcon.svelte'; import TestClearIcon from './TestClearIcon.svelte'; import SelectDefault from './Select/Select--default.svelte' import SelectMultiSelected from './Select/Select--multiSelected.svelte' -import ListDefault from './List/List--default.svelte' import ParentContainer from './Select/ParentContainer.svelte' import {assert, test, done} from 'tape-modern'; @@ -435,24 +434,6 @@ test('List starts with first item in hover state', async (t) => { select.$destroy(); }); -test('List starts with first item in hover state', async (t) => { - const testTemplate = new ListDefault({ - target: testTarget - }); - - const select = new Select({ - target, - props: { - items, - } - }); - - document.querySelector('.selectContainer').click(); - - testTemplate.$destroy(); - select.$destroy(); -}); - test('select item from list', async (t) => { const select = new Select({ target, diff --git a/yarn.lock b/yarn.lock index bfa0e23a..bccf434d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + dependencies: + "@babel/highlight" "^7.14.5" + "@babel/code-frame@^7.10.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" @@ -9,11 +16,188 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/compat-data@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== + +"@babel/core@^7.14.0": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" + integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helpers" "^7.14.6" + "@babel/parser" "^7.14.6" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" + integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== + dependencies: + "@babel/types" "^7.14.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-compilation-targets@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" + integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== + dependencies: + "@babel/compat-data" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" + integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== + dependencies: + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-member-expression-to-functions@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" + integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-transforms@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" + integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-replace-supers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" + integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-simple-access@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" + integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" + integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + "@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" + integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helpers@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" + integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + "@babel/highlight@^7.12.13": version "7.13.10" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" @@ -23,6 +207,198 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" + integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== + +"@babel/plugin-proposal-class-properties@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.13.8": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.14.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" + integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-commonjs@^7.14.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" + integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== + dependencies: + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-typescript@^7.14.5": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" + integrity sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.6" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" + "@babel/polyfill@7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" @@ -31,6 +407,102 @@ core-js "^2.6.5" regenerator-runtime "^0.13.4" +"@babel/preset-typescript@^7.13.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz#aa98de119cf9852b79511f19e7f44a2d379bcce0" + integrity sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.14.5" + +"@babel/template@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/traverse@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" + integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.14.7" + "@babel/types" "^7.14.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" + integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + to-fast-properties "^2.0.0" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@playwright/test@1.12.3": + version "1.12.3" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.12.3.tgz#178e5d84e4c97c339dd315bd265ab1af39275ef0" + integrity sha512-e8i8rMqd1nhdyW2ELShOc5F2EiLIcZs+2LRglrCAy/nzftpLdAqfsk6gp29n8N5KExIlzpKdoQ5QBviqGzT9DA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/core" "^7.14.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-dynamic-import" "^7.13.8" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-private-property-in-object" "^7.14.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-transform-modules-commonjs" "^7.14.0" + "@babel/preset-typescript" "^7.13.0" + colors "^1.4.0" + commander "^6.1.0" + debug "^4.1.1" + expect "^26.4.2" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.0" + jpeg-js "^0.4.2" + mime "^2.4.6" + minimatch "^3.0.3" + ms "^2.1.2" + pirates "^4.0.1" + pixelmatch "^5.2.1" + pngjs "^5.0.0" + progress "^2.0.3" + proper-lockfile "^4.1.1" + proxy-from-env "^1.1.0" + rimraf "^3.0.2" + source-map-support "^0.4.18" + stack-utils "^2.0.3" + ws "^7.4.6" + yazl "^2.5.1" + "@polka/url@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" @@ -44,6 +516,25 @@ estree-walker "^2.0.1" picomatch "^2.2.2" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/node@*": version "10.12.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" @@ -56,6 +547,37 @@ dependencies: "@types/node" "*" +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^15.0.0": + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" + integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== + dependencies: + "@types/node" "*" + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" @@ -68,6 +590,11 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -80,6 +607,13 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -92,6 +626,13 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -105,6 +646,29 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -115,6 +679,19 @@ builtin-modules@^3.1.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caniuse-lite@^1.0.30001219: + version "1.0.30001245" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz#45b941bbd833cb0fa53861ff2bae746b3c6ca5d4" + integrity sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA== + chalk@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -135,6 +712,14 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -142,16 +727,43 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -167,6 +779,13 @@ concat-stream@1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + core-js@^2.6.5: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" @@ -184,6 +803,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@4, debug@^4.1.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -198,6 +824,18 @@ debug@^4.1.0: dependencies: ms "^2.1.1" +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + diff@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" @@ -208,6 +846,18 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= +electron-to-chromium@^1.3.723: + version "1.3.779" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz#de55492a756deec63424f89fbe62aec9776f0e6d" + integrity sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -220,11 +870,21 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -245,6 +905,18 @@ events-to-array@^1.0.1: resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= +expect@^26.4.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== + dependencies: + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + extract-zip@^1.6.6: version "1.6.7" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" @@ -255,6 +927,17 @@ extract-zip@^1.6.6: mkdirp "0.5.1" yauzl "2.4.1" +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" @@ -262,6 +945,13 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + figures@^1.4.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -270,6 +960,13 @@ figures@^1.4.0: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + find-in-files@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/find-in-files/-/find-in-files-0.5.0.tgz#8e5a20ffb562e0a47cb916b7f7b821717025e691" @@ -300,6 +997,27 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + glob@^7.0.5: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -324,6 +1042,16 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -341,6 +1069,11 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -356,6 +1089,14 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -388,11 +1129,61 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -402,6 +1193,11 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" +jpeg-js@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" + integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -415,17 +1211,42 @@ js-yaml@^3.2.7: argparse "^1.0.7" esprima "^4.0.0" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +micromatch@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime@>=2.4.6, mime@^2.4.6: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + mime@^2.0.3, mime@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== -minimatch@^3.0.4: +minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -437,6 +1258,11 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -449,11 +1275,26 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-releases@^1.1.71: + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -464,13 +1305,33 @@ object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -once@^1.3.0: +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" +opener@1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" @@ -496,16 +1357,75 @@ picomatch@^2.2.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pixelmatch@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.2.1.tgz#9e4e4f4aa59648208a31310306a5bed5522b0d65" + integrity sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ== + dependencies: + pngjs "^4.0.1" + +playwright-chromium@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/playwright-chromium/-/playwright-chromium-1.12.3.tgz#fd8fe42a83b2bbaf616b01615e412f26cdc65859" + integrity sha512-YshYiT/ikEUNGU76lZu4qcfJscERo1257bS1dU1VcBZvz3xNMD2fO25vVOiDEbuYYntLcnj9lW6Qy1UpWSC+VA== + dependencies: + commander "^6.1.0" + debug "^4.1.1" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.0" + jpeg-js "^0.4.2" + mime "^2.4.6" + pngjs "^5.0.0" + progress "^2.0.3" + proper-lockfile "^4.1.1" + proxy-from-env "^1.1.0" + rimraf "^3.0.2" + stack-utils "^2.0.3" + ws "^7.4.6" + yazl "^2.5.1" + plur@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= +pngjs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe" + integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg== + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + port-authority@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/port-authority/-/port-authority-1.0.5.tgz#2aab700997414818ecbd9be2ad0b38433a7255d1" integrity sha512-3nhtaK54aIJrL+D08Lt8AoE10Yz8BOi0gxFlGHCCYFFJ3/oeVdca4AGw5Bzw9Vr1Ntil0fU4ZiG8I3fLhQEnjg== +pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + pretty-ms@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" @@ -520,16 +1440,38 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -progress@^2.0.1: +progress@^2.0.1, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + puppeteer@^1.9.0: version "1.13.0" resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.13.0.tgz#187ccf5ed5caf08ed1291b262d033cc364bf88ab" @@ -561,6 +1503,11 @@ re-emitter@^1.0.0: resolved "https://registry.yarnpkg.com/re-emitter/-/re-emitter-1.1.3.tgz#fa9e319ffdeeeb35b27296ef0f3d374dac2f52a7" integrity sha1-+p4xn/3u6zWycpbvDz03TawvUqc= +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -592,6 +1539,11 @@ resolve@^1.11.1: is-core-module "^2.2.0" path-parse "^1.0.6" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -606,6 +1558,13 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rollup-plugin-cleaner@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rollup-plugin-cleaner/-/rollup-plugin-cleaner-1.0.0.tgz#9f2d7226327fca9109b68c18fea77b427e33c193" @@ -631,6 +1590,14 @@ rollup-plugin-node-resolve@^5.2.0: resolve "^1.11.1" rollup-pluginutils "^2.8.1" +rollup-plugin-serve@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-serve/-/rollup-plugin-serve-1.1.0.tgz#0654a57021a21b903340c69940f7463706e8288d" + integrity sha512-pYkSsuA0/psKqhhictkJw1c2klya5b+LlCvipWqI9OE1aG2M97mRumZCbBlry5CMEOzYBBgSDgd1694sNbmyIw== + dependencies: + mime ">=2.4.6" + opener "1" + rollup-plugin-svelte@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.0.tgz#d45f2b92b1014be4eb46b55aa033fb9a9c65f04d" @@ -673,6 +1640,11 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -680,6 +1652,11 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + sirv@^0.2.2: version "0.2.5" resolved "https://registry.yarnpkg.com/sirv/-/sirv-0.2.5.tgz#da56a42e5f60b0822456cee7bf53e217305f4c3b" @@ -688,6 +1665,18 @@ sirv@^0.2.2: "@polka/url" "^0.5.0" mime "^2.3.1" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@^0.4.18: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -696,6 +1685,11 @@ source-map-support@~0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -718,6 +1712,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +stack-utils@^2.0.2, stack-utils@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" + integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + dependencies: + escape-string-regexp "^2.0.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -744,7 +1745,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -826,6 +1827,18 @@ through@2: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + traverse-chain@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" @@ -858,6 +1871,11 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" +ws@^7.4.6: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -869,3 +1887,18 @@ yauzl@2.4.1: integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= dependencies: fd-slicer "~1.0.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yazl@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" + integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== + dependencies: + buffer-crc32 "~0.2.3" From d642fdc37297a85467f31c33d4b5346eadfb2b1b Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 20 Jul 2021 07:22:47 +1000 Subject: [PATCH 234/635] removing old test file --- test/src/List/List--default.svelte | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 test/src/List/List--default.svelte diff --git a/test/src/List/List--default.svelte b/test/src/List/List--default.svelte deleted file mode 100644 index 93975e24..00000000 --- a/test/src/List/List--default.svelte +++ /dev/null @@ -1,30 +0,0 @@ - -
-
Chocolate
-
Pizza
-
Cake
-
Chips
-
Ice Cream
-
- - From aba32f4ac9d587fbef3cab75723975d274ba2ec1 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 20 Jul 2021 07:23:41 +1000 Subject: [PATCH 235/635] 4.2.7-beta.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4cc8cc7b..1a406975 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.7-beta.0", + "version": "4.2.7-beta.1", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 847d6fb4856a1108ca46144f6919c28f16f8ff2f Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 23 Jul 2021 07:37:40 +1000 Subject: [PATCH 238/635] #285 adding focus events to list items --- src/List.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/List.svelte b/src/List.svelte index b18930b0..d088ee3c 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -289,6 +289,7 @@ let:i>
handleHover(i)} + on:focus={() => handleHover(i)} on:click={(event) => handleClick({ item, i, event })} class="listItem"> handleHover(i)} + on:focus={() => handleHover(i)} on:click={(event) => handleClick({ item, i, event })} class="listItem"> Date: Fri, 23 Jul 2021 07:39:41 +1000 Subject: [PATCH 239/635] 4.2.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 15f55460..7e2fcbad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.7-beta.2", + "version": "4.2.7", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A + {/each} + {/if}
diff --git a/test/src/Select/Select--default.svelte b/test/src/Select/Select--default.svelte index 9af9c746..76d4c871 100644 --- a/test/src/Select/Select--default.svelte +++ b/test/src/Select/Select--default.svelte @@ -1,3 +1,17 @@
- + + +
diff --git a/test/src/index.js b/test/src/index.js index 56e87734..07fbe034 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -145,7 +145,7 @@ assert.arrayEqual = (a, b) => { assert.ok(a.every((val, i) => val === b[i])); }; -// tests + test('with no data creates default elements', async (t) => { const testTemplate = new SelectDefault({ target: testTarget @@ -1236,7 +1236,7 @@ test('clicking group header should not make a selected', async (t) => { await wait(0); await querySelectorClick('.listGroupTitle'); - t.equal(select.value, undefined); + t.ok(!select.value); select.$destroy(); }); @@ -1254,7 +1254,7 @@ test('when groupBy, no active item and keydown enter is fired then list should c await wait(0); await querySelectorClick('.selectContainer'); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(select.value, undefined); + t.ok(!select.value); select.$destroy(); }); @@ -2213,7 +2213,7 @@ test('when isMulti and textFilter has length and no items in list then enter sho }); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.value === undefined); + t.ok(!select.value); select.$destroy(); }); @@ -2510,7 +2510,7 @@ test('When isMulti and an items remove icon is clicked then item should be remov await querySelectorClick('.multiSelectItem_clear'); t.ok(select.value[0].value === 'cake') await querySelectorClick('.multiSelectItem_clear'); - t.ok(select.value === undefined); + t.ok(!select.value); select.$destroy(); }); @@ -3159,7 +3159,7 @@ test('when switching between isMulti true/false ensure Select continues working' select.loadOptions = null; select.items = [...items]; - t.ok(select.value === null); + t.ok(!select.value); select.$destroy(); }); @@ -3212,7 +3212,7 @@ test('when isMulti and placeholderAlwaysShow then always show placeholder text', }); await wait(0); - let elem = target.querySelector('.selectContainer input'); + let elem = target.querySelector('.selectContainer input[type="text"]'); t.ok(elem.placeholder === 'foo bar'); select.$destroy(); @@ -3507,6 +3507,86 @@ test('When loadOptions and isCreatable then create new item show at bottom of re }); +test('When inputAttributes.name supplied, add to hidden input', async (t) => { + const select = new Select({ + target, + props: { + inputAttributes: { name: 'Foods' }, + items: items, + showIndicator: true, + }, + }); + + let hidden = document.querySelector('input[type="hidden"]').name; + t.equal(hidden, 'Foods'); + + select.$destroy(); +}); + +test('When no value then hidden field should also have no value', async (t) => { + const select = new Select({ + target, + props: { + inputAttributes: { name: 'Foods' }, + items: items, + + }, + }); + + let hidden = document.querySelector('input[type="hidden"]').value; + t.ok(!hidden); + + select.$destroy(); +}); + +test('When value then hidden field should have value.label', async (t) => { + const select = new Select({ + target, + props: { + items: items, + value: {value: 'cake', label: 'Cake'}, + }, + }); + + let hidden = document.querySelector('input[type="hidden"]').value; + t.equal(hidden, 'Cake'); + + select.$destroy(); +}); + +test('When isMulti and no value then hidden field should no value', async (t) => { + const select = new Select({ + target, + props: { + isMulti: true, + items: items, + }, + }); + + let hidden = document.querySelector('input[type="hidden"]').value; + t.ok(!hidden); + + select.$destroy(); +}); + +test('When isMulti and value then hidden fields should list value items', async (t) => { + const select = new Select({ + target, + props: { + isMulti: true, + items: items, + value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},] + }, + }); + + let hidden = document.querySelectorAll('input[type="hidden"]'); + t.equal(hidden[0].value, 'Cake'); + t.equal(hidden[1].value, 'Pizza'); + + select.$destroy(); +}); + + // this allows us to close puppeteer once tests have completed window.done = done; export default {}; From aaa44213ffb6d56acc337e33f08bbf18b08b9c88 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 29 Jul 2021 09:32:43 +1000 Subject: [PATCH 242/635] 4.2.8-beta.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e2fcbad..171b026a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.7", + "version": "4.2.8-beta.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 3defc4cd7611aa46c5c04cb6e79b7f8f1ecf49f8 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 2 Aug 2021 08:04:08 +1000 Subject: [PATCH 245/635] #286 making aria-selection and aria-context exported props --- src/Select.svelte | 32 ++++++++++++++++++++++--------- test/src/index.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 9 deletions(-) diff --git a/src/Select.svelte b/src/Select.svelte index d8d85da3..956fbdb8 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -627,13 +627,28 @@ listOpen = false; } + export let ariaValues = (values) => { + return `Option ${values}, selected.`; + } + + export let ariaListOpen = (label, count) => { + return `You are currently focused on option ${label}. There are ${count} results available.`; + } + + export let ariaFocused = () => { + return `Select is focused, type to refine list, press down to open the menu.`; + } + function handleAriaSelection() { + let selected = undefined; + if (isMulti && value.length > 0) { - let values = value.map((v) => getSelectionLabel(v)); - return `Options ${values.join(', ')}, selected.`; + selected = value.map((v) => getSelectionLabel(v)).join(', '); } else { - return `Option ${getSelectionLabel(value)}, selected.`; + selected = getSelectionLabel(value); } + + return ariaValues(selected); } function handleAriaContent() { @@ -642,13 +657,12 @@ let _item = filteredItems[hoverItemIndex]; if (listOpen && _item) { - return `You are currently focused on option ${getSelectionLabel( - _item - )}. There are ${ - filteredItems ? filteredItems.length : 0 - } results available. Use up and down to choose options, press enter to select the currently focused option, press escape to exit the menu, press tab to select the option and exit the menu.`; + let label = getSelectionLabel(_item); + let count = filteredItems ? filteredItems.length : 0; + + return ariaListOpen(label, count); } else { - return 'Select is focused, type to refine list, press down to open the menu.'; + return ariaFocused(); } } diff --git a/test/src/index.js b/test/src/index.js index 3c8aab54..5c92a1c6 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -3638,6 +3638,55 @@ test('When listOpen, value and isMulti then aria-selection describes value', asy select.$destroy(); }); +test('When ariaValues and value supplied, then aria-selection uses default updated', async (t) => { + const select = new Select({ + target, + props: { + items: items, + value: {value: 'pizza', label: 'Pizza'}, + isFocused: true, + ariaValues: (val) => `Yummy ${val} in my tummy!` + }, + }); + + let aria = document.querySelector('#aria-selection'); + t.equal(aria.innerHTML, 'Yummy Pizza in my tummy!'); + + select.$destroy(); +}); + +test('When ariaListOpen, listOpen, then aria-context uses default updated', async (t) => { + const select = new Select({ + target, + props: { + items: items, + listOpen: true, + ariaListOpen: (label, count) => `label: ${label}, count: ${count}` + }, + }); + + let aria = document.querySelector('#aria-context'); + t.equal(aria.innerHTML, 'label: Chocolate, count: 5'); + + select.$destroy(); +}); + +test('When ariaFocused, focused value supplied, then aria-context uses default updated', async (t) => { + const select = new Select({ + target, + props: { + items: items, + isFocused: true, + ariaFocused: () => `nothing to see here.` + }, + }); + + let aria = document.querySelector('#aria-context'); + t.equal(aria.innerHTML, 'nothing to see here.'); + + select.$destroy(); +}); + // this allows us to close puppeteer once tests have completed window.done = done; export default {}; From 4831b45fda19950a6fbdb3a559d5f9c296d982b8 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 2 Aug 2021 08:04:24 +1000 Subject: [PATCH 246/635] 4.2.8-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 28bd52a3..3f6fbdcd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.2.8-beta.1", + "version": "4.2.8-beta.2", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 034497afe3044a0adca1bb2dc4820eefbbcfd7fc Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 10 Aug 2021 22:00:43 +1000 Subject: [PATCH 250/635] #291 filterText fix --- CHANGELOG.md | 4 ++++ src/Select.svelte | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7402a2b..a895e787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 4.3.1 + +* TextFilter bug + ## 4.3.0 * Added A11y support (#286) - thanks to @fedoskina diff --git a/src/Select.svelte b/src/Select.svelte index 57771091..3956784c 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -215,10 +215,6 @@ typeof item === 'string' ? { value: item, label: item } : item ); } - - if (prev_filterText && !loadOptions) { - filterText = ''; - } } let _inputAttributes; From 6d4e032131a96e59d67b99084ed7e1e1d49e0f0e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 10 Aug 2021 22:01:44 +1000 Subject: [PATCH 251/635] 4.3.1-beta.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74b5d0e9..0f2cf34c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.3.0", + "version": "4.3.1-beta.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From 33dedc48e67a21492f0b76984aac3493e293401e Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 11:41:34 +0800 Subject: [PATCH 254/635] Add a test for selectable attribute --- test/src/index.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/src/index.js b/test/src/index.js index 3da05064..10a1cef2 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -114,6 +114,13 @@ const itemsWithGroupIds = [ {_id: 'ice-cream', name: 'Ice Cream', groupie: 'Sweet'} ]; +const itemsWithSelectable = [ + {value: 'notSelectable1', label: 'NotSelectable1', selectable: false}, + {value: 'selectableDefault', label: 'SelectableDefault'}, + {value: 'selectableTrue', label: 'SelectableTrue', selectable: true}, + {value: 'notSelectable2', label: 'NotSelectable2', selectable: false} +]; + function itemsPromise() { return new Promise(resolve => { setTimeout(() => { @@ -1241,6 +1248,36 @@ test('clicking group header should not make a selected', async (t) => { select.$destroy(); }); +test.only('clicking an item with selectable: false should not make a selected', async (t) => { + const select = new Select({ + target, + props: { + listOpen: true, + items: itemsWithSelectable + } + }); + + await wait(0); + + // notSelectable1 + await querySelectorClick('.listItem:nth-child(1)') + t.ok(!select.value); + + // notSelectable2 + await querySelectorClick('.listItem:nth-child(4)') + t.ok(!select.value); + + // selectableDefault + await querySelectorClick('.listItem:nth-child(2)') + t.ok(select.value == 'selectableDefault'); + + // selectableDefault + await querySelectorClick('.listItem:nth-child(2)') + t.ok(select.value == 'selectableTrue'); + + //select.$destroy(); +}); + test('when groupBy, no active item and keydown enter is fired then list should close without selecting item', async (t) => { const select = new Select({ target, From afb5c4cee460c394d05f5eb12d13d5d36002480c Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 12:07:00 +0800 Subject: [PATCH 255/635] Fix tests --- test/src/index.js | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/test/src/index.js b/test/src/index.js index 10a1cef2..33ee345a 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1248,6 +1248,7 @@ test('clicking group header should not make a selected', async (t) => { select.$destroy(); }); +// TODO Remove .only test.only('clicking an item with selectable: false should not make a selected', async (t) => { const select = new Select({ target, @@ -1267,15 +1268,46 @@ test.only('clicking an item with selectable: false should not make a selected', await querySelectorClick('.listItem:nth-child(4)') t.ok(!select.value); + //select.$destroy(); +}); + +// TODO Remove .only +test.only('clicking an item with selectable not specified should make a selected', async (t) => { + const select = new Select({ + target, + props: { + listOpen: true, + items: itemsWithSelectable + } + }); + + await wait(0); + // selectableDefault await querySelectorClick('.listItem:nth-child(2)') - t.ok(select.value == 'selectableDefault'); + t.ok(select.value && select.value.value == 'selectableDefault'); + + select.$destroy(); +}); + +// TODO Remove .only +test.only('clicking an item with selectable: true should make a selected', async (t) => { + const select = new Select({ + target, + props: { + listOpen: true, + items: itemsWithSelectable + } + }); + + await wait(0); // selectableDefault - await querySelectorClick('.listItem:nth-child(2)') - t.ok(select.value == 'selectableTrue'); + await querySelectorClick('.listItem:nth-child(3)') + console.log(select.value) + t.ok(select.value && select.value.value == 'selectableTrue'); - //select.$destroy(); + select.$destroy(); }); test('when groupBy, no active item and keydown enter is fired then list should close without selecting item', async (t) => { From 1c18c64ad6600753f7f43e5c0a8d75d423329869 Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 12:18:15 +0800 Subject: [PATCH 256/635] When scrolling via keyboard, skip unselectable items --- src/List.svelte | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index d4a65e96..5483a3eb 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -119,9 +119,7 @@ hoverItemIndex = hoverItemIndex + increment; } - isNonSelectableItem = - items[hoverItemIndex].isGroupHeader && - !items[hoverItemIndex].isSelectable; + isNonSelectableItem = !isItemSelectable(items[hoverItemIndex]); } await tick(); @@ -208,6 +206,12 @@ return hoverItemIndex === itemIndex || items.length === 1; } + function isItemSelectable(item) { + return (item.isGroupHeader && item.isSelectable) || + item.selectable || + !item.hasOwnProperty('selectable') // Default; if `selectable` was not specified, the object is selectable + } + let listStyle; function computePlacement() { const { top, height, width } = parent.getBoundingClientRect(); From bc177c302b0bba20bfd772d555b5e975fbb4cf44 Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 12:32:12 +0800 Subject: [PATCH 257/635] Only allow selecting and hovering over selectable items --- src/List.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index 5483a3eb..27b6e0fd 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -94,7 +94,7 @@ if (item.isCreator) { dispatch('itemCreated', filterText); - } else { + } else if (isItemSelectable(item)) { activeItemIndex = i; hoverItemIndex = i; handleSelect(item); @@ -203,7 +203,7 @@ } function isItemHover(hoverItemIndex, item, itemIndex, items) { - return hoverItemIndex === itemIndex || items.length === 1; + return isItemSelectable(item) && (hoverItemIndex === itemIndex || items.length === 1); } function isItemSelectable(item) { From 42829de19b1ee026bcca16be25c11f381d829e50 Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 12:37:31 +0800 Subject: [PATCH 258/635] Expose isSelectable to Item component and in the default component, gray-out the notSelectable items --- src/Item.svelte | 8 ++++++++ src/List.svelte | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Item.svelte b/src/Item.svelte index 65bf105a..68c9f6e5 100644 --- a/src/Item.svelte +++ b/src/Item.svelte @@ -2,6 +2,7 @@ export let isActive = false; export let isFirst = false; export let isHover = false; + export let isSelectable = false; export let getOptionLabel = undefined; export let item = undefined; export let filterText = ''; @@ -25,6 +26,9 @@ if (item.isGroupItem) { classes.push('groupItem'); } + if (!isSelectable) { + classes.push('notSelectable'); + } itemClasses = classes.join(' '); } @@ -58,6 +62,10 @@ color: var(--itemIsActiveColor, #fff); } + .item.notSelectable { + color: var(--itemIsNotSelectableColor, #999); + } + .item.first { border-radius: var(--itemFirstBorderRadius, 4px 4px 0 0); } diff --git a/src/List.svelte b/src/List.svelte index 27b6e0fd..0427c7dd 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -302,7 +302,8 @@ {getOptionLabel} isFirst={isItemFirst(i)} isActive={isItemActive(item, value, optionIdentifier)} - isHover={isItemHover(hoverItemIndex, item, i, items)} /> + isHover={isItemHover(hoverItemIndex, item, i, items)} + isSelectable={isItemSelectable(item)} />
{:else} @@ -323,7 +324,8 @@ {getOptionLabel} isFirst={isItemFirst(i)} isActive={isItemActive(item, value, optionIdentifier)} - isHover={isItemHover(hoverItemIndex, item, i, items)} /> + isHover={isItemHover(hoverItemIndex, item, i, items)} + isSelectable={isItemSelectable(item)} />
{/if} {:else} From 49a85ca2994496e94a0fc1c23a8cb33637b76371 Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 12:39:29 +0800 Subject: [PATCH 259/635] Re-enable all tests --- test/src/index.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/test/src/index.js b/test/src/index.js index 33ee345a..b4e9dbe4 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1248,8 +1248,7 @@ test('clicking group header should not make a selected', async (t) => { select.$destroy(); }); -// TODO Remove .only -test.only('clicking an item with selectable: false should not make a selected', async (t) => { +test('clicking an item with selectable: false should not make a selected', async (t) => { const select = new Select({ target, props: { @@ -1268,11 +1267,10 @@ test.only('clicking an item with selectable: false should not make a selected', await querySelectorClick('.listItem:nth-child(4)') t.ok(!select.value); - //select.$destroy(); + select.$destroy(); }); -// TODO Remove .only -test.only('clicking an item with selectable not specified should make a selected', async (t) => { +test('clicking an item with selectable not specified should make a selected', async (t) => { const select = new Select({ target, props: { @@ -1290,8 +1288,7 @@ test.only('clicking an item with selectable not specified should make a selected select.$destroy(); }); -// TODO Remove .only -test.only('clicking an item with selectable: true should make a selected', async (t) => { +test('clicking an item with selectable: true should make a selected', async (t) => { const select = new Select({ target, props: { From 6d017d612c696258ed4d3679e1398ed7204c02e0 Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 12:41:34 +0800 Subject: [PATCH 260/635] Regenerate list of theming variables --- docs/theming_variables.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 1f7f2815..1e992164 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -49,6 +49,7 @@ You can override the following variables to style a Select component. - `--itemHoverColor` - `--itemIsActiveBG` - `--itemIsActiveColor` +- `--itemIsNotSelectableColor` - `--itemPadding` - `--listBackground` - `--listBorder` From 01bd85ec8f55f2a690ad40e24eb802bac909a6af Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 12:47:47 +0800 Subject: [PATCH 261/635] Update docs to include a mention of the `selectable` attribute --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index cfcb1505..2f538950 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,11 @@ yarn add svelte-select ``` +To provide an item that is not selectable, include `selectable: false` in the item. Example: + +```javascript +{value: 'pizza', label: 'Pizza', selectable: false} +``` ## API From 4bcf3afc20c5c835c1fe9587f367610641288a3f Mon Sep 17 00:00:00 2001 From: Michael Daugherty Date: Tue, 17 Aug 2021 12:49:02 +0800 Subject: [PATCH 262/635] Update the advanced REPL example. I am not very familiar with this system and was not able to test the example because this has not yet been merged. :crossed_fingers: Hope I did this right. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f538950..c8532666 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A select/autocomplete component for Svelte apps. With support for grouping, fil 🌱 [Simple demo](https://svelte.dev/repl/a859c2ba7d1744af9c95037c48989193?version=3.12.1) -🌻 [Advanced demo](https://svelte.dev/repl/3e032a58c3974d07b7818c0f817a06a3?version=3.20.1) +🌻 [Advanced demo](https://svelte.dev/repl/9c79ce1329f749c4a4e84f1c2f480653?version=3.20.1) ## Installation From 82f257db58d18a436216d290e2a7348481b201d5 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 18 Aug 2021 16:09:38 +1000 Subject: [PATCH 263/635] Updated README for item examples and added old REPL link back --- README.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c8532666..c71952e8 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A select/autocomplete component for Svelte apps. With support for grouping, fil 🌱 [Simple demo](https://svelte.dev/repl/a859c2ba7d1744af9c95037c48989193?version=3.12.1) -🌻 [Advanced demo](https://svelte.dev/repl/9c79ce1329f749c4a4e84f1c2f480653?version=3.20.1) +🌻 [Advanced demo](https://svelte.dev/repl/3e032a58c3974d07b7818c0f817a06a3?version=3.20.1) ## Installation @@ -42,12 +42,6 @@ yarn add svelte-select ``` -To provide an item that is not selectable, include `selectable: false` in the item. Example: - -```javascript -{value: 'pizza', label: 'Pizza', selectable: false} -``` - ## API - `id: String` Default: `null`. Add an id to the input field. @@ -86,15 +80,70 @@ To provide an item that is not selectable, include `selectable: false` in the it - `isWaiting: Boolean` Default: `false`. If true then loader shows. `loadOptions` will automatically set this as true until promise resolves. - `listOffset: Number` Default: `5`. Controls the spacing offset between the list and the input. +### Items + +`items` can be simple arrays or collections. + +```html + + + +``` + +They can also be grouped and include non-selectable items. + +```html + + + +``` + ### Exposed methods -If you really want to get your hands dirty these internal functions are exposed as props to override if needed. See the adv demo or look through the test file (test/src/index.js) for examples. +These internal functions are exposed to override if needed. See the adv demo or look through the test file (test/src/index.js) for examples. ```js export let itemFilter = (label, filterText, option) => label.toLowerCase().includes(filterText.toLowerCase()); ``` ```js -export let groupBy = undefined; // see adv demo for example +export let groupBy = undefined; ``` ```js From b73229df1d52ce7597eeb74d88591c95a8dee767 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 18 Aug 2021 17:13:46 +1000 Subject: [PATCH 264/635] Updating README with items and async examples --- README.md | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c71952e8..f4328a16 100644 --- a/README.md +++ b/README.md @@ -86,13 +86,15 @@ yarn add svelte-select ```html ``` +### Async Items + +To load items asynchronously then `loadOptions` is the simplest solution. Supply a function that returns a `Promise` that resolves with a list of items. `loadOptions` has debounce baked in and fires each time `filterText` is updated. + +```html + + + component for Svelte apps", "svelte": "src/index.js", From 406d0382029ccac9202217e0a3accc2ca998ca7b Mon Sep 17 00:00:00 2001 From: Paolo Tiu Date: Fri, 3 Sep 2021 10:28:54 +0800 Subject: [PATCH 267/635] fix: add placeholderAlwaysShow prop type --- src/index.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.d.ts b/src/index.d.ts index 43c47d58..2d5b5fd8 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -14,6 +14,7 @@ export interface SelectProps { value?: any; filterText?: string; placeholder?: string; + placeholderAlwaysShow?: boolean; items?: any[]; itemFilter?: (label: string, filterText: string, option: any) => boolean; groupBy?: (item: any) => any; From 92574c0354b806ac88cce163d2c32d4b6b14ddaa Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sat, 4 Sep 2021 06:48:41 +1000 Subject: [PATCH 268/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72404049..4ea761c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 4.4.1 + +* Added missing prop 'placeholderAlwaysShow' to TypeScript declaration file (#305) - thanks to @paolotiu + ## 4.4.0 * Added support for non-selectable items - thanks to @mpdaugherty From 442348f651fa1c0491a25d9eea5b51969651715e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Sat, 4 Sep 2021 06:50:07 +1000 Subject: [PATCH 269/635] 4.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 93548653..b7bf2d02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.4.0", + "version": "4.4.1", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", - "svelte": "src/index.js", - "module": "dist/index.mjs", - "main": "dist/index.js", - "types": "./src/index.d.ts", "scripts": { - "build": "rollup -c", - "dev": "rollup -cw", - "prepublishOnly": "npm run build", + "dev": "svelte-kit dev", + "build": "svelte-kit build", + "preview": "svelte-kit preview", + "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. .", + "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. .", "test": "node test/runner.js", "test:browser": "npm run build && serve test/public", "test:playwright": "playwright test", "gen:docs": "node docs/generate_theming_variables_md.js", - "pretest": "npm run build" + "pretest": "npm run build", + "package": "svelte-kit package" }, "devDependencies": { "@babel/polyfill": "7.12.1", "@playwright/test": "1.12.3", + "@sveltejs/kit": "next", "find-in-files": "^0.5.0", "playwright-chromium": "1.12.3", "port-authority": "^1.0.5", + "prettier": "~2.2.1", + "prettier-plugin-svelte": "^2.2.0", "puppeteer": "^1.9.0", "rollup": "^2.41.2", "rollup-plugin-cleaner": "^1.0.0", @@ -33,17 +35,16 @@ "rollup-plugin-terser": "^7.0.2", "sirv": "^0.2.2", "svelte": "^3.38.3", + "svelte2tsx": "^0.4.5", "tap-diff": "^0.1.1", "tap-dot": "^2.0.0", - "tape-modern": "^1.1.1" + "tape-modern": "^1.1.1", + "typescript": "^4.4.2" }, - "author": "rob-balfre", - "license": "LIL", + "author": "Robert Balfré (https://github.com/rob-balfre)", + "license": "ISC", "keywords": [ "svelte" ], - "files": [ - "src", - "dist" - ] + "type": "module" } diff --git a/src/app.html b/src/app.html new file mode 100644 index 00000000..e759c4a4 --- /dev/null +++ b/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %svelte.head% + + +
%svelte.body%
+ + diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 00000000..63908c66 --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/index.d.ts b/src/index.d.ts deleted file mode 100644 index 2d5b5fd8..00000000 --- a/src/index.d.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { SvelteComponent } from "svelte"; - -export interface SelectProps { - id?: string; - container?: HTMLElement; - input?: HTMLInputElement; - Item?: any; - Selection?: any; - MultiSelection?: any; - isMulti?: boolean; - isDisabled?: boolean; - isCreatable?: boolean; - isFocused?: boolean; - value?: any; - filterText?: string; - placeholder?: string; - placeholderAlwaysShow?: boolean; - items?: any[]; - itemFilter?: (label: string, filterText: string, option: any) => boolean; - groupBy?: (item: any) => any; - groupFilter?: (groups: any) => any; - isGroupHeaderSelectable?: boolean; - getGroupHeaderLabel?: (option: any) => string; - getOptionLabel?: (option: any, filterText: string) => string; - optionIdentifier?: string; - labelIdentifier?: string; - loadOptions?: (filterText: string) => Promise; - hasError?: boolean; - containerStyles?: string; - getSelectionLabel?: (option: any) => string; - createGroupHeaderItem?: (groupValue: any) => any; - createItem?: (filterText: string) => any; - isSearchable?: boolean; - inputStyles?: string; - isClearable?: boolean; - isWaiting?: boolean; - listPlacement?: "auto" | "top" | "bottom"; - listOpen?: boolean; - list?: any; - isVirtualList?: boolean; - loadOptionsInterval?: number; - noOptionsMessage?: string; - hideEmptyState?: boolean; - filteredItems?: any[]; - inputAttributes?: object; - listAutoWidth?: boolean; - itemHeight?: number; - Icon?: any; - iconProps?: object; - showChevron?: boolean; - showIndicator?: boolean; - containerClasses?: string; - indicatorSvg?: string; - handleClear?: () => void; - ariaValues?: (values: string) => string; - ariaListOpen?: (label: string, count:number) => string; - ariaFocused?: () => string; -} - -declare class Select extends SvelteComponent { - $$prop_def: SelectProps; -} - -export default Select; diff --git a/src/ClearIcon.svelte b/src/lib/ClearIcon.svelte similarity index 100% rename from src/ClearIcon.svelte rename to src/lib/ClearIcon.svelte diff --git a/src/Item.svelte b/src/lib/Item.svelte similarity index 100% rename from src/Item.svelte rename to src/lib/Item.svelte diff --git a/src/List.svelte b/src/lib/List.svelte similarity index 99% rename from src/List.svelte rename to src/lib/List.svelte index 0427c7dd..2ecd14b7 100644 --- a/src/List.svelte +++ b/src/lib/List.svelte @@ -1,6 +1,6 @@ + +

Svelte Select

+ + component for Svelte apps", "scripts": { From bf83fef3767c42ae90699b9f61541ca0ea56e3e3 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 6 Sep 2021 17:05:53 +1000 Subject: [PATCH 272/635] removed isVirtualList --- CHANGELOG.md | 7 ++++++- package-lock.json | 4 ++-- src/lib/List.svelte | 23 ++++++++++++++--------- src/lib/Select.svelte | 5 +---- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79223c35..c3f67a10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # svelte-select changelog -## 5.0.0-alpha.0 (DO NOT USE!!!!!!) +## unreleased + +* VirtualList null by default +* Removed isVirtualList, will use VirtualList going forward + +## 5.0.0-alpha.0 * Convert repo to use SvelteKit * Change licence from LIL to ISC diff --git a/package-lock.json b/package-lock.json index 0c798269..ffb232ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "svelte-select", - "version": "4.4.1", + "version": "5.0.0-alpha.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "4.4.1", + "version": "5.0.0-alpha.0", "license": "ISC", "devDependencies": { "@babel/polyfill": "7.12.1", diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 2ecd14b7..a9c9f058 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -8,7 +8,6 @@ export let container = undefined; export let VirtualList = null; export let Item = ItemComponent; - export let isVirtualList = false; export let items = []; export let labelIdentifier = 'label'; export let getOptionLabel = (option, filterText) => { @@ -106,7 +105,7 @@ } async function updateHoverItem(increment) { - if (isVirtualList) return; + if (VirtualList) return; let isNonSelectableItem = true; @@ -178,7 +177,7 @@ } function scrollToActiveItem(className) { - if (isVirtualList || !container) return; + if (VirtualList || !container) return; let offsetBounding; const focusedElemBounding = container.querySelector( @@ -203,13 +202,18 @@ } function isItemHover(hoverItemIndex, item, itemIndex, items) { - return isItemSelectable(item) && (hoverItemIndex === itemIndex || items.length === 1); + return ( + isItemSelectable(item) && + (hoverItemIndex === itemIndex || items.length === 1) + ); } function isItemSelectable(item) { - return (item.isGroupHeader && item.isSelectable) || + return ( + (item.isGroupHeader && item.isSelectable) || item.selectable || - !item.hasOwnProperty('selectable') // Default; if `selectable` was not specified, the object is selectable + !item.hasOwnProperty('selectable') + ); } let listStyle; @@ -280,10 +284,10 @@
- {#if isVirtualList} + {#if VirtualList} handleHover(i)} on:focus={() => handleHover(i)} on:click={(event) => handleClick({ item, i, event })} - class="listItem"> + class="listItem" + tabindex="-1"> 0) return; @@ -570,7 +568,6 @@ optionIdentifier, noOptionsMessage, hideEmptyState, - isVirtualList, VirtualList, value, isMulti, From ac8219b431692e86a40d97f33196a60c181cb310 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 13 Sep 2021 09:21:36 +1000 Subject: [PATCH 273/635] moving MultiSelection and debounce to imports --- src/lib/Select.svelte | 12 +++++------- src/routes/index.svelte | 4 +++- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 52b917a2..6481d44d 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -4,9 +4,7 @@ import _List from './List.svelte'; import _Item from './Item.svelte'; import _Selection from './Selection.svelte'; - import _MultiSelection from './MultiSelection.svelte'; import _ClearIcon from './ClearIcon.svelte'; - import debounce from './debounce'; const dispatch = createEventDispatcher(); @@ -23,7 +21,7 @@ export let placeholder = 'Select...'; export let placeholderAlwaysShow = false; export let items = null; - export let itemFilter = (label, filterText, option) => + export let itemFilter = (label, filterText) => `${label}`.toLowerCase().includes(filterText.toLowerCase()); export let groupBy = undefined; export let groupFilter = (groups) => groups; @@ -88,8 +86,9 @@ export let Item = _Item; export let List = _List; export let Selection = _Selection; - export let MultiSelection = _MultiSelection; + export let MultiSelection = null; export let VirtualList = null; + export let debounce = null; function filterMethod(args) { if (args.loadOptions && args.filterText.length > 0) return; @@ -675,7 +674,6 @@ \ No newline at end of file diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 7ee1e42a..ebf8de14 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -87,6 +87,7 @@ export let VirtualList = null; export let ChevronIcon = null; export let ClearIcon = null; + export let LoadingIcon = null; export let debounce = _debounce; function filterMethod(args) { @@ -778,32 +779,6 @@ color: var(--indicatorColor, --iconsColor); } - .spinner { - width: var(--spinnerWidth, 20px); - height: var(--spinnerHeight, 20px); - color: var(--spinnerColor, #51ce6c); - animation: rotate 0.75s linear infinite; - } - - .spinner_icon { - display: block; - height: 100%; - transform-origin: center center; - width: 100%; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: auto; - -webkit-transform: none; - } - - .spinner_path { - stroke-dasharray: 90; - stroke-linecap: round; - } - .multiSelect { display: flex; padding: var(--multiSelectPadding, 0 35px 0 16px); @@ -838,12 +813,6 @@ padding: 0px; white-space: nowrap; } - - @keyframes rotate { - 100% { - transform: rotate(360deg); - } - } - - - -
+ {/if}
diff --git a/test/src/index.js b/test/src/index.js index 7ff0cca2..0f416de1 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -4,6 +4,7 @@ import Select from '../../src/lib/Select.svelte'; import MultiSelection from '../../src/lib/MultiSelection.svelte'; import ChevronIcon from '../../src/lib/ChevronIcon.svelte'; import ClearIcon from '../../src/lib/ClearIcon.svelte'; +import LoadingIcon from '../../src/lib/LoadingIcon.svelte'; import TestIcon from './TestIcon.svelte'; import TestClearIcon from './TestClearIcon.svelte'; import SelectDefault from './Select/Select--default.svelte' @@ -1177,19 +1178,20 @@ test('placeholder should be prop value', async (t) => { select.$destroy(); }); -test('should display spinner when waiting is enabled', async (t) => { +test('should display loading icon when waiting is enabled', async (t) => { const div = document.createElement('div'); document.body.appendChild(div); const select = new Select({ target, props: { + LoadingIcon, items, isWaiting: true } }); - t.ok(document.querySelector('.spinner')); + t.ok(document.querySelector('.loading')); select.$destroy(); }); From d0293288a5b37786679c548eb72bf22729325f13 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 14 Oct 2021 07:06:22 +1100 Subject: [PATCH 286/635] =?UTF-8?q?fun=20with=20tailwind=20=F0=9F=92=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierrc | 2 +- CHANGELOG.md | 2 + package-lock.json | 4102 +++++++++++++++++- package.json | 8 +- postcss.config.cjs | 7 + src/lib/Select.svelte | 279 +- src/routes/index.svelte | 99 +- svelte.config.js | 7 +- tailwind.config.cjs | 4 + test/src/Select/Select--default.svelte | 2 +- test/src/Select/Select--multiSelected.svelte | 14 +- test/src/index.js | 112 +- yarn.lock | 489 --- 13 files changed, 4203 insertions(+), 924 deletions(-) create mode 100644 postcss.config.cjs create mode 100644 tailwind.config.cjs delete mode 100644 yarn.lock diff --git a/.prettierrc b/.prettierrc index aead5a01..e3f4c906 100644 --- a/.prettierrc +++ b/.prettierrc @@ -10,6 +10,6 @@ } } ], - "svelteSortOrder": "scripts-styles-markup", + "svelteSortOrder": "scripts-markup-styles", "svelteBracketNewLine": false } diff --git a/CHANGELOG.md b/CHANGELOG.md index 7be0ae85..79b14ed7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## unreleased +* bye bye yarn +* selectContainer and other CSS class names updated, selectContainer -> select-container for example * LoadingIcon prop added, must be imported to have a spinner/loader * CSS props updates. Added .icons and removed some css vars * ClearIcon and ChevronIcon no longer included by default diff --git a/package-lock.json b/package-lock.json index e05960ad..c37c137a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,12 @@ "version": "5.0.0-alpha.1", "license": "ISC", "devDependencies": { - "@sveltejs/kit": "1.0.0-next.173", + "@sveltejs/kit": "1.0.0-next.180", + "autoprefixer": "^10.3.7", + "cross-env": "^7.0.3", "find-in-files": "^0.5.0", + "postcss-cli": "^9.0.1", + "postcss-import": "^14.0.2", "prettier": "~2.2.1", "prettier-plugin-svelte": "^2.2.0", "rollup": "^2.41.2", @@ -19,11 +23,145 @@ "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^1.0.14", "svelte": "^3.43.0", + "svelte-preprocess": "^4.9.8", "svelte2tsx": "^0.4.5", + "tailwindcss": "^2.2.16", "tape-modern": "^1.1.1", "typescript": "^4.4.2" } }, + "node_modules/@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.20", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", @@ -51,15 +189,15 @@ "license": "MIT" }, "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.173", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.173.tgz", - "integrity": "sha512-gOnRwCw9O+dXfpUe8GO9PEe20TWiIpgIDjG3zabCjMUV2XLpOsvPCO9j65xCPce00RljQGBuwn+NTYKteg2jvw==", + "version": "1.0.0-next.180", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.180.tgz", + "integrity": "sha512-SbqZqgtw1KnyV1CXqOLQUQTxOksONvNUGeyalAQem8XHPiV7iNslPhXbTBxHyBhD3rvY4Nzd1kPp9/zCVeWsog==", "dev": true, "dependencies": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.24", + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.26", "cheap-watch": "^1.0.4", "sade": "^1.7.4", - "vite": "^2.5.7" + "vite": "^2.6.3" }, "bin": { "svelte-kit": "svelte-kit.js" @@ -72,9 +210,9 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.24.tgz", - "integrity": "sha512-b+n3jcLpk2j/25APQbk5ejCyd0faYTB2bOxR3gY0LX3MFGgdiL8zdf3/aawcPSxLdbL73YVlxNBIATGuvq03uQ==", + "version": "1.0.0-next.27", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.27.tgz", + "integrity": "sha512-hiau09LA/5eGGFTxXtRPIxKmWw8By8t+Vw+uvgKYeUf+4zJLe/Q5yX3Przf2CmW0J6fPi4NWWIeYsLrOd78a2w==", "dev": true, "dependencies": { "@rollup/pluginutils": "^4.1.1", @@ -90,7 +228,7 @@ "peerDependencies": { "diff-match-patch": "^1.0.5", "svelte": "^3.34.0", - "vite": "^2.5.3" + "vite": "^2.6.0" }, "peerDependenciesMeta": { "diff-match-patch": { @@ -105,6 +243,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.5.tgz", + "integrity": "sha512-LOnASQoeNZMkzexRuyqcBBDZ6rS+rQxUMkmj5A0PkhhiSZivLIuz6Hxyr1mkGoEZEkk66faROmpMi4fFkrKsBA==", + "dev": true + }, "node_modules/@types/resolve": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", @@ -115,6 +265,129 @@ "@types/node": "*" } }, + "node_modules/@types/sass": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz", + "integrity": "sha512-iZUcRrGuz/Tbg3loODpW7vrQJkUtpY2fFSf4ELqqkApcS2TkZ1msk7ie8iZPB86lDOP8QOTTmuvWjc5S0R9OjQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", + "dev": true + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/autoprefixer": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.7.tgz", + "integrity": "sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==", + "dev": true, + "dependencies": { + "browserslist": "^4.17.3", + "caniuse-lite": "^1.0.30001264", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^0.2.1", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -122,6 +395,15 @@ "dev": true, "license": "MIT" }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -133,6 +415,50 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", + "escalade": "^3.1.1", + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/builtin-modules": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", @@ -146,101 +472,719 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cheap-watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.4.tgz", - "integrity": "sha512-QR/9FrtRL5fjfUJBhAKCdi0lSRQ3rVRRum3GF9wDKp2TJbEIMGhUEr2yU8lORzm9Isdjx7/k9S0DFDx+z5VGtw==", + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=6" + } }, - "node_modules/console-clear": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", - "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "node_modules/caniuse-lite": { + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/dedent-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", - "integrity": "sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU=", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.12.29", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", - "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "node_modules/cheap-watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.4.tgz", + "integrity": "sha512-QR/9FrtRL5fjfUJBhAKCdi0lSRQ3rVRRum3GF9wDKp2TJbEIMGhUEr2yU8lORzm9Isdjx7/k9S0DFDx+z5VGtw==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=8" + } }, - "node_modules/find": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", - "integrity": "sha1-yGyHrxqxjyIrvjjeyGy8dg0Wpvs=", + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "dependencies": { - "traverse-chain": "~0.1.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/find-in-files": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/find-in-files/-/find-in-files-0.5.0.tgz", - "integrity": "sha512-VraTc6HdtdSHmAp0yJpAy20yPttGKzyBWc7b7FPnnsX9TOgmKx0g9xajizpF/iuu4IvNK4TP0SpyBT9zAlwG+g==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "license": "MIT", "dependencies": { - "find": "^0.1.5", - "q": "^1.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "node_modules/color": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/color/-/color-4.0.1.tgz", + "integrity": "sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==", "dev": true, - "license": "ISC" + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.6.0" + } }, - "node_modules/fsevents": { - "version": "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "license": "MIT" + }, + "node_modules/console-clear": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", + "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU=", + "dev": true + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.3.864", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", + "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.4.tgz", + "integrity": "sha512-wMA5eUwpavTBiNl+It6j8OQuKVh69l6z4DKDLzoTIqC+gChnPpcmqdA8WNHptUHRnfyML+mKEQPlW7Mybj8gHg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.13.4", + "esbuild-darwin-64": "0.13.4", + "esbuild-darwin-arm64": "0.13.4", + "esbuild-freebsd-64": "0.13.4", + "esbuild-freebsd-arm64": "0.13.4", + "esbuild-linux-32": "0.13.4", + "esbuild-linux-64": "0.13.4", + "esbuild-linux-arm": "0.13.4", + "esbuild-linux-arm64": "0.13.4", + "esbuild-linux-mips64le": "0.13.4", + "esbuild-linux-ppc64le": "0.13.4", + "esbuild-openbsd-64": "0.13.4", + "esbuild-sunos-64": "0.13.4", + "esbuild-windows-32": "0.13.4", + "esbuild-windows-64": "0.13.4", + "esbuild-windows-arm64": "0.13.4" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.4.tgz", + "integrity": "sha512-elDJt+jNyoHFId0/dKsuVYUPke3EcquIyUwzJCH17a3ERglN3A9aMBI5zbz+xNZ+FbaDNdpn0RaJHCFLbZX+fA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/esbuild-darwin-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.4.tgz", + "integrity": "sha512-zJQGyHRAdZUXlRzbN7W+7ykmEiGC+bq3Gc4GxKYjjWTgDRSEly98ym+vRNkDjXwXYD3gGzSwvH35+MiHAtWvLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.4.tgz", + "integrity": "sha512-r8oYvAtqSGq8HNTZCAx4TdLE7jZiGhX9ooGi5AQAey37MA6XNaP8ZNlw9OCpcgpx3ryU2WctXwIqPzkHO7a8dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.4.tgz", + "integrity": "sha512-u9DRGkn09EN8+lCh6z7FKle7awi17PJRBuAKdRNgSo5ZrH/3m+mYaJK2PR2URHMpAfXiwJX341z231tSdVe3Yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.4.tgz", + "integrity": "sha512-q3B2k68Uf6gfjATjcK16DqxvjqRQkHL8aPoOfj4op+lSqegdXvBacB1d8jw8PxbWJ8JHpdTLdAVUYU80kotQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-linux-32": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.4.tgz", + "integrity": "sha512-UUYJPHSiKAO8KoN3Ls/iZtgDLZvK5HarES96aolDPWZnq9FLx4dIHM/x2z4Rxv9IYqQ/DxlPoE2Co1UPBIYYeA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.4.tgz", + "integrity": "sha512-+RnohAKiiUW4UHLGRkNR1AnENW1gCuDWuygEtd4jxTNPIoeC7lbXGor7rtgjj9AdUzFgOEvAXyNNX01kJ8NueQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.4.tgz", + "integrity": "sha512-BH5gKve4jglS7UPSsfwHSX79I5agC/lm4eKoRUEyo8lwQs89frQSRp2Xup+6SFQnxt3md5EsKcd2Dbkqeb3gPA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.4.tgz", + "integrity": "sha512-+A188cAdd6QuSRxMIwRrWLjgphQA0LDAQ/ECVlrPVJwnx+1i64NjDZivoqPYLOTkSPIKntiWwMhhf0U5/RrPHQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.4.tgz", + "integrity": "sha512-0xkwtPaUkG5xMTFGaQPe1AadSe5QAiQuD4Gix1O9k5Xo/U8xGIkw9UFUTvfEUeu71vFb6ZgsIacfP1NLoFjWNw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.4.tgz", + "integrity": "sha512-E1+oJPP7A+j23GPo3CEpBhGwG1bni4B8IbTA3/3rvzjURwUMZdcN3Fhrz24rnjzdLSHmULtOE4VsbT42h1Om4Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.4.tgz", + "integrity": "sha512-xEkI1o5HYxDzbv9jSox0EsDxpwraG09SRiKKv0W8pH6O3bt+zPSlnoK7+I7Q69tkvONkpIq5n2o+c55uq0X7cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/esbuild-sunos-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.4.tgz", + "integrity": "sha512-bjXUMcODMnB6hQicLBBmmnBl7OMDyVpFahKvHGXJfDChIi5udiIRKCmFUFIRn+AUAKVlfrofRKdyPC7kBsbvGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ] + }, + "node_modules/esbuild-windows-32": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.4.tgz", + "integrity": "sha512-z4CH07pfyVY0XF98TCsGmLxKCl0kyvshKDbdpTekW9f2d+dJqn5mmoUyWhpSVJ0SfYWJg86FoD9nMbbaMVyGdg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.4.tgz", + "integrity": "sha512-uVL11vORRPjocGLYam67rwFLd0LvkrHEs+JG+1oJN4UD9MQmNGZPa4gBHo6hDpF+kqRJ9kXgQSeDqUyRy0tj/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.4.tgz", + "integrity": "sha512-vA6GLvptgftRcDcWngD5cMlL4f4LbL8JjU2UMT9yJ0MT5ra6hdZNFWnOeOoEtY4GtJ6OjZ0i+81sTqhAB0fMkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "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" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", + "integrity": "sha1-yGyHrxqxjyIrvjjeyGy8dg0Wpvs=", + "dev": true, + "dependencies": { + "traverse-chain": "~0.1.0" + } + }, + "node_modules/find-in-files": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/find-in-files/-/find-in-files-0.5.0.tgz", + "integrity": "sha512-VraTc6HdtdSHmAp0yJpAy20yPttGKzyBWc7b7FPnnsX9TOgmKx0g9xajizpF/iuu4IvNK4TP0SpyBT9zAlwG+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "find": "^0.1.5", + "q": "^1.0.1" + } + }, + "node_modules/fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, @@ -260,6 +1204,15 @@ "dev": true, "license": "MIT" }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", @@ -269,6 +1222,18 @@ "node": ">=4" } }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -284,23 +1249,155 @@ "path-is-absolute": "^1.0.0" }, "engines": { - "node": "*" + "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", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", + "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.8", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/import-fresh/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", "dev": true, - "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, "node_modules/inflight": { @@ -321,6 +1418,38 @@ "dev": true, "license": "ISC" }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, "node_modules/is-core-module": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", @@ -334,6 +1463,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -341,6 +1500,45 @@ "dev": true, "license": "MIT" }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/kleur": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", @@ -350,6 +1548,21 @@ "node": ">=6" } }, + "node_modules/lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "node_modules/local-access": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", @@ -359,6 +1572,48 @@ "node": ">=6" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "node_modules/lodash.forown": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", + "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "dev": true + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -377,6 +1632,28 @@ "sourcemap-codec": "^1.4.4" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", @@ -390,6 +1667,15 @@ "node": ">=4.0.0" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -403,6 +1689,36 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/modern-normalize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", + "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mri": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", @@ -416,104 +1732,382 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.29", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.29.tgz", + "integrity": "sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==", "dev": true, - "license": "MIT" + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "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==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/nanocolors": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", - "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", "dev": true }, - "node_modules/nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "dev": true, + "dependencies": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-cli": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.0.1.tgz", + "integrity": "sha512-zO160OBaAZBFUWO+QZIzEKMjnPIc5c61dMg1d7xafblh9cxbNb6s16ahJuP91PcVsu//gqr7BKllJxRiRDsSYw==", "dev": true, + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^10.0.0", + "get-stdin": "^9.0.0", + "globby": "^12.0.0", + "nanocolors": "^0.2.11", + "postcss-load-config": "^3.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^4.0.0", + "yargs": "^17.0.0" + }, "bin": { - "nanoid": "bin/nanoid.cjs" + "postcss": "index.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=12" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "node_modules/postcss-cli/node_modules/nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", + "dev": true + }, + "node_modules/postcss-cli/node_modules/yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "dev": true, "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", "dev": true, - "license": "ISC", "dependencies": { - "wrappy": "1" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "node_modules/postcss-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", + "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", "dev": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "camelcase-css": "^2.0.1", + "postcss": "^8.1.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, - "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/postcss-load-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", + "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", "dev": true, - "license": "MIT", + "dependencies": { + "import-cwd": "^3.0.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", "dev": true, - "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, "engines": { - "node": ">=8.6" + "node": ">=12.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/postcss": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.7.tgz", - "integrity": "sha512-9SaY7nnyQ63/WittqZYAvkkYPyKxchMKH71UDzeTmWuLSvxTRpeEeABZAzlCi55cuGcoFyoV/amX2BdsafQidQ==", + "node_modules/postcss-reporter": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.3.tgz", + "integrity": "sha512-WoYHwtStmiR74UQDO3vZMbkhOBXSXyteWnhMCVbAK6KRRKLTS0EnTZxOxvbUEnQiMZ+3xRG04x41HhHnLBtQfA==", "dev": true, "dependencies": { - "nanocolors": "^0.1.5", - "nanoid": "^3.1.25", - "source-map-js": "^0.6.2" + "lodash.difference": "^4.5.0", + "lodash.forown": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.groupby": "^4.6.0", + "lodash.sortby": "^4.7.0", + "nanocolors": "^0.2.6" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-reporter/node_modules/nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", + "dev": true + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, "node_modules/prettier": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", @@ -536,6 +2130,30 @@ "svelte": "^3.2.0" } }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/purgecss": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.0.3.tgz", + "integrity": "sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==", + "dev": true, + "dependencies": { + "commander": "^6.0.0", + "glob": "^7.0.0", + "postcss": "^8.2.1", + "postcss-selector-parser": "^6.0.2" + }, + "bin": { + "purgecss": "bin/purgecss.js" + } + }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -547,6 +2165,84 @@ "teleport": ">=0.2.0" } }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dev": true, + "dependencies": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + } + }, + "node_modules/reduce-css-calc/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-relative": { "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", @@ -568,12 +2264,57 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rollup": { - "version": "2.41.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.41.2.tgz", - "integrity": "sha512-6u8fJJXJx6fmvKrAC9DHYZgONvSkz8S9b/VFBjoQ6dkKdHyPpPbpqiNl2Bao9XBzDHpq672X6sGZ9G1ZBqAHMg==", + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", "dev": true, - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -581,7 +2322,7 @@ "node": ">=10.0.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-cleaner": { @@ -674,6 +2415,29 @@ "estree-walker": "^0.6.1" } }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/sade": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", @@ -686,6 +2450,30 @@ "node": ">= 6" } }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/semiver": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", @@ -695,6 +2483,42 @@ "node": ">=6" } }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, "node_modules/sirv": { "version": "1.0.17", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", @@ -740,6 +2564,33 @@ "node": ">=6" } }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + }, + "bin": { + "sorcery": "bin/index.js" + } + }, "node_modules/source-map-js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", @@ -755,6 +2606,44 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/svelte": { "version": "3.43.0", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.43.0.tgz", @@ -773,6 +2662,72 @@ "svelte": ">=3.19.0" } }, + "node_modules/svelte-preprocess": { + "version": "4.9.8", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.9.8.tgz", + "integrity": "sha512-EQS/oRZzMtYdAprppZxY3HcysKh11w54MgA63ybtL+TAZ4hVqYOnhw41JVJjWN9dhPnNjjLzvbZ2tMhTsla1Og==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 9.11.2" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.54.7", + "sugarss": "^2.0.0", + "svelte": "^3.23.0", + "typescript": "^3.9.5 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/svelte2tsx": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.4.5.tgz", @@ -787,6 +2742,69 @@ "typescript": "^4.1.2" } }, + "node_modules/tailwindcss": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.16.tgz", + "integrity": "sha512-EireCtpQyyJ4Xz8NYzHafBoy4baCOO96flM0+HgtsFcIQ9KFy/YBK3GEtlnD+rXen0e4xm8t3WiUcKBJmN6yjg==", + "dev": true, + "dependencies": { + "arg": "^5.0.1", + "bytes": "^3.0.0", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color": "^4.0.1", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "glob-parent": "^6.0.1", + "html-tags": "^3.1.0", + "is-color-stop": "^1.1.0", + "is-glob": "^4.0.1", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.1.0", + "node-emoji": "^1.11.0", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^3.0.3", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.6", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "purgecss": "^4.0.3", + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0", + "tmp": "^0.2.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/tape-modern": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tape-modern/-/tape-modern-1.1.1.tgz", @@ -803,6 +2821,30 @@ "node": ">=4" } }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", @@ -838,16 +2880,31 @@ "node": ">=4.2.0" } }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "node_modules/vite": { - "version": "2.5.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.10.tgz", - "integrity": "sha512-0ObiHTi5AHyXdJcvZ67HMsDgVpjT5RehvVKv6+Q0jFZ7zDI28PF5zK9mYz2avxdA+4iJMdwCz6wnGNnn4WX5Gg==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.6.5.tgz", + "integrity": "sha512-vavXMChDUb4Oh4YunrK9BrH5Ox74cu0eOp0VuyI/iqFz1FqbWD72So2c9I87lLL2n0+6tFPV5ijow60KrtxuZg==", "dev": true, "dependencies": { - "esbuild": "^0.12.17", - "postcss": "^8.3.6", + "esbuild": "^0.13.2", + "postcss": "^8.3.8", "resolve": "^1.20.0", - "rollup": "^2.38.5" + "rollup": "^2.57.0" }, "bin": { "vite": "bin/vite.js" @@ -857,6 +2914,54 @@ }, "optionalDependencies": { "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -865,9 +2970,149 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } } }, "dependencies": { + "@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@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==", + "dev": true, + "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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@polka/url": { "version": "1.0.0-next.20", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz", @@ -892,73 +3137,315 @@ } } }, - "@sveltejs/kit": { - "version": "1.0.0-next.173", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.173.tgz", - "integrity": "sha512-gOnRwCw9O+dXfpUe8GO9PEe20TWiIpgIDjG3zabCjMUV2XLpOsvPCO9j65xCPce00RljQGBuwn+NTYKteg2jvw==", + "@sveltejs/kit": { + "version": "1.0.0-next.180", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.180.tgz", + "integrity": "sha512-SbqZqgtw1KnyV1CXqOLQUQTxOksONvNUGeyalAQem8XHPiV7iNslPhXbTBxHyBhD3rvY4Nzd1kPp9/zCVeWsog==", + "dev": true, + "requires": { + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.26", + "cheap-watch": "^1.0.4", + "sade": "^1.7.4", + "vite": "^2.6.3" + } + }, + "@sveltejs/vite-plugin-svelte": { + "version": "1.0.0-next.27", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.27.tgz", + "integrity": "sha512-hiau09LA/5eGGFTxXtRPIxKmWw8By8t+Vw+uvgKYeUf+4zJLe/Q5yX3Przf2CmW0J6fPi4NWWIeYsLrOd78a2w==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.1.1", + "debug": "^4.3.2", + "kleur": "^4.1.4", + "magic-string": "^0.25.7", + "require-relative": "^0.8.7", + "svelte-hmr": "^0.14.7" + } + }, + "@types/node": { + "version": "10.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", + "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/pug": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.5.tgz", + "integrity": "sha512-LOnASQoeNZMkzexRuyqcBBDZ6rS+rQxUMkmj5A0PkhhiSZivLIuz6Hxyr1mkGoEZEkk66faROmpMi4fFkrKsBA==", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/sass": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz", + "integrity": "sha512-iZUcRrGuz/Tbg3loODpW7vrQJkUtpY2fFSf4ELqqkApcS2TkZ1msk7ie8iZPB86lDOP8QOTTmuvWjc5S0R9OjQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", + "dev": true + }, + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, + "autoprefixer": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.7.tgz", + "integrity": "sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==", + "dev": true, + "requires": { + "browserslist": "^4.17.3", + "caniuse-lite": "^1.0.30001264", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^0.2.1", + "postcss-value-parser": "^4.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "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", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", + "escalade": "^3.1.1", + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cheap-watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.4.tgz", + "integrity": "sha512-QR/9FrtRL5fjfUJBhAKCdi0lSRQ3rVRRum3GF9wDKp2TJbEIMGhUEr2yU8lORzm9Isdjx7/k9S0DFDx+z5VGtw==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "requires": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.24", - "cheap-watch": "^1.0.4", - "sade": "^1.7.4", - "vite": "^2.5.7" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" } }, - "@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.24.tgz", - "integrity": "sha512-b+n3jcLpk2j/25APQbk5ejCyd0faYTB2bOxR3gY0LX3MFGgdiL8zdf3/aawcPSxLdbL73YVlxNBIATGuvq03uQ==", + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "@rollup/pluginutils": "^4.1.1", - "debug": "^4.3.2", - "kleur": "^4.1.4", - "magic-string": "^0.25.7", - "require-relative": "^0.8.7", - "svelte-hmr": "^0.14.7" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "@types/node": { - "version": "10.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", - "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==", - "dev": true + "color": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/color/-/color-4.0.1.tgz", + "integrity": "sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==", + "dev": true, + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.6.0" + } }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "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==", "dev": true, "requires": { - "@types/node": "*" + "color-name": "~1.1.4" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "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==", "dev": true }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true - }, - "cheap-watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cheap-watch/-/cheap-watch-1.0.4.tgz", - "integrity": "sha512-QR/9FrtRL5fjfUJBhAKCdi0lSRQ3rVRRum3GF9wDKp2TJbEIMGhUEr2yU8lORzm9Isdjx7/k9S0DFDx+z5VGtw==", + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "concat-map": { @@ -973,6 +3460,57 @@ "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", "dev": true }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -988,10 +3526,229 @@ "integrity": "sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU=", "dev": true }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.864", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", + "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, "esbuild": { - "version": "0.12.29", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", - "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.4.tgz", + "integrity": "sha512-wMA5eUwpavTBiNl+It6j8OQuKVh69l6z4DKDLzoTIqC+gChnPpcmqdA8WNHptUHRnfyML+mKEQPlW7Mybj8gHg==", + "dev": true, + "requires": { + "esbuild-android-arm64": "0.13.4", + "esbuild-darwin-64": "0.13.4", + "esbuild-darwin-arm64": "0.13.4", + "esbuild-freebsd-64": "0.13.4", + "esbuild-freebsd-arm64": "0.13.4", + "esbuild-linux-32": "0.13.4", + "esbuild-linux-64": "0.13.4", + "esbuild-linux-arm": "0.13.4", + "esbuild-linux-arm64": "0.13.4", + "esbuild-linux-mips64le": "0.13.4", + "esbuild-linux-ppc64le": "0.13.4", + "esbuild-openbsd-64": "0.13.4", + "esbuild-sunos-64": "0.13.4", + "esbuild-windows-32": "0.13.4", + "esbuild-windows-64": "0.13.4", + "esbuild-windows-arm64": "0.13.4" + } + }, + "esbuild-android-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.4.tgz", + "integrity": "sha512-elDJt+jNyoHFId0/dKsuVYUPke3EcquIyUwzJCH17a3ERglN3A9aMBI5zbz+xNZ+FbaDNdpn0RaJHCFLbZX+fA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.4.tgz", + "integrity": "sha512-zJQGyHRAdZUXlRzbN7W+7ykmEiGC+bq3Gc4GxKYjjWTgDRSEly98ym+vRNkDjXwXYD3gGzSwvH35+MiHAtWvLA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.4.tgz", + "integrity": "sha512-r8oYvAtqSGq8HNTZCAx4TdLE7jZiGhX9ooGi5AQAey37MA6XNaP8ZNlw9OCpcgpx3ryU2WctXwIqPzkHO7a8dg==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.4.tgz", + "integrity": "sha512-u9DRGkn09EN8+lCh6z7FKle7awi17PJRBuAKdRNgSo5ZrH/3m+mYaJK2PR2URHMpAfXiwJX341z231tSdVe3Yw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.4.tgz", + "integrity": "sha512-q3B2k68Uf6gfjATjcK16DqxvjqRQkHL8aPoOfj4op+lSqegdXvBacB1d8jw8PxbWJ8JHpdTLdAVUYU80kotQXA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.4.tgz", + "integrity": "sha512-UUYJPHSiKAO8KoN3Ls/iZtgDLZvK5HarES96aolDPWZnq9FLx4dIHM/x2z4Rxv9IYqQ/DxlPoE2Co1UPBIYYeA==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.4.tgz", + "integrity": "sha512-+RnohAKiiUW4UHLGRkNR1AnENW1gCuDWuygEtd4jxTNPIoeC7lbXGor7rtgjj9AdUzFgOEvAXyNNX01kJ8NueQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.4.tgz", + "integrity": "sha512-BH5gKve4jglS7UPSsfwHSX79I5agC/lm4eKoRUEyo8lwQs89frQSRp2Xup+6SFQnxt3md5EsKcd2Dbkqeb3gPA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.4.tgz", + "integrity": "sha512-+A188cAdd6QuSRxMIwRrWLjgphQA0LDAQ/ECVlrPVJwnx+1i64NjDZivoqPYLOTkSPIKntiWwMhhf0U5/RrPHQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.4.tgz", + "integrity": "sha512-0xkwtPaUkG5xMTFGaQPe1AadSe5QAiQuD4Gix1O9k5Xo/U8xGIkw9UFUTvfEUeu71vFb6ZgsIacfP1NLoFjWNw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.4.tgz", + "integrity": "sha512-E1+oJPP7A+j23GPo3CEpBhGwG1bni4B8IbTA3/3rvzjURwUMZdcN3Fhrz24rnjzdLSHmULtOE4VsbT42h1Om4Q==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.4.tgz", + "integrity": "sha512-xEkI1o5HYxDzbv9jSox0EsDxpwraG09SRiKKv0W8pH6O3bt+zPSlnoK7+I7Q69tkvONkpIq5n2o+c55uq0X7cw==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.4.tgz", + "integrity": "sha512-bjXUMcODMnB6hQicLBBmmnBl7OMDyVpFahKvHGXJfDChIi5udiIRKCmFUFIRn+AUAKVlfrofRKdyPC7kBsbvGQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.4.tgz", + "integrity": "sha512-z4CH07pfyVY0XF98TCsGmLxKCl0kyvshKDbdpTekW9f2d+dJqn5mmoUyWhpSVJ0SfYWJg86FoD9nMbbaMVyGdg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.4.tgz", + "integrity": "sha512-uVL11vORRPjocGLYam67rwFLd0LvkrHEs+JG+1oJN4UD9MQmNGZPa4gBHo6hDpF+kqRJ9kXgQSeDqUyRy0tj/Q==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.4.tgz", + "integrity": "sha512-vA6GLvptgftRcDcWngD5cMlL4f4LbL8JjU2UMT9yJ0MT5ra6hdZNFWnOeOoEtY4GtJ6OjZ0i+81sTqhAB0fMkg==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "estree-walker": { @@ -1000,6 +3757,37 @@ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "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" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", @@ -1019,6 +3807,23 @@ "q": "^1.0.1" } }, + "fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "dev": true + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1038,12 +3843,24 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", "dev": true }, + "get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -1058,6 +3875,35 @@ "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", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", + "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.8", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1067,6 +3913,78 @@ "function-bind": "^1.1.1" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "requires": { + "import-from": "^3.0.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1083,6 +4001,35 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, "is-core-module": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", @@ -1092,24 +4039,133 @@ "has": "^1.0.3" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "kleur": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", "dev": true }, + "lilconfig": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", + "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "local-access": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz", "integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==", "dev": true }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "lodash.forown": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", + "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "dev": true + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -1128,12 +4184,34 @@ "sourcemap-codec": "^1.4.4" } }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "mime": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1143,6 +4221,27 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "modern-normalize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", + "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", + "dev": true + }, "mri": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", @@ -1155,16 +4254,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "nanocolors": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", - "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", - "dev": true - }, "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.1.29", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.29.tgz", + "integrity": "sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==", "dev": true }, "no-case": { @@ -1177,6 +4270,39 @@ "tslib": "^2.0.3" } }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1186,6 +4312,27 @@ "wrappy": "1" } }, + "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==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -1202,29 +4349,175 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "postcss": { - "version": "8.3.7", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.7.tgz", - "integrity": "sha512-9SaY7nnyQ63/WittqZYAvkkYPyKxchMKH71UDzeTmWuLSvxTRpeEeABZAzlCi55cuGcoFyoV/amX2BdsafQidQ==", + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", "dev": true, "requires": { - "nanocolors": "^0.1.5", - "nanoid": "^3.1.25", + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", "source-map-js": "^0.6.2" } }, + "postcss-cli": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.0.1.tgz", + "integrity": "sha512-zO160OBaAZBFUWO+QZIzEKMjnPIc5c61dMg1d7xafblh9cxbNb6s16ahJuP91PcVsu//gqr7BKllJxRiRDsSYw==", + "dev": true, + "requires": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^10.0.0", + "get-stdin": "^9.0.0", + "globby": "^12.0.0", + "nanocolors": "^0.2.11", + "postcss-load-config": "^3.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^4.0.0", + "yargs": "^17.0.0" + }, + "dependencies": { + "nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", + "dev": true + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", + "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^8.1.6" + } + }, + "postcss-load-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", + "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "dev": true, + "requires": { + "import-cwd": "^3.0.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.6" + } + }, + "postcss-reporter": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.3.tgz", + "integrity": "sha512-WoYHwtStmiR74UQDO3vZMbkhOBXSXyteWnhMCVbAK6KRRKLTS0EnTZxOxvbUEnQiMZ+3xRG04x41HhHnLBtQfA==", + "dev": true, + "requires": { + "lodash.difference": "^4.5.0", + "lodash.forown": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.groupby": "^4.6.0", + "lodash.sortby": "^4.7.0", + "nanocolors": "^0.2.6" + }, + "dependencies": { + "nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, "prettier": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", @@ -1238,12 +4531,84 @@ "dev": true, "requires": {} }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "purgecss": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.0.3.tgz", + "integrity": "sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==", + "dev": true, + "requires": { + "commander": "^6.0.0", + "glob": "^7.0.0", + "postcss": "^8.2.1", + "postcss-selector-parser": "^6.0.2" + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, "require-relative": { "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", @@ -1260,13 +4625,46 @@ "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "rollup": { - "version": "2.41.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.41.2.tgz", - "integrity": "sha512-6u8fJJXJx6fmvKrAC9DHYZgONvSkz8S9b/VFBjoQ6dkKdHyPpPbpqiNl2Bao9XBzDHpq672X6sGZ9G1ZBqAHMg==", + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", "dev": true, "requires": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "rollup-plugin-cleaner": { @@ -1330,6 +4728,15 @@ "estree-walker": "^0.6.1" } }, + "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==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "sade": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", @@ -1339,12 +4746,67 @@ "mri": "^1.1.0" } }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=", + "dev": true, + "requires": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "semiver": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", "dev": true }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, "sirv": { "version": "1.0.17", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", @@ -1380,6 +4842,24 @@ } } }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" + } + }, "source-map-js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", @@ -1392,6 +4872,35 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "svelte": { "version": "3.43.0", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.43.0.tgz", @@ -1405,6 +4914,20 @@ "dev": true, "requires": {} }, + "svelte-preprocess": { + "version": "4.9.8", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.9.8.tgz", + "integrity": "sha512-EQS/oRZzMtYdAprppZxY3HcysKh11w54MgA63ybtL+TAZ4hVqYOnhw41JVJjWN9dhPnNjjLzvbZ2tMhTsla1Og==", + "dev": true, + "requires": { + "@types/pug": "^2.0.4", + "@types/sass": "^1.16.0", + "detect-indent": "^6.0.0", + "magic-string": "^0.25.7", + "sorcery": "^0.10.0", + "strip-indent": "^3.0.0" + } + }, "svelte2tsx": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.4.5.tgz", @@ -1415,6 +4938,57 @@ "pascal-case": "^3.1.1" } }, + "tailwindcss": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.16.tgz", + "integrity": "sha512-EireCtpQyyJ4Xz8NYzHafBoy4baCOO96flM0+HgtsFcIQ9KFy/YBK3GEtlnD+rXen0e4xm8t3WiUcKBJmN6yjg==", + "dev": true, + "requires": { + "arg": "^5.0.1", + "bytes": "^3.0.0", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color": "^4.0.1", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "glob-parent": "^6.0.1", + "html-tags": "^3.1.0", + "is-color-stop": "^1.1.0", + "is-glob": "^4.0.1", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.1.0", + "node-emoji": "^1.11.0", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^3.0.3", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.6", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "purgecss": "^4.0.3", + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0", + "tmp": "^0.2.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, "tape-modern": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tape-modern/-/tape-modern-1.1.1.tgz", @@ -1427,6 +5001,24 @@ "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", "dev": true }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", @@ -1451,17 +5043,49 @@ "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", "dev": true }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "vite": { - "version": "2.5.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.10.tgz", - "integrity": "sha512-0ObiHTi5AHyXdJcvZ67HMsDgVpjT5RehvVKv6+Q0jFZ7zDI28PF5zK9mYz2avxdA+4iJMdwCz6wnGNnn4WX5Gg==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.6.5.tgz", + "integrity": "sha512-vavXMChDUb4Oh4YunrK9BrH5Ox74cu0eOp0VuyI/iqFz1FqbWD72So2c9I87lLL2n0+6tFPV5ijow60KrtxuZg==", "dev": true, "requires": { - "esbuild": "^0.12.17", + "esbuild": "^0.13.2", "fsevents": "~2.3.2", - "postcss": "^8.3.6", + "postcss": "^8.3.8", "resolve": "^1.20.0", - "rollup": "^2.38.5" + "rollup": "^2.57.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { @@ -1469,6 +5093,30 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true } } } diff --git a/package.json b/package.json index dea3042a..9926cffc 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,12 @@ "package": "svelte-kit package" }, "devDependencies": { - "@sveltejs/kit": "1.0.0-next.173", + "@sveltejs/kit": "1.0.0-next.180", + "autoprefixer": "^10.3.7", + "cross-env": "^7.0.3", "find-in-files": "^0.5.0", + "postcss-cli": "^9.0.1", + "postcss-import": "^14.0.2", "prettier": "~2.2.1", "prettier-plugin-svelte": "^2.2.0", "rollup": "^2.41.2", @@ -24,7 +28,9 @@ "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^1.0.14", "svelte": "^3.43.0", + "svelte-preprocess": "^4.9.8", "svelte2tsx": "^0.4.5", + "tailwindcss": "^2.2.16", "tape-modern": "^1.1.1", "typescript": "^4.4.2" }, diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 00000000..54d66bf1 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,7 @@ +module.exports = { + plugins: [ + require('postcss-import'), + require('tailwindcss'), + require('autoprefixer'), + ], +}; diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index ebf8de14..12a38e05 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -8,6 +8,8 @@ const dispatch = createEventDispatcher(); + export { containerClasses as class }; + export let id = null; export let container = undefined; export let input = undefined; @@ -77,9 +79,7 @@ export let Icon = undefined; export let iconProps = {}; export let showChevron = false; - export let containerClasses = ''; export let listOffset = 5; - export let Item = _Item; export let List = _List; export let Selection = _Selection; @@ -164,6 +164,7 @@ ); } + let containerClasses = 'select-container'; let activeValue; let prev_value; let prev_filterText; @@ -391,8 +392,7 @@ $: hasValue = isMulti ? value && value.length > 1 : value; $: _showChevron = showChevron && ChevronIcon; $: showSelectedItem = hasValue && filterText.length === 0; - $: showClear = - showSelectedItem && isClearable && !isDisabled && !isWaiting; + $: showClear = showSelectedItem && isClearable && !isDisabled && !isWaiting; $: placeholderText = placeholderAlwaysShow && isMulti ? placeholder @@ -674,8 +674,118 @@ ); + + +
+ + {#if isFocused} + {ariaSelection} + + {ariaContext} + + {/if} + + + {#if Icon} + + {/if} + + {#if showMultiSelect} + + {/if} + + + + {#if !isMulti && showSelectedItem} +
+ +
+ {/if} + +
+ {#if showClear} + + {/if} + + {#if _showChevron} + + {/if} + + {#if isWaiting} + + {/if} +
+ + {#if listOpen} + + {/if} + + {#if !isMulti || (isMulti && !showMultiSelect)} + + {/if} + + {#if isMulti && showMultiSelect} + {#each value as item} + + {/each} + {/if} +
+ - - - -
- - {#if isFocused} - {ariaSelection} - - {ariaContext} - - {/if} - - - {#if Icon} - - {/if} - - {#if showMultiSelect} - - {/if} - - - - {#if !isMulti && showSelectedItem} -
- -
- {/if} - -
- {#if showClear} - - {/if} - - {#if _showChevron} - - {/if} - - {#if isWaiting} - - {/if} -
- - {#if listOpen} - - {/if} - - {#if !isMulti || (isMulti && !showMultiSelect)} - - {/if} - - {#if isMulti && showMultiSelect} - {#each value as item} - - {/each} - {/if} -
diff --git a/src/routes/index.svelte b/src/routes/index.svelte index 7e6190ff..5f8d13c3 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -2,8 +2,103 @@ import Select from '$lib/Select.svelte'; import MultiSelection from '$lib/MultiSelection.svelte'; import debounce from '$lib/debounce'; + import ChevronIcon from '$lib/ChevronIcon.svelte'; + import ClearIcon from '$lib/ClearIcon.svelte'; + + let items = ['one', 'two', 'three', 'four']; + let value = null; -

Svelte Select

+
+ +
+ + diff --git a/svelte.config.js b/svelte.config.js index b8795361..a5aa9a46 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,9 +1,14 @@ +import preprocess from 'svelte-preprocess'; + /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { // hydrate the
element in src/app.html target: '#svelte' - } + }, + preprocess: preprocess({ + postcss: true + }), }; export default config; diff --git a/tailwind.config.cjs b/tailwind.config.cjs new file mode 100644 index 00000000..83903994 --- /dev/null +++ b/tailwind.config.cjs @@ -0,0 +1,4 @@ +module.exports = { + mode: 'jit', + purge: ['./src/**/*.svelte'], +}; diff --git a/test/src/Select/Select--default.svelte b/test/src/Select/Select--default.svelte index 8307533a..af857569 100644 --- a/test/src/Select/Select--default.svelte +++ b/test/src/Select/Select--default.svelte @@ -1,4 +1,4 @@ -
+
-
+
Pizza @@ -32,14 +32,14 @@
-
+ + From 8e0fbf524e9377f08c38ce9e1d67d4c37ded7180 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 14 Oct 2021 08:24:50 +1100 Subject: [PATCH 288/635] list-container changes for tailwind --- CHANGELOG.md | 4 +++ src/lib/List.svelte | 13 ++++----- src/lib/Select.svelte | 2 ++ src/routes/index.svelte | 7 ++++- test/src/index.js | 60 ++++++++++++++++++++--------------------- 5 files changed, 49 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79b14ed7..cc2931e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## unreleased +* listGroupTitle -> list-group-title +* virtualList -> virtual-list +* listContainer -> list-container +* listClass prop added * bye bye yarn * selectContainer and other CSS class names updated, selectContainer -> select-container for example * LoadingIcon prop added, must be imported to have a spinner/loader diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 11f1d57c..80418bfd 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -7,6 +7,7 @@ export let Item; export let VirtualList; + export let listClass; export let filterText; export let optionIdentifier; export let noOptionsMessage; @@ -238,8 +239,8 @@
{#if VirtualList} @@ -269,7 +270,7 @@ {:else} {#each items as item, i} {#if item.isGroupHeader && !item.isSelectable} -
{getGroupHeaderLabel(item)}
+
{getGroupHeaderLabel(item)}
{:else}
handleHover(i)} @@ -297,7 +298,7 @@
- -
- {@html getOptionLabel(item, filterText)} -
diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 80418bfd..d0e96b41 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -8,6 +8,7 @@ export let VirtualList; export let listClass; + export let itemClass; export let filterText; export let optionIdentifier; export let noOptionsMessage; @@ -259,6 +260,7 @@ +
\ No newline at end of file diff --git a/src/lib/List.svelte b/src/lib/List.svelte index d0e96b41..1ae11aa5 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -299,43 +299,3 @@ {/each} {/if}
- - diff --git a/src/lib/MultiSelection.svelte b/src/lib/MultiSelection.svelte index 4e59924a..313b8f80 100644 --- a/src/lib/MultiSelection.svelte +++ b/src/lib/MultiSelection.svelte @@ -15,6 +15,35 @@ } +{#each value as item, i} +
+ multiFullItemClearable ? handleClear(i, event) : {}}> +
+ {@html getSelectionLabel(item)} +
+ {#if !isDisabled && !multiFullItemClearable} +
handleClear(i, event)}> + +
+ {/if} +
+{/each} + - -{#each value as item, i} -
- multiFullItemClearable ? handleClear(i, event) : {}}> -
- {@html getSelectionLabel(item)} -
- {#if !isDisabled && !multiFullItemClearable} -
handleClear(i, event)}> - -
- {/if} -
-{/each} diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 23d44f2d..52919f45 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -8,8 +8,6 @@ const dispatch = createEventDispatcher(); - export { containerClasses as class }; - export let id = null; export let container = undefined; export let input = undefined; @@ -88,8 +86,11 @@ export let ChevronIcon = null; export let ClearIcon = null; export let LoadingIcon = null; + + export { containerClasses as class }; export let listClass = 'list'; export let itemClass = 'item'; + export let debounce = _debounce; function filterMethod(args) { @@ -787,145 +788,3 @@ {/each} {/if}
- - diff --git a/src/lib/Selection.svelte b/src/lib/Selection.svelte index c6adf970..e4109f90 100644 --- a/src/lib/Selection.svelte +++ b/src/lib/Selection.svelte @@ -3,6 +3,10 @@ export let item = undefined; +
+ {@html getSelectionLabel(item)} +
+ - -
- {@html getSelectionLabel(item)} -
diff --git a/src/lib/VirtualList.svelte b/src/lib/VirtualList.svelte index 151fccd3..b9b7e388 100644 --- a/src/lib/VirtualList.svelte +++ b/src/lib/VirtualList.svelte @@ -123,6 +123,23 @@ }); + + + {#each visible as row (row.index)} + + Missing template + + {/each} + + + - - - - {#each visible as row (row.index)} - - Missing template - - {/each} - - diff --git a/src/lib/default.css b/src/lib/default.css new file mode 100644 index 00000000..39b67bc6 --- /dev/null +++ b/src/lib/default.css @@ -0,0 +1,214 @@ +.select-container { + border: var(--border, 1px solid #d8dbdf); + border-radius: var(--borderRadius, 3px); + box-sizing: border-box; + height: var(--height, 42px); + position: relative; + display: flex; + align-items: center; + padding: var(--padding, 0 16px); + background: var(--background, #fff); + margin: var(--margin, 0); + width: var(--width, 100%); +} + +.select-container input { + cursor: default; + border: none; + color: var(--inputColor, #3f4f5f); + height: var(--height, 42px); + line-height: var(--height, 42px); + padding: var(--inputPadding, var(--padding, 0 16px)); + width: 100%; + background: transparent; + font-size: var(--inputFontSize, 14px); + letter-spacing: var(--inputLetterSpacing, inherit); + position: absolute; + left: var(--inputLeft, 0); + margin: var(--inputMargin, 0); +} + +.select-container input::placeholder { + color: var(--placeholderColor, #78848f); + opacity: var(--placeholderOpacity, 1); +} + +.select-container input:focus { + outline: none; +} + +.select-container:hover { + border-color: var(--borderHoverColor, #b2b8bf); +} + +.select-container.focused { + border-color: var(--borderFocusColor, #006fe8); +} + +.select-container.disabled { + background: var(--disabledBackground, #ebedef); + border-color: var(--disabledBorderColor, #ebedef); + color: var(--disabledColor, #c1c6cc); +} + +.select-container.disabled input::placeholder { + color: var(--disabledPlaceholderColor, #c1c6cc); + opacity: var(--disabledPlaceholderOpacity, 1); +} + +.select-container .selected-item { + line-height: var(--height, 42px); + height: var(--height, 42px); + overflow-x: hidden; + padding: var(--selected-item-padding, 0 20px 0 0); +} + +.select-container .selected-item:focus { + outline: none; +} + +.select-container .icons { + position: absolute; + display: flex; + right: var(--iconsRight, 0); + top: var(--iconsTop, 11px); + bottom: var(--iconsBottom, 11px); + color: var(--iconsColor, #c5cacf); +} + +.select-container .icons > * { + transition: color 0.2s ease-in-out; +} + +.select-container.focused .icons, +.select-container .chevron:hover, +.select-container .clearSelect:hover { + color: var(--iconsColorFocused, #2c3e50); +} + +.select-container .clearSelect { + padding: 0 7px; + width: var(--clearSelectWidth, 35px); + height: 20px; + color: var(--clearSelectColor, --iconsColor); + flex: none !important; +} + +.select-container .chevron { + display: flex; + padding: 0 7px; + box-shadow: -1px 0 0 0 #c5cacf; + width: var(--indicatorWidth, 35px); + height: var(--indicatorHeight, 20px); + color: var(--indicatorColor, --iconsColor); +} + +.select-container.multi { + padding: var(--multiSelectPadding, 0 35px 0 16px); + height: auto; + flex-wrap: wrap; + align-items: stretch; +} + +.select-container.multi > * { + flex: 1 1 auto; + width: 50px; +} + +.select-container.multi input { + padding: var(--multiSelectInputPadding, 0); + position: relative; + margin: var(--multiSelectInputMargin, 0); +} + +.select-container.error { + border: var(--errorBorder, 1px solid #ff2d55); + background: var(--errorBackground, #fff); +} + +.a11yText { + z-index: 9999; + border: 0px; + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + width: 1px; + position: absolute; + overflow: hidden; + padding: 0px; + white-space: nowrap; +} + +.list { + box-shadow: var(--listShadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); + border-radius: var(--listBorderRadius, 4px); + max-height: var(--listMaxHeight, 250px); + overflow-y: auto; + background: var(--listBackground, #fff); + border: var(--listBorder, none); + position: var(--listPosition, absolute); + z-index: var(--listZIndex, 2); + width: 100%; + left: var(--listLeft, 0); + right: var(--listRight, 0); +} + +.list.virtual-list { + height: var(--virtualListHeight, 200px); +} + +.list .list-group-title { + color: var(--groupTitleColor, #8f8f8f); + cursor: default; + font-size: var(--groupTitleFontSize, 12px); + font-weight: var(--groupTitleFontWeight, 600); + height: var(--height, 42px); + line-height: var(--height, 42px); + padding: var(--groupTitlePadding, 0 20px); + text-overflow: ellipsis; + overflow-x: hidden; + white-space: nowrap; + text-transform: var(--groupTitleTextTransform, uppercase); +} + +.list .empty { + text-align: var(--listEmptyTextAlign, center); + padding: var(--listEmptyPadding, 20px 0); + color: var(--listEmptyColor, #78848f); +} + +.item { + cursor: default; + height: var(--height, 42px); + line-height: var(--height, 42px); + padding: var(--itemPadding, 0 20px); + color: var(--itemColor, inherit); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.item.group-item { + padding-left: var(--groupItemPaddingLeft, 40px); +} + +.item:active { + background: var(--itemActiveBackground, #b9daff); +} + +.item.active { + background: var(--itemIsActiveBG, #007aff); + color: var(--itemIsActiveColor, #fff); +} + +.item.not-selectable { + color: var(--itemIsNotSelectableColor, #999); +} + +.item.first { + border-radius: var(--itemFirstBorderRadius, 4px 4px 0 0); +} + +.item.hover:not(.active) { + background: var(--itemHoverBG, #e7f2ff); + color: var(--itemHoverColor, inherit); +} \ No newline at end of file diff --git a/src/lib/tailwind.css b/src/lib/tailwind.css new file mode 100644 index 00000000..5a41720a --- /dev/null +++ b/src/lib/tailwind.css @@ -0,0 +1,110 @@ +@import 'http://github.com/tailwindcss/base'; + +.select-container { + @apply border rounded box-border h-10 relative flex items-center px-4 py-0 bg-white m-0 w-full + hover:border-gray-400; +} + +.select-container input { + @apply cursor-default border-none text-gray-600 h-10 leading-10 px-4 py-0 bg-transparent text-sm absolute left-0 m-0 w-full + focus:outline-none hover:border-gray-400; +} + +.select-container.focused { + @apply border-blue-600; +} + +.select-container.disabled { + @apply bg-gray-200 border-gray-200 text-gray-600; +} + +.select-container.disabled input::placeholder { + @apply text-gray-400 opacity-100; +} + +.select-container .selected-item { + @apply leading-10 h-10 overflow-x-hidden pr-5 + focus:outline-none; +} + +.select-container .icons { + @apply absolute flex right-0 translate-y-0 text-gray-200; +} + +.select-container .icons > * { + @apply transition-colors ease-in-out duration-200; +} + +.select-container.focused .icons, +.select-container .chevron:hover, +.select-container .clearSelect:hover { + @apply text-gray-600; +} + +.select-container .clearSelect { + @apply px-2 h-5 text-gray-300 flex-none w-9; +} + +.select-container .chevron { + @apply flex pt-0 pr-2 pl-2 border-l-2 w-9 h-5 text-gray-300; +} + +.select-container.multi { + @apply pr-9 pl-4 h-auto flex-wrap items-stretch; +} + +.select-container.multi > * { + @apply flex-auto w-16; +} + +.select-container.multi input { + @apply p-0 relative m-0; +} + +.select-container.error { + @apply border-red-500 bg-white; +} + +.a11yText { + @apply sr-only; +} + +.list { + @apply shadow-md rounded-sm max-h-64 overflow-y-auto bg-white border-none absolute z-10 w-full left-0 right-0; +} + +.list .list-group-title { + @apply text-gray-400 cursor-default text-sm font-medium h-10 leading-10 px-5 overflow-ellipsis whitespace-nowrap uppercase; +} + +.list .empty { + @apply text-center py-5 text-gray-500; +} + +.item { + @apply cursor-default h-10 leading-10 px-5 text-gray-500 overflow-ellipsis overflow-hidden whitespace-nowrap; +} + +.item.group-item { + @apply px-10; +} + +.item:active { + @apply bg-blue-200; +} + +.item.active { + @apply bg-blue-600 text-white; +} + +.item.not-selectable { + @apply text-gray-300; +} + +.item.first { + @apply rounded-t-sm; +} + +.item.hover:not(.active) { + @apply bg-blue-100 text-current; +} diff --git a/src/routes/index.svelte b/src/routes/index.svelte index 769732ad..0ac7221b 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -17,6 +17,10 @@ let value = null; +
+ - -
- {item.name} -
-
{item.name}
-
{item.tagline}
-
-
diff --git a/test/src/index.js b/test/src/index.js index 04cee42e..da630daf 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -3,14 +3,16 @@ import CustomItem from './CustomItem.svelte'; import Select from '../../src/lib/Select.svelte'; import MultiSelection from '../../src/lib/MultiSelection.svelte'; import ChevronIcon from '../../src/lib/ChevronIcon.svelte'; -import ClearIcon from '../../src/lib/ClearIcon.svelte'; import LoadingIcon from '../../src/lib/LoadingIcon.svelte'; import TestIcon from './TestIcon.svelte'; import TestClearIcon from './TestClearIcon.svelte'; import SelectDefault from './Select/Select--default.svelte' import SelectMultiSelected from './Select/Select--multiSelected.svelte' import ParentContainer from './Select/ParentContainer.svelte' -import {assert, test, done} from 'tape-modern'; +import {assert, test} from 'tape-modern'; + +// import "../../src/lib/default.css"; +import "../../src/lib/tailwind.css"; function querySelectorClick(selector) { document.querySelector(selector).click(); @@ -394,7 +396,7 @@ test('selected item\'s default view', async (t) => { } }); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); + t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); select.$destroy(); }); @@ -404,7 +406,7 @@ test('select view updates with value updates', async (t) => { }); await handleSet(select, {value: {value: 'chips', label: 'Chips'}}); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); + t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); select.$destroy(); }); @@ -419,7 +421,7 @@ test('clear wipes value and updates view', async (t) => { await wait(0); await handleSet(select, {value: undefined}); - t.ok(!target.querySelector('.selectedItem .selection')); + t.ok(!target.querySelector('.selected-item .selection')); select.$destroy(); }); @@ -619,9 +621,9 @@ test('List should keep width of parent Select', async (t) => { await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); await wait(0); - const select-container = document.querySelector('.select-container'); + const selectContainer = document.querySelector('.select-container'); const listContainer = document.querySelector('.list'); - t.equal(select-container.offsetWidth, listContainer.offsetWidth); + t.equal(selectContainer.offsetWidth, listContainer.offsetWidth); select.$destroy(); }); @@ -1576,7 +1578,7 @@ test('when isMulti and groupBy is active then items should be selectable', async select.$destroy(); }); -test('when isMulti and selected items reach edge of container then Select height should increase and selected items should wrap to new line', async (t) => { +test.only('when isMulti and selected items reach edge of container then Select height should increase and selected items should wrap to new line', async (t) => { const select = new Select({ target, props: { @@ -1590,7 +1592,7 @@ test('when isMulti and selected items reach edge of container then Select height t.ok(document.querySelector('.select-container').scrollHeight === 42); await handleSet(select, {value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}]}); t.ok(document.querySelector('.select-container').scrollHeight > 44); - select.$destroy(); + // select.$destroy(); }); test('when isMulti and value is populated then navigating with LeftArrow updates activeValue', async (t) => { @@ -2339,7 +2341,7 @@ test('When list is open, filterText applied and Enter/Tab key pressed should sel window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); t.equal(select.value.value, 'A5'); await wait(0); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'A5'); + t.ok(target.querySelector('.selected-item .selection').innerHTML === 'A5'); select.$destroy(); }); @@ -2374,7 +2376,7 @@ test('when items and value supplied as just strings then value should render cor } }); - t.equal(document.querySelector('.selectedItem .selection').innerHTML, 'Pizza'); + t.equal(document.querySelector('.selected-item .selection').innerHTML, 'Pizza'); select.$destroy(); }); @@ -2889,8 +2891,8 @@ test('Select container classes can be injected', async (t) => { target, props: { items, - value: { name: 'Item #2' }, - containerClasses: 'testclass', + value: {value: 'cake', label: 'Cake'}, + class: 'select-container testclass', }, }); @@ -3014,7 +3016,7 @@ test('When items change then value should also update', async (t) => { await wait(0); t.ok(select.value.label === 'Loaded Fries'); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Loaded Fries'); + t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Loaded Fries'); select.$destroy(); @@ -3070,7 +3072,7 @@ test('When items change then value should also update but only if found in items await wait(0); t.ok(select.value.label === 'Chips'); - t.ok(target.querySelector('.selectedItem .selection').innerHTML === 'Chips'); + t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); select.$destroy(); }); @@ -3800,4 +3802,5 @@ test('allows the user to select an item by clicking with a focusable ancestor', t.equal(select.value.label, 'Chocolate'); select.$destroy(); -}); \ No newline at end of file +}); + From 5b68ca2bc52a434b5155825feb25d8a2f6791d92 Mon Sep 17 00:00:00 2001 From: sethvincent Date: Mon, 1 Nov 2021 15:57:42 -0700 Subject: [PATCH 292/635] check event.relatedTarget in handleWindowEvent --- src/Select.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Select.svelte b/src/Select.svelte index eefeb9f4..fbef1b96 100644 --- a/src/Select.svelte +++ b/src/Select.svelte @@ -540,7 +540,9 @@ if (!container) return; const eventTarget = event.path && event.path.length > 0 ? event.path[0] : event.target; - if (container.contains(eventTarget)) return; + if (container.contains(eventTarget) || container.contains(event.relatedTarget)) { + return; + } isFocused = false; listOpen = false; activeValue = undefined; From bba1bb4d85cf8806f6e5617704b4efaf465debac Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 3 Nov 2021 13:11:20 +1100 Subject: [PATCH 293/635] =?UTF-8?q?v5=20taking=20shape=20=F0=9F=A4=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- README.md | 24 ++- package.json | 2 +- src/app.html | 20 +-- src/lib/List.svelte | 6 +- .../{MultiSelection.svelte => Multi.svelte} | 0 src/lib/Select.svelte | 29 ++-- src/lib/presets.js | 28 ++++ src/lib/tailwind.css | 4 +- src/routes/index.svelte | 56 ++----- svelte-select.png | Bin 0 -> 24605 bytes test/src/index.js | 152 +++++++++--------- 12 files changed, 170 insertions(+), 154 deletions(-) rename src/lib/{MultiSelection.svelte => Multi.svelte} (100%) create mode 100644 src/lib/presets.js create mode 100644 svelte-select.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e971212..b53faed6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## unreleased +* MultiSelection -> Multi * added postcss to example, tests * tailwind css option * moved styles into separate CSS file @@ -22,7 +23,7 @@ * indicatorSvg removed, use ChevronIcon going forward * removed playwright and puppeteer, tests now just run in the browser with sirv * debounce method is now exported as a prop -* MultiSelection component no longer included by default, must be imported going forward +* Multi component no longer included by default, must be imported going forward * VirtualList null by default * Removed isVirtualList, will use VirtualList going forward * Convert repo to use SvelteKit diff --git a/README.md b/README.md index 89b2c1f3..0068bf86 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,20 @@ +
+ Svelte Select +
+ +
+ + + +
+ # svelte-select A select/autocomplete component for Svelte apps. With support for grouping, filtering, async and more. @@ -11,12 +28,9 @@ A select/autocomplete component for Svelte apps. With support for grouping, fil ## Installation ```bash -yarn add svelte-select +npm install svelte-select ``` -**Note:** Install as a dev dependency (yarn add svelte-select --dev) if using [Sapper](https://sapper.svelte.dev/) to avoid a SSR error. - - ## Usage ```html @@ -69,7 +83,7 @@ yarn add svelte-select - `inputAttributes: Object` Default: `{}`. Pass in HTML attributes to the Select input. - `Item: Component` Default: `Item`. Item component. - `Selection: Component` Default: `Selection`. Selection component. -- `MultiSelection: Component` Default: `MultiSelection`. Multi selection component. +- `Multi: Component` Default: `Multi`. Multi selection component. - `Icon: Component` Default: `Icon`. Icon component. - `iconProps: Object` Default: `{}`. Icon props. - `indicatorSvg: @html` Default: `undefined`. Override default SVG chevron indicator. diff --git a/package.json b/package.json index 6afb8e74..5a71e30b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A -
+ // let value = null; -
- -
- - + {#if !isMulti && showSelectedItem} -
- +
+
{/if}
{#if showClear} - {#if listOpen} - + {/if} {#if !isMulti || (isMulti && !showMultiSelect)} - + {/if} {#if isMulti && showMultiSelect} {#each value as item} - + {/each} {/if}
diff --git a/src/lib/clickOutside.js b/src/lib/clickOutside.js new file mode 100644 index 00000000..28ed6a94 --- /dev/null +++ b/src/lib/clickOutside.js @@ -0,0 +1,17 @@ +export default (node, parent) => { + function detect({ target }) { + if (!node.contains(target) && parent && !parent.contains(target)) { + node.dispatchEvent(new CustomEvent('clickOutside')); + } + } + + document.addEventListener('click', detect, { + passive: true, capture: true + }); + + return { + destroy() { + document.removeEventListener('click', detect); + }, + }; +}; diff --git a/src/lib/presets/vanilla.js b/src/lib/presets/vanilla.js new file mode 100644 index 00000000..144571c0 --- /dev/null +++ b/src/lib/presets/vanilla.js @@ -0,0 +1,14 @@ +import defaultStyles from '../default.css'; +import List from '../List.svelte'; +import Item from '../Item.svelte'; +import Selection from '../Selection.svelte'; +import Multi from '../Multi.svelte'; + + +export default { + theme: defaultStyles, + List, + Item, + Selection, + Multi +} \ No newline at end of file diff --git a/src/routes/index.svelte b/src/routes/index.svelte index fb1969b0..46a9bf18 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -1,8 +1,7 @@ - + \ No newline at end of file diff --git a/test/public/index.css b/test/public/index.css deleted file mode 100644 index 6121973c..00000000 --- a/test/public/index.css +++ /dev/null @@ -1,850 +0,0 @@ -/*! tailwindcss v2.2.16 | MIT License | https://tailwindcss.com *//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */ - -/* -Document -======== -*/ - -/** -Use a better box model (opinionated). -*/ - -*, -::before, -::after { - box-sizing: border-box; -} - -/** -Use a more readable tab size (opinionated). -*/ - -html { - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; -} - -/** -1. Correct the line height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -*/ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* -Sections -======== -*/ - -/** -Remove the margin in all browsers. -*/ - -body { - margin: 0; -} - -/** -Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) -*/ - -body { - font-family: - system-ui, - -apple-system, /* Firefox supports this but not yet `system-ui` */ - 'Segoe UI', - Roboto, - Helvetica, - Arial, - sans-serif, - 'Apple Color Emoji', - 'Segoe UI Emoji'; -} - -/* -Grouping content -================ -*/ - -/** -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -*/ - -hr { - height: 0; /* 1 */ - color: inherit; /* 2 */ -} - -/* -Text-level semantics -==================== -*/ - -/** -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr[title] { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/** -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/** -1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) -2. Correct the odd 'em' font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: - ui-monospace, - SFMono-Regular, - Consolas, - 'Liberation Mono', - Menlo, - monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/** -Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -Tabular data -============ -*/ - -/** -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -*/ - -table { - text-indent: 0; /* 1 */ - border-color: inherit; /* 2 */ -} - -/* -Forms -===== -*/ - -/** -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** -Remove the inheritance of text transform in Edge and Firefox. -1. Remove the inheritance of text transform in Firefox. -*/ - -button, -select { /* 1 */ - text-transform: none; -} - -/** -Correct the inability to style clickable types in iOS and Safari. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; -} - -/** -Remove the inner border and padding in Firefox. -*/ - -::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** -Restore the focus styles unset by the previous rule. -*/ - -:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** -Remove the additional ':invalid' styles in Firefox. -See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737 -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/** -Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers. -*/ - -legend { - padding: 0; -} - -/** -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/** -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/** -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to 'inherit' in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* -Interactive -=========== -*/ - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -}/** - * Manually forked from SUIT CSS Base: https://github.com/suitcss/base - * A thin layer on top of normalize.css that provides a starting point more - * suitable for web applications. - */ - -/** - * Removes the default spacing and border for appropriate elements. - */ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -button { - background-color: transparent; - background-image: none; -} - -fieldset { - margin: 0; - padding: 0; -} - -ol, -ul { - list-style: none; - margin: 0; - padding: 0; -} - -/** - * Tailwind custom reset styles - */ - -/** - * 1. Use the user's configured `sans` font-family (with Tailwind's default - * sans-serif font stack as a fallback) as a sane default. - * 2. Use Tailwind's default "normal" line-height so the user isn't forced - * to override it to ensure consistency even when using the default theme. - */ - -html { - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 1 */ - line-height: 1.5; /* 2 */ -} - - -/** - * Inherit font-family and line-height from `html` so users can set them as - * a class directly on the `html` element. - */ - -body { - font-family: inherit; - line-height: inherit; -} - -/** - * 1. Prevent padding and border from affecting element width. - * - * We used to set this in the html element and inherit from - * the parent element for everything else. This caused issues - * in shadow-dom-enhanced elements like
where the content - * is wrapped by a div with box-sizing set to `content-box`. - * - * https://github.com/mozdevs/cssremedy/issues/4 - * - * - * 2. Allow adding a border to an element by just adding a border-width. - * - * By default, the way the browser specifies that an element should have no - * border is by setting it's border-style to `none` in the user-agent - * stylesheet. - * - * In order to easily add borders to elements by just setting the `border-width` - * property, we change the default border-style for all elements to `solid`, and - * use border-width to hide them instead. This way our `border` utilities only - * need to set the `border-width` property instead of the entire `border` - * shorthand, making our border utilities much more straightforward to compose. - * - * https://github.com/tailwindcss/tailwindcss/pull/116 - */ - -*, -::before, -::after { - box-sizing: border-box; /* 1 */ - border-width: 0; /* 2 */ - border-style: solid; /* 2 */ - border-color: currentColor; /* 2 */ -} - -/* - * Ensure horizontal rules are visible by default - */ - -hr { - border-top-width: 1px; -} - -/** - * Undo the `border-style: none` reset that Normalize applies to images so that - * our `border-{width}` utilities have the expected effect. - * - * The Normalize reset is unnecessary for us since we default the border-width - * to 0 on all elements. - * - * https://github.com/tailwindcss/tailwindcss/issues/362 - */ - -img { - border-style: solid; -} - -textarea { - resize: vertical; -} - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - color: #9ca3af; -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - color: #9ca3af; -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - color: #9ca3af; -} - -button, -[role="button"] { - cursor: pointer; -} - -/** - * Override legacy focus reset from Normalize with modern Firefox focus styles. - * - * This is actually an improvement over the new defaults in Firefox in our testing, - * as it triggers the better focus styles even for links, which still use a dotted - * outline in Firefox by default. - */ - -:-moz-focusring { - outline: auto; -} - -table { - border-collapse: collapse; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/** - * Reset links to optimize for opt-in styling instead of - * opt-out. - */ - -a { - color: inherit; - text-decoration: inherit; -} - -/** - * Reset form element properties that are easy to forget to - * style explicitly so you don't inadvertently introduce - * styles that deviate from your design system. These styles - * supplement a partial reset that is already applied by - * normalize.css. - */ - -button, -input, -optgroup, -select, -textarea { - padding: 0; - line-height: inherit; - color: inherit; -} - -/** - * Use the configured 'mono' font family for elements that - * are expected to be rendered with a monospace font, falling - * back to the system monospace stack if there is no configured - * 'mono' font family. - */ - -pre, -code, -kbd, -samp { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -/** - * 1. Make replaced elements `display: block` by default as that's - * the behavior you want almost all of the time. Inspired by - * CSS Remedy, with `svg` added as well. - * - * https://github.com/mozdevs/cssremedy/issues/14 - * - * 2. Add `vertical-align: middle` to align replaced elements more - * sensibly by default when overriding `display` by adding a - * utility like `inline`. - * - * This can trigger a poorly considered linting error in some - * tools but is included by design. - * - * https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210 - */ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; /* 1 */ - vertical-align: middle; /* 2 */ -} - -/** - * Constrain images and videos to the parent width and preserve - * their intrinsic aspect ratio. - * - * https://github.com/mozdevs/cssremedy/issues/14 - */ - -img, -video { - max-width: 100%; - height: auto; -} - -/** - * Ensure the default browser behavior of the `hidden` attribute. - */ - -[hidden] { - display: none; -} - -*, ::before, ::after { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - --tw-border-opacity: 1; - border-color: rgba(229, 231, 235, var(--tw-border-opacity)); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; -} - -.select-container { - position: relative; - margin: 0px; - box-sizing: border-box; - display: flex; - height: 2.5rem; - width: 100%; - align-items: center; - border-radius: 0.25rem; - border-width: 1px; - --tw-bg-opacity: 1; - background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0px; - padding-bottom: 0px; -} - -.select-container:hover { - --tw-border-opacity: 1; - border-color: rgba(156, 163, 175, var(--tw-border-opacity)); -} - -.select-container input { - position: absolute; - left: 0px; - margin: 0px; - height: 2.5rem; - width: 100%; - cursor: default; - border-style: none; - background-color: transparent; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0px; - padding-bottom: 0px; - font-size: 0.875rem; - line-height: 1.25rem; - line-height: 2.5rem; - --tw-text-opacity: 1; - color: rgba(75, 85, 99, var(--tw-text-opacity)); -} - -.select-container input:hover { - --tw-border-opacity: 1; - border-color: rgba(156, 163, 175, var(--tw-border-opacity)); -} - -.select-container input:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.select-container.focused { - --tw-border-opacity: 1; - border-color: rgba(37, 99, 235, var(--tw-border-opacity)); -} - -.select-container.disabled { - --tw-border-opacity: 1; - border-color: rgba(229, 231, 235, var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgba(229, 231, 235, var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgba(75, 85, 99, var(--tw-text-opacity)); -} - -.select-container.disabled input::-moz-placeholder { - --tw-text-opacity: 1; - color: rgba(156, 163, 175, var(--tw-text-opacity)); - opacity: 1; -} - -.select-container.disabled input:-ms-input-placeholder { - --tw-text-opacity: 1; - color: rgba(156, 163, 175, var(--tw-text-opacity)); - opacity: 1; -} - -.select-container.disabled input::placeholder { - --tw-text-opacity: 1; - color: rgba(156, 163, 175, var(--tw-text-opacity)); - opacity: 1; -} - -.select-container .selected-item { - height: 2.5rem; - overflow-x: hidden; - padding-right: 1.25rem; - line-height: 2.5rem; -} - -.select-container .selected-item:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.select-container .icons { - position: absolute; - right: 0px; - display: flex; - --tw-translate-y: 0px; - transform: var(--tw-transform); - --tw-text-opacity: 1; - color: rgba(229, 231, 235, var(--tw-text-opacity)); -} - -.select-container .icons > * { - transition-property: background-color, border-color, color, fill, stroke; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; - transition-duration: 200ms; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); -} - -.select-container.focused .icons, .select-container .chevron:hover, .select-container .clearSelect:hover { - --tw-text-opacity: 1; - color: rgba(75, 85, 99, var(--tw-text-opacity)); -} - -.select-container .clearSelect { - height: 1.25rem; - width: 2.25rem; - flex: none; - padding-left: 0.5rem; - padding-right: 0.5rem; - --tw-text-opacity: 1; - color: rgba(209, 213, 219, var(--tw-text-opacity)); -} - -.select-container .chevron { - display: flex; - height: 1.25rem; - width: 2.25rem; - border-left-width: 2px; - padding-top: 0px; - padding-right: 0.5rem; - padding-left: 0.5rem; - --tw-text-opacity: 1; - color: rgba(209, 213, 219, var(--tw-text-opacity)); -} - -.select-container.multi { - height: auto; - flex-wrap: wrap; - align-items: stretch; - padding-right: 2.25rem; - padding-left: 1rem; -} - -.select-container.multi > * { - width: 4rem; - flex: 1 1 auto; -} - -.select-container.multi input { - position: relative; - margin: 0px; - padding: 0px; -} - -.select-container.error { - --tw-border-opacity: 1; - border-color: rgba(239, 68, 68, var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); -} - -.a11yText { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.list { - position: absolute; - left: 0px; - right: 0px; - z-index: 10; - max-height: 16rem; - width: 100%; - overflow-y: auto; - border-radius: 0.125rem; - border-style: none; - --tw-bg-opacity: 1; - background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); - --tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.list .list-group-title { - height: 2.5rem; - cursor: default; - text-overflow: ellipsis; - white-space: nowrap; - padding-left: 1.25rem; - padding-right: 1.25rem; - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 500; - text-transform: uppercase; - line-height: 2.5rem; - --tw-text-opacity: 1; - color: rgba(156, 163, 175, var(--tw-text-opacity)); -} - -.list .empty { - padding-top: 1.25rem; - padding-bottom: 1.25rem; - text-align: center; - --tw-text-opacity: 1; - color: rgba(107, 114, 128, var(--tw-text-opacity)); -} - -.item { - height: 2.5rem; - cursor: default; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - padding-left: 1.25rem; - padding-right: 1.25rem; - line-height: 2.5rem; - --tw-text-opacity: 1; - color: rgba(107, 114, 128, var(--tw-text-opacity)); -} - -.item.group-item { - padding-left: 2.5rem; - padding-right: 2.5rem; -} - -.item:active { - --tw-bg-opacity: 1; - background-color: rgba(191, 219, 254, var(--tw-bg-opacity)); -} - -.item.active { - --tw-bg-opacity: 1; - background-color: rgba(37, 99, 235, var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgba(255, 255, 255, var(--tw-text-opacity)); -} - -.item.not-selectable { - --tw-text-opacity: 1; - color: rgba(209, 213, 219, var(--tw-text-opacity)); -} - -.item.first { - border-top-left-radius: 0.125rem; - border-top-right-radius: 0.125rem; -} - -.item.hover:not(.active) { - --tw-bg-opacity: 1; - background-color: rgba(219, 234, 254, var(--tw-bg-opacity)); - color: currentColor; -} diff --git a/test/src/Select/ParentContainer.svelte b/test/src/Select/ParentContainer.svelte index b6883fcb..77fa5863 100644 --- a/test/src/Select/ParentContainer.svelte +++ b/test/src/Select/ParentContainer.svelte @@ -3,10 +3,11 @@ export let value; export let items; + export let config;
- +

{value.label}

diff --git a/test/src/index.js b/test/src/index.js index b532b931..aa5fff86 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1,7 +1,6 @@ import normalizeHtml from '../utils/normalizeHtml'; import CustomItem from './CustomItem.svelte'; import Select from '../../src/lib/Select.svelte'; -import Multi from '../../src/lib/Multi.svelte'; import ChevronIcon from '../../src/lib/ChevronIcon.svelte'; import LoadingIcon from '../../src/lib/LoadingIcon.svelte'; import TestIcon from './TestIcon.svelte'; @@ -11,8 +10,10 @@ import SelectMultiSelected from './Select/Select--multiSelected.svelte' import ParentContainer from './Select/ParentContainer.svelte' import {assert, test} from 'tape-modern'; -// import "../../src/lib/default.css"; -import "../../src/lib/tailwind.css"; +import config from '../../src/lib/presets/vanilla'; + +import "../../src/lib/default.css"; +// import "../../src/lib/tailwind.css"; function querySelectorClick(selector) { document.querySelector(selector).click(); @@ -162,7 +163,7 @@ test('with no data creates default elements', async (t) => { }); const select = new Select({ - target, + target }); t.htmlEqual(target.innerHTML, testTarget.innerHTML); @@ -175,6 +176,7 @@ test('when isFocused true container adds focused class', async (t) => { const select = new Select({ target, props: { + config, isFocused: true } }); @@ -188,6 +190,7 @@ test('when isFocused changes to true input should focus', async (t) => { const select = new Select({ target, props: { + config, isFocused: false } }); @@ -205,6 +208,7 @@ test('default empty list', async (t) => { const select = new Select({ target, props: { + config, listOpen: true } }); @@ -218,6 +222,7 @@ test('default list with five items', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithIndex } @@ -232,6 +237,7 @@ test('should highlight active list item', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithIndex, value: {value: 'pizza', label: 'Pizza', index: 1} @@ -253,6 +259,7 @@ test('list scrolls to active item', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithIndex.concat(extras), value: {value: 'sunday-roast', label: 'Sunday Roast'}, @@ -280,6 +287,7 @@ test('list scrolls to hovered item when navigating with keys', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithIndex.concat(extras) } @@ -310,6 +318,7 @@ test('hover item updates on keyUp or keyDown', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: items } @@ -325,6 +334,7 @@ test('on enter active item fires a itemSelected event', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithIndex } @@ -348,6 +358,7 @@ test('on tab active item fires a itemSelected event', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithIndex } @@ -370,6 +381,7 @@ test('on selected of current active item does not fire a itemSelected event', as const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithIndex, value: { value: 'chocolate', label: 'Chocolate', index: 0 } @@ -392,6 +404,7 @@ test('selected item\'s default view', async (t) => { const select = new Select({ target, props: { + config, value: {value: 'chips', label: 'Chips'}, } }); @@ -403,6 +416,9 @@ test('selected item\'s default view', async (t) => { test('select view updates with value updates', async (t) => { const select = new Select({ target, + props: { + config + } }); await handleSet(select, {value: {value: 'chips', label: 'Chips'}}); @@ -415,6 +431,7 @@ test('clear wipes value and updates view', async (t) => { const select = new Select({ target, props: { + config, value: {value: 'chips', label: 'Chips'}, } }); @@ -429,6 +446,9 @@ test('clear wipes value and updates view', async (t) => { test('clicking on Select opens List', async (t) => { const select = new Select({ target, + props: { + config, + } }); await querySelectorClick('.select-container'); @@ -442,6 +462,7 @@ test('Select opens List populated with items', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -456,6 +477,7 @@ test('List starts with first item in hover state', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -470,6 +492,7 @@ test('select item from list', async (t) => { const select = new Select({ target, props: { + config, items, } }); @@ -487,6 +510,7 @@ test('when listPosition is set to top list should be above the input', async (t) const select = new Select({ target, props: { + config, items, listOpen: true, listPlacement: 'top' @@ -505,6 +529,7 @@ test('when listPlacement is set to bottom the list should be below the input', a const select = new Select({ target, props: { + config, items, listOpen: true, listPlacement: 'bottom' @@ -527,6 +552,7 @@ test('blur should close list and remove focus from select', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -543,6 +569,7 @@ test('selecting item should close list but keep focus on select', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -560,6 +587,7 @@ test('clicking Select with selected item should open list with item listed as ac const select = new Select({ target, props: { + config, items } }); @@ -580,6 +608,7 @@ test('focus on Select input updates focus state', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -594,14 +623,16 @@ test('key up and down when Select focused opens list', async (t) => { const select = new Select({ target, props: { + config, items } }); - document.querySelector('.select-container input').focus(); + const input = document.querySelector('.select-container input'); + input.focus(); await wait(0); t.ok(select.isFocused); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); await wait(0); t.ok(document.querySelector('.list')); @@ -612,14 +643,15 @@ test('List should keep width of parent Select', async (t) => { const select = new Select({ target, props: { + config, items, isFocused: true } }); - document.querySelector('.select-container input').focus(); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + const input = document.querySelector('.select-container input'); + input.focus(); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); await wait(0); const selectContainer = document.querySelector('.select-container'); const listContainer = document.querySelector('.list'); @@ -635,6 +667,7 @@ test('Placeholder text should reappear when List is closed', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -652,6 +685,7 @@ test('typing in Select filter will hide selected Item', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -670,6 +704,7 @@ test('clearing selected item closes List if open', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -694,6 +729,7 @@ test('closing List clears Select filter text', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -716,6 +752,7 @@ test('closing List clears Select filter text', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -738,6 +775,7 @@ test('closing List item clears Select filter text', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -757,6 +795,7 @@ test('typing while Select is focused populates Select filter text', async (t) => const select = new Select({ target, props: { + config, items } }); @@ -776,6 +815,7 @@ test('Select input placeholder wipes while item is selected', async (t) => { const select = new Select({ target, props: { + config, items, value: {name: 'Item #2'}, } @@ -791,6 +831,7 @@ test('Select listOpen state controls List', async (t) => { const select = new Select({ target, props: { + config, items, listOpen: true } @@ -808,6 +849,7 @@ test('clicking Select toggles List open state', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -825,6 +867,7 @@ test('Select filter text filters list', async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -840,6 +883,7 @@ test('Select filter text filters list with itemFilter', async (t) => { const select = new Select({ target, props: { + config, items, itemFilter: (label, filterText, option) => label === 'Ice Cream' } @@ -856,6 +900,7 @@ test('Typing in the Select filter opens List', async (t) => { const select = new Select({ target, props: { + config, items, isFocused: true } @@ -870,6 +915,7 @@ test('While filtering, the first item in List should receive hover class', async const select = new Select({ target, props: { + config, items, isFocused: true } @@ -885,6 +931,7 @@ test('Select container styles can be overridden', async (t) => { const select = new Select({ target, props: { + config, items, value: {name: 'Item #2'}, containerStyles: `padding-left: 40px;` @@ -899,6 +946,7 @@ test('Select can be disabled', async (t) => { const select = new Select({ target, props: { + config, items, isDisabled: true, } @@ -913,6 +961,7 @@ test('Select List closes when you click enter', async (t) => { const select = new Select({ target, props: { + config, items, isFocused: true } @@ -930,6 +979,7 @@ test('tabbing should move between tabIndexes and others Selects', async (t) => { const select = new Select({ target, props: { + config, items, isFocused: false } @@ -938,6 +988,7 @@ test('tabbing should move between tabIndexes and others Selects', async (t) => { const other = new Select({ target: extraTarget, props: { + config, items, isFocused: false } @@ -954,6 +1005,7 @@ test(`shouldn't be able to clear a disabled Select`, async (t) => { const select = new Select({ target, props: { + config, items, isDisabled: true, value: {name: 'Item #4'} @@ -970,6 +1022,7 @@ test(`two way binding between Select and it's parent component`, async (t) => { const parent = new ParentContainer({ target, props: { + config, items, value: {value: 'chips', label: 'Chips'}, } @@ -1000,6 +1053,7 @@ test(`show ellipsis for overflowing text in a List item`, async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: [ { @@ -1024,30 +1078,42 @@ test(`show ellipsis for overflowing text in a List item`, async (t) => { target.style.width = ''; }); -test('focusing in an external textarea should close and blur it', async (t) => { +test.only('focusing in an external textarea should close and blur it', async (t) => { const textarea = document.createElement('textarea'); document.body.appendChild(textarea); + const select = new Select({ target, props: { + config, items, + } }); - await querySelectorClick('.select-container'); + // await querySelectorClick('.select-container'); + const input = document.querySelector('.select-container input'); + input.focus(); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); t.ok(select.listOpen); - textarea.focus(); - await wait(0); - t.ok(!select.listOpen); - textarea.remove(); - select.$destroy(); + // await wait(100); + // document.querySelector('.select-container input').blur(); + + await wait(0); + + textarea.focus(); + // await wait(0); + // t.ok(!select.listOpen); + // textarea.remove(); + // select.$destroy(); }); test('clicking between Selects should close and blur other Select', async (t) => { const select = new Select({ target, props: { + config, items, isFocused: false } @@ -1056,6 +1122,7 @@ test('clicking between Selects should close and blur other Select', async (t) => const other = new Select({ target: extraTarget, props: { + config, items, isFocused: false } @@ -1081,6 +1148,7 @@ test('if only one item in list it should have hover state', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: [{ index: 0, @@ -1098,6 +1166,7 @@ test(`hovered item in a filtered list shows hover state`, async (t) => { const select = new Select({ target, props: { + config, items } }); @@ -1116,6 +1185,7 @@ test(`data shouldn't be stripped from item - currently only saves name`, async ( const select = new Select({ target, props: { + config, items } }); @@ -1131,6 +1201,7 @@ test('should not be able to clear when clearing is disabled', async (t) => { const select = new Select({ target, props: { + config, items, isClearable: false } @@ -1149,6 +1220,7 @@ test('should not be able to search when searching is disabled', async (t) => { const select = new Select({ target, props: { + config, items, isSearchable: false } @@ -1169,6 +1241,7 @@ test('placeholder should be prop value', async (t) => { const select = new Select({ target, props: { + config, items: itemsWithGroup, placeholder } @@ -1187,6 +1260,7 @@ test('should display loading icon when waiting is enabled', async (t) => { const select = new Select({ target, props: { + config, LoadingIcon, items, isWaiting: true @@ -1202,6 +1276,7 @@ test('inputStyles prop applies css to select input', async (t) => { const select = new Select({ target, props: { + config, items, value: {value: 'pizza', label: 'Pizza'}, inputStyles: `padding-left: 40px;` @@ -1216,6 +1291,7 @@ test('items should be grouped by groupBy expression', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithGroup, groupBy @@ -1238,6 +1314,7 @@ test('clicking group header should not make a selected', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1256,6 +1333,7 @@ test('clicking an item with selectable: false should not make a selected', async const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithSelectable } @@ -1278,6 +1356,7 @@ test('clicking an item with selectable not specified should make a selected', as const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithSelectable } @@ -1296,6 +1375,7 @@ test('clicking an item with selectable: true should make a selected', async (t) const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithSelectable } @@ -1311,6 +1391,7 @@ test('when groupBy, no active item and keydown enter is fired then list should c const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1329,6 +1410,7 @@ test('when isGroupHeaderSelectable clicking group header should select createGro const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithGroup, isGroupHeaderSelectable: true, @@ -1366,6 +1448,7 @@ test('group headers label should be created by getGroupHeaderLabel(item)', async const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithGroup, groupBy, @@ -1394,6 +1477,7 @@ test('groups should be sorted by expression', async (t) => { const select = new Select({ target, props: { + config, listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group, @@ -1413,7 +1497,7 @@ test('when isMulti is true show each item in value', async (t) => { const select = new Select({ target, props: { - Multi, + config, isMulti: true, items, value: [ @@ -1434,7 +1518,7 @@ test('when isMulti is true and value is undefined show placeholder text', async const select = new Select({ target, props: { - Multi, + config, isMulti: true, items, value: undefined @@ -1450,7 +1534,7 @@ test('when isMulti is true clicking item in List will populate value', async (t) const select = new Select({ target, props: { - Multi, + config, isMulti: true, items, value: undefined @@ -1469,7 +1553,7 @@ test('when isMulti is true items in value will not appear in List', async (t) => const select = new Select({ target, props: { - Multi, + config, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1492,8 +1576,8 @@ test('when isMulti is true both value and filterText filters List', async (t) => const select = new Select({ target, props: { + config, listOpen: true, - Multi, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1513,7 +1597,7 @@ test('when isMulti is true clicking X on a selected item will remove it from val const select = new Select({ target, props: { - Multi, + config, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] @@ -1530,7 +1614,7 @@ test('when isMulti is true and all selected items have been removed then placeho const select = new Select({ target, props: { - Multi, + config, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1546,7 +1630,7 @@ test('when isMulti is true and items are selected then clear all should wipe all const select = new Select({ target, props: { - Multi, + config, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] @@ -1563,7 +1647,7 @@ test('when isMulti and groupBy is active then items should be selectable', async const select = new Select({ target, props: { - Multi, + config, isMulti: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1578,11 +1662,11 @@ test('when isMulti and groupBy is active then items should be selectable', async select.$destroy(); }); -test.only('when isMulti and selected items reach edge of container then Select height should increase and selected items should wrap to new line', async (t) => { +test('when isMulti and selected items reach edge of container then Select height should increase and selected items should wrap to new line', async (t) => { const select = new Select({ target, props: { - Multi, + config, isMulti: true, items } @@ -1592,14 +1676,14 @@ test.only('when isMulti and selected items reach edge of container then Select h t.ok(document.querySelector('.select-container').scrollHeight === 42); await handleSet(select, {value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}]}); t.ok(document.querySelector('.select-container').scrollHeight > 44); - // select.$destroy(); + select.$destroy(); }); test('when isMulti and value is populated then navigating with LeftArrow updates activeValue', async (t) => { const select = new Select({ target, props: { - Multi, + config, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], @@ -1616,2191 +1700,2269 @@ test('when isMulti and value is populated then navigating with LeftArrow updates select.$destroy(); }); -test('when isMulti and value is populated then navigating with ArrowRight updates activeValue', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], - isFocused: true - } - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowRight'})); - t.ok(select.$capture_state().activeValue === 1); +// test('when isMulti and value is populated then navigating with ArrowRight updates activeValue', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], +// isFocused: true +// } +// }); - select.$destroy(); -}); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowRight'})); +// t.ok(select.$capture_state().activeValue === 1); -test('when isMulti and value has items and list opens then first item in list should be active', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - isFocused: true - } - }); +// select.$destroy(); +// }); - await querySelectorClick('.select-container'); - await querySelectorClick('.list-item'); - await handleKeyboard('ArrowDown'); +// test('when isMulti and value has items and list opens then first item in list should be active', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// isFocused: true +// } +// }); - t.ok(document.querySelector('.list-item .hover')); +// await querySelectorClick('.select-container'); +// await querySelectorClick('.list-item'); +// await handleKeyboard('ArrowDown'); - select.$destroy(); -}); +// t.ok(document.querySelector('.list-item .hover')); -test('when isMulti, isDisabled, and value has items then items should be locked', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - isDisabled: true, - value: [{value: 'chocolate', label: 'Chocolate'}], - } - }); +// select.$destroy(); +// }); - t.ok(document.querySelector('.multiSelectItem.disabled')); +// test('when isMulti, isDisabled, and value has items then items should be locked', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// isDisabled: true, +// value: [{value: 'chocolate', label: 'Chocolate'}], +// } +// }); - select.$destroy(); -}); +// t.ok(document.querySelector('.multiSelectItem.disabled')); -test('when isMulti is true show each item in value if simple arrays are used', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items: ['pizza', 'chips', 'chocolate'], - value: ['pizza', 'chocolate'] - } - }); +// select.$destroy(); +// }); - const all = target.querySelectorAll('.multiSelectItem .multiSelectItem_label'); - t.ok(all[0].innerHTML === 'pizza'); - t.ok(all[1].innerHTML === 'chocolate'); +// test('when isMulti is true show each item in value if simple arrays are used', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items: ['pizza', 'chips', 'chocolate'], +// value: ['pizza', 'chocolate'] +// } +// }); - select.$destroy(); -}); +// const all = target.querySelectorAll('.multiSelectItem .multiSelectItem_label'); +// t.ok(all[0].innerHTML === 'pizza'); +// t.ok(all[1].innerHTML === 'chocolate'); +// select.$destroy(); +// }); -test('when labelIdentifier is set you can pass a string and see the right label', async (t) => { - const select = new Select({ - target, - props: { - items: [{id: 0, name: 'ONE'}, {id: 1, name: 'TWO'}], - value: {id: 0, name: 'ONE'}, - optionIdentifier: 'id', - labelIdentifier: 'name', - } - }); - t.ok(document.querySelector('.selection').innerHTML === 'ONE'); +// test('when labelIdentifier is set you can pass a string and see the right label', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: [{id: 0, name: 'ONE'}, {id: 1, name: 'TWO'}], +// value: {id: 0, name: 'ONE'}, +// optionIdentifier: 'id', +// labelIdentifier: 'name', +// } +// }); - select.$destroy(); -}); +// t.ok(document.querySelector('.selection').innerHTML === 'ONE'); +// select.$destroy(); +// }); -test('when getValue method is set should use that key to update value', async (t) => { - const select = new Select({ - target, - props: { - items: [{id: 0, label: 'ONE'}, {id: 1, label: 'TWO'}], - value: {id: 0, label: 'ONE'}, - optionIdentifier: 'id' - } - }); - t.ok(select.value.id === 0); - await querySelectorClick('.select-container'); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.value.id === 1); +// test('when getValue method is set should use that key to update value', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: [{id: 0, label: 'ONE'}, {id: 1, label: 'TWO'}], +// value: {id: 0, label: 'ONE'}, +// optionIdentifier: 'id' +// } +// }); - select.$destroy(); -}); +// t.ok(select.value.id === 0); +// await querySelectorClick('.select-container'); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// t.ok(select.value.id === 1); -test('when loadOptions method is supplied and filterText has length then items should populate via promise resolve', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - Item: CustomItem, - Selection: CustomItem - } - }); +// select.$destroy(); +// }); - await wait(0); - select.$set({filterText: 'Juniper'}); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// test('when loadOptions method is supplied and filterText has length then items should populate via promise resolve', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// getOptionLabel: (option) => option.name, +// loadOptions: getPosts, +// optionIdentifier: 'id', +// Item: CustomItem, +// Selection: CustomItem +// } +// }); - select.$destroy(); -}); +// await wait(0); +// select.$set({filterText: 'Juniper'}); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -test('when noOptionsMessage is set and there are no items then show message', async (t) => { - const select = new Select({ - target, - props: { - noOptionsMessage: 'SO SO SO SCANDALOUS', - isFocused: true - } - }); +// select.$destroy(); +// }); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - await wait(0); - t.ok(document.querySelector('.empty').innerHTML === 'SO SO SO SCANDALOUS'); +// test('when noOptionsMessage is set and there are no items then show message', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// noOptionsMessage: 'SO SO SO SCANDALOUS', +// isFocused: true +// } +// }); - select.$destroy(); -}); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); +// await wait(0); +// t.ok(document.querySelector('.empty').innerHTML === 'SO SO SO SCANDALOUS'); -test('when getSelectionLabel method is supplied and value are no items then display result of getSelectionLabel', async (t) => { - const select = new Select({ - target, - props: { - getSelectionLabel: (option) => option.notLabel, - value: {notLabel: 'This is not a label', value: 'not important'}, - } - }); +// select.$destroy(); +// }); +// test('when getSelectionLabel method is supplied and value are no items then display result of getSelectionLabel', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// getSelectionLabel: (option) => option.notLabel, +// value: {notLabel: 'This is not a label', value: 'not important'}, +// } +// }); - t.ok(document.querySelector('.selection').innerHTML === 'This is not a label'); - select.$destroy(); -}); +// t.ok(document.querySelector('.selection').innerHTML === 'This is not a label'); -test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.notLabel, - isFocused: true, - items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], - } - }); +// select.$destroy(); +// }); - await handleKeyboard('ArrowDown'); - t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); +// test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// getOptionLabel: (option) => option.notLabel, +// isFocused: true, +// items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], +// } +// }); - select.$destroy(); -}); +// await handleKeyboard('ArrowDown'); +// t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); -test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.notLabel, - isFocused: true, - items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], - } - }); +// select.$destroy(); +// }); - await handleKeyboard('ArrowDown'); - t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); +// test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// getOptionLabel: (option) => option.notLabel, +// isFocused: true, +// items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], +// } +// }); - select.$destroy(); -}); +// await handleKeyboard('ArrowDown'); +// t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); +// select.$destroy(); +// }); -test('when a custom Item component is supplied then use to display each item', async (t) => { - const select = new Select({ - target, - props: { - Item: CustomItem, - getOptionLabel: (option) => option.name, - isFocused: true, - items: [{ - image_url: 'https://images.punkapi.com/v2/keg.png', - name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], - } - }); - await handleKeyboard('ArrowDown'); - t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); +// test('when a custom Item component is supplied then use to display each item', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// Item: CustomItem, +// getOptionLabel: (option) => option.name, +// isFocused: true, +// items: [{ +// image_url: 'https://images.punkapi.com/v2/keg.png', +// name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], +// } +// }); - select.$destroy(); -}); +// await handleKeyboard('ArrowDown'); +// t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); -test('when a custom Selection component is supplied then use to display selection', async (t) => { - const select = new Select({ - target, - props: { - Item: CustomItem, - Selection: CustomItem, - getOptionLabel: (option) => option.name, - isFocused: true, - items: [{ - image_url: 'https://images.punkapi.com/v2/keg.png', - name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], - } - }); +// select.$destroy(); +// }); - await handleKeyboard('ArrowDown'); - await handleKeyboard('Enter'); +// test('when a custom Selection component is supplied then use to display selection', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// Item: CustomItem, +// Selection: CustomItem, +// getOptionLabel: (option) => option.name, +// isFocused: true, +// items: [{ +// image_url: 'https://images.punkapi.com/v2/keg.png', +// name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], +// } +// }); - t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); +// await handleKeyboard('ArrowDown'); +// await handleKeyboard('Enter'); - select.$destroy(); -}); +// t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); -test('when loadOptions method is supplied, isMulti is true and filterText has length then items should populate via promise resolve', async (t) => { - const select = new Select({ - target, - props: { - Multi, - getOptionLabel: (option) => option.name, - getSelectionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - Item: CustomItem, - isMulti: true - } - }); +// select.$destroy(); +// }); - await wait(0); - await handleSet(select, {filterText: 'Juniper'}); - await wait(600); - await handleKeyboard('ArrowDown'); - await handleKeyboard('Enter'); - t.ok(document.querySelector('.multiSelectItem_label').innerHTML === 'Juniper Wheat Beer'); - select.$destroy(); -}); - -test('when getSelectionLabel contains HTML then render the HTML', async (t) => { - const select = new Select({ - target, - props: { - value: items[0], - getSelectionLabel: (option) => `

${option.label}

`, - } - }); - - t.ok(document.querySelector('.selection').innerHTML === '

Chocolate

'); +// test('when loadOptions method is supplied, isMulti is true and filterText has length then items should populate via promise resolve', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// getOptionLabel: (option) => option.name, +// getSelectionLabel: (option) => option.name, +// loadOptions: getPosts, +// optionIdentifier: 'id', +// Item: CustomItem, +// isMulti: true +// } +// }); - select.$destroy(); -}); +// await wait(0); +// await handleSet(select, {filterText: 'Juniper'}); +// await wait(600); +// await handleKeyboard('ArrowDown'); +// await handleKeyboard('Enter'); +// t.ok(document.querySelector('.multiSelectItem_label').innerHTML === 'Juniper Wheat Beer'); +// select.$destroy(); +// }); -test('when getOptionLabel contains HTML then render the HTML', async (t) => { - const select = new Select({ - target, - props: { - items, - getOptionLabel: (option) => `

${option.label}

`, - isFocused: true - } - }); +// test('when getSelectionLabel contains HTML then render the HTML', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// value: items[0], +// getSelectionLabel: (option) => `

${option.label}

`, +// } +// }); - await handleKeyboard('ArrowDown'); - t.ok(document.querySelector('.item').innerHTML === '

Chocolate

'); +// t.ok(document.querySelector('.selection').innerHTML === '

Chocolate

'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when isMulti is true, value populated and arrowLeft is pressed then no items in list should be active', async (t) => { - const selectMultiSelected = new SelectMultiSelected({ - target: testTarget, - }); +// test('when getOptionLabel contains HTML then render the HTML', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// getOptionLabel: (option) => `

${option.label}

`, +// isFocused: true +// } +// }); - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'chips', label: 'Chips'}, - ], - isFocused: true +// await handleKeyboard('ArrowDown'); +// t.ok(document.querySelector('.item').innerHTML === '

Chocolate

'); - } - }); +// select.$destroy(); +// }); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - t.ok(!document.querySelector('.hover')); - select.$destroy(); - selectMultiSelected.$destroy(); -}); +// test('when isMulti is true, value populated and arrowLeft is pressed then no items in list should be active', async (t) => { +// const selectMultiSelected = new SelectMultiSelected({ +// target: testTarget, +// }); -test('when hideEmptyState true then do not show "no options" div ', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true, - filterText: 'x', - hideEmptyState: true - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// value: [ +// {value: 'pizza', label: 'Pizza'}, +// {value: 'chips', label: 'Chips'}, +// ], +// isFocused: true +// } +// }); - await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); +// t.ok(!document.querySelector('.hover')); +// select.$destroy(); +// selectMultiSelected.$destroy(); +// }); - t.ok(!document.querySelector('.empty')); +// test('when hideEmptyState true then do not show "no options" div ', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// listOpen: true, +// filterText: 'x', +// hideEmptyState: true +// } +// }); - select.$destroy(); -}); +// await wait(0); -test('when value changes then select event should fire', async (t) => { - const select = new Select({ - target, - props: { - items, - } - }); +// t.ok(!document.querySelector('.empty')); - let selectEvent = undefined; +// select.$destroy(); +// }); - select.$on('select', event => { - selectEvent = event; - }); +// test('when value changes then select event should fire', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// } +// }); - await handleSet(select, {isFocused: true}); - await handleKeyboard('ArrowDown'); - await handleKeyboard('Enter'); +// let selectEvent = undefined; - t.ok(selectEvent); +// select.$on('select', event => { +// selectEvent = event; +// }); - select.$destroy(); -}); +// await handleSet(select, {isFocused: true}); +// await handleKeyboard('ArrowDown'); +// await handleKeyboard('Enter'); -test('when value is cleared the clear event is fired', async (t) => { - const select = new Select({ - target, - props: { - items, - value: items[0], - } - }); +// t.ok(selectEvent); - let clearEvent = false; - select.$on('clear', () => { - clearEvent = true; - }); +// select.$destroy(); +// }); - document.querySelector('.clearSelect').click(); - t.ok(clearEvent); +// test('when value is cleared the clear event is fired', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: items[0], +// } +// }); - select.$destroy(); -}); +// let clearEvent = false; +// select.$on('clear', () => { +// clearEvent = true; +// }); -test('when multi item is cleared the clear event is fired with removed item', async (t) => { - const itemToRemove = items[0]; +// document.querySelector('.clearSelect').click(); +// t.ok(clearEvent); - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - value: [itemToRemove] - } - }); +// select.$destroy(); +// }); - let removedItem; +// test('when multi item is cleared the clear event is fired with removed item', async (t) => { +// const itemToRemove = items[0]; - select.$on('clear', (event) => { - removedItem = event.detail; - }); +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// value: [itemToRemove] +// } +// }); - document.querySelector('.multiSelectItem_clear').click(); - t.equal(JSON.stringify(removedItem), JSON.stringify(itemToRemove)); +// let removedItem; - select.$destroy(); -}); +// select.$on('clear', (event) => { +// removedItem = event.detail; +// }); -test('when items in list filter or update then first item in list should highlight', async (t) => { - const select = new Select({ - target, - props: { - items, - isFocused: true - } - }); +// document.querySelector('.multiSelectItem_clear').click(); +// t.equal(JSON.stringify(removedItem), JSON.stringify(itemToRemove)); - await handleKeyboard('ArrowDown'); - await handleKeyboard('ArrowDown'); - await handleKeyboard('ArrowDown'); +// select.$destroy(); +// }); - t.ok(document.querySelector('.hover').innerHTML === 'Cake'); - await handleSet(select, {filterText: 'c'}); - t.ok(document.querySelector('.hover').innerHTML === 'Chocolate'); +// test('when items in list filter or update then first item in list should highlight', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isFocused: true +// } +// }); - select.$destroy(); -}); +// await handleKeyboard('ArrowDown'); +// await handleKeyboard('ArrowDown'); +// await handleKeyboard('ArrowDown'); -test('when item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'cake', label: 'Cake'} - } - }); +// t.ok(document.querySelector('.hover').innerHTML === 'Cake'); +// await handleSet(select, {filterText: 'c'}); +// t.ok(document.querySelector('.hover').innerHTML === 'Chocolate'); - let item = undefined; +// select.$destroy(); +// }); - select.$on('select', () => { - item = true; - }); +// test('when item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: {value: 'cake', label: 'Cake'} +// } +// }); - await handleSet(select, {value: {value: 'cake', label: 'Cake'}}); +// let item = undefined; - t.ok(!item) - select.$destroy(); -}); +// select.$on('select', () => { +// item = true; +// }); -test('when isMulti and item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'chips', label: 'Chips'}, - ], - } - }); +// await handleSet(select, {value: {value: 'cake', label: 'Cake'}}); - let item = undefined; +// t.ok(!item) +// select.$destroy(); +// }); - select.$on('select', () => { - item = true; - }); +// test('when isMulti and item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// value: [ +// {value: 'pizza', label: 'Pizza'}, +// {value: 'chips', label: 'Chips'}, +// ], +// } +// }); - await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'},{value: 'chips', label: 'Chips'}]}); - t.ok(!item); - item = false; - await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'}]}); +// let item = undefined; - t.ok(item); - select.$destroy(); -}); +// select.$on('select', () => { +// item = true; +// }); -test('when isFocused turns to false then check Select is no longer in focus', async (t) => { - const select = new Select({ - target, - props: { - isFocused: true, - items, - } - }); +// await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'},{value: 'chips', label: 'Chips'}]}); +// t.ok(!item); +// item = false; +// await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'}]}); - const selectSecond = new Select({ - target: extraTarget, - props: { - isFocused: false, - items, - } - }); +// t.ok(item); +// select.$destroy(); +// }); - select.$on('select', () => { - setTimeout(() => { - select.$set({ - isFocused: false, - }) - }, 0) +// test('when isFocused turns to false then check Select is no longer in focus', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isFocused: true, +// items, +// } +// }); - selectSecond.$set({ - isFocused: true - }) - }); +// const selectSecond = new Select({ +// target: extraTarget, +// props: { +// config, +// isFocused: false, +// items, +// } +// }); - await handleSet(select, {value: {value: 'pizza', label: 'Pizza'}}); +// select.$on('select', () => { +// setTimeout(() => { +// select.$set({ +// isFocused: false, +// }) +// }, 0) +// selectSecond.$set({ +// isFocused: true +// }) +// }); - await wait(0); +// await handleSet(select, {value: {value: 'pizza', label: 'Pizza'}}); - t.ok(selectSecond.isFocused); - t.ok(!select.isFocused); - selectSecond.$destroy(); - select.$destroy(); -}); +// await wait(0); -test('when items and loadOptions method are both supplied then fallback to items until filterText changes', async (t) => { - const _items = [{name: 'test1', id: 0}, {name: 'test2', id: 1}, {name: 'test3', id: 2}]; +// t.ok(selectSecond.isFocused); +// t.ok(!select.isFocused); - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.name, - getSelectionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - items: _items, - isFocused: true, - listOpen: true - } - }); +// selectSecond.$destroy(); +// select.$destroy(); +// }); - await wait(0); - t.ok(document.querySelector('.item').innerHTML === 'test1'); - await handleSet(select, {filterText: 'Juniper'}); - await wait(500); - t.ok(document.querySelector('.item').innerHTML === 'Juniper Wheat Beer'); +// test('when items and loadOptions method are both supplied then fallback to items until filterText changes', async (t) => { +// const _items = [{name: 'test1', id: 0}, {name: 'test2', id: 1}, {name: 'test3', id: 2}]; - select.$destroy(); -}); +// const select = new Select({ +// target, +// props: { +// config, +// getOptionLabel: (option) => option.name, +// getSelectionLabel: (option) => option.name, +// loadOptions: getPosts, +// optionIdentifier: 'id', +// items: _items, +// isFocused: true, +// listOpen: true +// } +// }); -test('when items is just an array of strings then render list', async (t) => { - const items = ['one', 'two', 'three']; +// await wait(0); +// t.ok(document.querySelector('.item').innerHTML === 'test1'); +// await handleSet(select, {filterText: 'Juniper'}); +// await wait(500); +// t.ok(document.querySelector('.item').innerHTML === 'Juniper Wheat Beer'); - const select = new Select({ - target, - props: { - items, - listOpen: true - } - }); +// select.$destroy(); +// }); - await wait(0); - t.ok(document.querySelector('.item').innerHTML === 'one'); +// test('when items is just an array of strings then render list', async (t) => { +// const items = ['one', 'two', 'three']; - select.$destroy(); -}); +// const select = new Select({ +// target, +// props: { +// config, +// items, +// listOpen: true +// } +// }); -test('when items are just strings then value should render', async (t) => { - const items = ['one', 'two', 'three']; +// await wait(0); +// t.ok(document.querySelector('.item').innerHTML === 'one'); - const select = new Select({ - target, - props: { - items, - value: {value: 'one', label: 'one', index: 0} - } - }); +// select.$destroy(); +// }); - t.ok(document.querySelector('.selection').innerHTML === 'one'); - select.$destroy(); -}); +// test('when items are just strings then value should render', async (t) => { +// const items = ['one', 'two', 'three']; -// test('when isVirtualList then render list', async (t) => { -// function fill(len, fn) { -// return Array(len).fill().map((_, i) => fn(i)); -// } +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: {value: 'one', label: 'one', index: 0} +// } +// }); -// const items = fill(10000, (i) => { -// const name = getName(); -// return name +// t.ok(document.querySelector('.selection').innerHTML === 'one'); +// select.$destroy(); +// }); + +// // test('when isVirtualList then render list', async (t) => { +// // function fill(len, fn) { +// // return Array(len).fill().map((_, i) => fn(i)); +// // } + +// // const items = fill(10000, (i) => { +// // const name = getName(); +// // return name +// // }); + +// // const select = new Select({ +// // target, +// // props: { +// // config, +// // items, +// // isVirtualList: true, +// // listOpen: true +// // } +// // }); + +// // await wait(0); +// // t.ok(document.querySelector('.list-item')); + +// // select.$destroy(); +// // }); + +// // test('when isVirtualList and filterText changes then rendered list scrolls to top', async (t) => { +// // function fill(len, fn) { +// // return Array(len).fill().map((_, i) => fn(i)); +// // } + +// // const items = fill(10000, (i) => { +// // const name = getName(); +// // return name +// // }); + +// // const select = new Select({ +// // target, +// // props: { +// // config, +// // items, +// // isVirtualList: true, +// // listOpen: true +// // } +// // }); + +// // await wait(0); +// // const virtual = document.querySelector('svelte-virtual-list-viewport'); +// // virtual.scrollTop = 120000; + +// // select.$set({ +// // filterText: 'swift' +// // }); + +// // await wait(0); +// // t.ok(virtual.scrollTop === 0); + +// // select.$destroy(); +// // }); + +// test('when isMulti and value has items then check each item is unique', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// value: [ +// {value: 'pizza', label: 'Pizza'}, +// {value: 'pizza', label: 'Pizza'}, +// {value: 'cake', label: 'Cake'}, +// ], +// } // }); +// t.ok(select.value.length === 2); + +// select.$destroy(); +// }); + +// test('when isMulti and textFilter has length then enter should select item', async (t) => { // const select = new Select({ // target, // props: { +// config, +// isMulti: true, // items, -// isVirtualList: true, +// isFocused: true, +// filterText: 'p', // listOpen: true // } // }); // await wait(0); -// t.ok(document.querySelector('.list-item')); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// t.ok(select.value[0].value === 'pizza'); // select.$destroy(); // }); -// test('when isVirtualList and filterText changes then rendered list scrolls to top', async (t) => { -// function fill(len, fn) { -// return Array(len).fill().map((_, i) => fn(i)); -// } - -// const items = fill(10000, (i) => { -// const name = getName(); -// return name +// test('when isMulti and textFilter has length and no items in list then enter should do nothing', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// isFocused: true, +// filterText: 'zc', +// listOpen: true +// } // }); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// t.ok(!select.value); + +// select.$destroy(); +// }); + +// test('When isMulti and no selected item then delete should do nothing', async (t) => { // const select = new Select({ // target, // props: { +// config, +// isMulti: true, // items, -// isVirtualList: true, +// isFocused: true, // listOpen: true // } // }); // await wait(0); -// const virtual = document.querySelector('svelte-virtual-list-viewport'); -// virtual.scrollTop = 120000; +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Backspace'})); +// t.ok(select.listOpen === true); -// select.$set({ -// filterText: 'swift' +// select.$destroy(); +// }); + +// test('When list is open, filterText applied and Enter/Tab key pressed should select and show highlighted value', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// listOpen: true, +// isFocused: true, +// filterText: 'A5', +// items: ['A5', 'test string', 'something else'] +// } // }); // await wait(0); -// t.ok(virtual.scrollTop === 0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// t.equal(select.value.value, 'A5'); +// await wait(0); +// t.ok(target.querySelector('.selected-item .selection').innerHTML === 'A5'); // select.$destroy(); // }); -test('when isMulti and value has items then check each item is unique', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - ], - } - }); - - t.ok(select.value.length === 2); - select.$destroy(); -}); +// test('When inputAttributes is supplied each attribute is placed on the Select input field', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// inputAttributes: { +// id: 'testId', +// autocomplete: 'custom-value' +// } +// } +// }); -test('when isMulti and textFilter has length then enter should select item', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - isFocused: true, - filterText: 'p', - listOpen: true - } - }); +// const el = document.getElementById('testId'); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(select.value[0].value === 'pizza'); +// t.equal(el.id, 'testId'); +// t.equal(el.getAttribute('autocomplete'), 'custom-value'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when isMulti and textFilter has length and no items in list then enter should do nothing', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - isFocused: true, - filterText: 'zc', - listOpen: true - } - }); +// test('when items and value supplied as just strings then value should render correctly', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: ['Pizza', 'Chocolate', 'Crisps'], +// value: 'Pizza' +// } +// }); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(!select.value); +// t.equal(document.querySelector('.selected-item .selection').innerHTML, 'Pizza'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isMulti and no selected item then delete should do nothing', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - isFocused: true, - listOpen: true - } - }); +// test('when isMulti with items and value supplied as just strings then value should render correctly', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items: ['Pizza', 'Chocolate', 'Crisps'], +// value: ['Pizza'] +// } +// }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Backspace'})); - t.ok(select.listOpen === true); +// t.equal(document.querySelector('.multiSelectItem_label').innerHTML, 'Pizza'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When list is open, filterText applied and Enter/Tab key pressed should select and show highlighted value', async (t) => { - const select = new Select({ - target, - props: { - listOpen: true, - isFocused: true, - filterText: 'A5', - items: ['A5', 'test string', 'something else'] - } - }); +// test('when isMulti, groupBy and value are supplied then list should be filtered', async (t) => { +// let _items = [ +// { id: 1, name: "Foo", group: "first" }, +// { id: 2, name: "Bar", group: "second" }, +// { id: 3, name: "Baz", group: "second" }, +// { id: 4, name: "Qux", group: "first" }, +// { id: 5, name: "Bah", group: "first" }, +// ]; - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(select.value.value, 'A5'); - await wait(0); - t.ok(target.querySelector('.selected-item .selection').innerHTML === 'A5'); +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items: _items, +// groupBy: (item) => item.group, +// optionIdentifier: 'id', +// getSelectionLabel: (item) => item.name, +// getOptionLabel: (item) => item.name, +// value: [{ id: 2, name: "Bar", group: "second" }], +// listOpen: true +// } +// }); - select.$destroy(); -}); +// t.ok(!select.getFilteredItems().find(item => item.name === 'Bar')); +// select.$destroy(); +// }); -test('When inputAttributes is supplied each attribute is placed on the Select input field', async (t) => { - const select = new Select({ - target, - props: { - items, - inputAttributes: { - id: 'testId', - autocomplete: 'custom-value' - } - } - }); +// test('When isCreatable disabled, creator is not displayed', async (t) => { +// const filterText = 'abc'; - const el = document.getElementById('testId'); +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isFocused: true, +// listOpen: true +// } +// }); - t.equal(el.id, 'testId'); - t.equal(el.getAttribute('autocomplete'), 'custom-value'); +// select.$set({ filterText }); - select.$destroy(); -}); +// await wait(0); -test('when items and value supplied as just strings then value should render correctly', async (t) => { - const select = new Select({ - target, - props: { - items: ['Pizza', 'Chocolate', 'Crisps'], - value: 'Pizza' - } - }); +// t.ok(document.querySelector('.list > .empty')); - t.equal(document.querySelector('.selected-item .selection').innerHTML, 'Pizza'); +// select.$destroy(); +// }); - select.$destroy(); -}); +// test('When isCreatable enabled, creator displays getOptionLabel for isCreator', async (t) => { +// const filterText = 'abc_XXXX'; -test('when isMulti with items and value supplied as just strings then value should render correctly', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items: ['Pizza', 'Chocolate', 'Crisps'], - value: ['Pizza'] - } - }); +// function getOptionLabel(item, filterText) { +// return item.isCreator ? `Wanna add ${filterText}?`: item.label; +// } - t.equal(document.querySelector('.multiSelectItem_label').innerHTML, 'Pizza'); +// const creatorItem = { label: filterText, value: filterText, isCreator: true }; - select.$destroy(); -}); +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isCreatable: true, +// isFocused: true, +// listOpen: true, +// getOptionLabel +// } +// }); -test('when isMulti, groupBy and value are supplied then list should be filtered', async (t) => { - let _items = [ - { id: 1, name: "Foo", group: "first" }, - { id: 2, name: "Bar", group: "second" }, - { id: 3, name: "Baz", group: "second" }, - { id: 4, name: "Qux", group: "first" }, - { id: 5, name: "Bah", group: "first" }, - ]; +// await wait(0); +// select.$set({ filterText }); +// await wait(0); +// const listItems = document.querySelectorAll('.list > .list-item'); +// t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, getOptionLabel(creatorItem, filterText)); - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items: _items, - groupBy: (item) => item.group, - optionIdentifier: 'id', - getSelectionLabel: (item) => item.name, - getOptionLabel: (item) => item.name, - value: [{ id: 2, name: "Bar", group: "second" }], - listOpen: true - } - }); +// select.$destroy(); +// }); - t.ok(!select.getFilteredItems().find(item => item.name === 'Bar')); +// test('When isCreatable enabled, creator is not displayed when duplicate item value in item list', async (t) => { +// const dupeValueForCheck = 'xxxxxx'; +// const item = { +// value: dupeValueForCheck, +// label: dupeValueForCheck +// }; - select.$destroy(); -}); +// const select = new Select({ +// target, +// props: { +// config, +// items: [item], +// isCreatable: true, +// listOpen: true +// } +// }); -test('When isCreatable disabled, creator is not displayed', async (t) => { - const filterText = 'abc'; +// await wait(0); +// select.$set({ filterText: dupeValueForCheck }); +// await wait(0); - const select = new Select({ - target, - props: { - items, - isFocused: true, - listOpen: true - } - }); +// const listItems = document.querySelectorAll('.list > .list-item'); +// t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, dupeValueForCheck); - select.$set({ filterText }); +// select.$destroy(); +// }); - await wait(0); +// test('When creator selected, selected item is set to created item', async (t) => { +// const filterText = 'abc'; - t.ok(document.querySelector('.list > .empty')); +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isCreatable: true, +// isFocused: true, +// listOpen: true +// } +// }); - select.$destroy(); -}); +// await wait(0); +// select.$set({ filterText }); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -test('When isCreatable enabled, creator displays getOptionLabel for isCreator', async (t) => { - const filterText = 'abc_XXXX'; +// const { value } = select; +// t.ok(value.value === 'abc'); +// t.ok(value.label === 'abc'); - function getOptionLabel(item, filterText) { - return item.isCreator ? `Wanna add ${filterText}?`: item.label; - } +// select.$destroy(); +// }); - const creatorItem = { label: filterText, value: filterText, isCreator: true }; +// test('When creator is selected, created item it added to multi selection', async (t) => { +// const filterText = 'abc'; - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true, - getOptionLabel - } - }); - - await wait(0); - select.$set({ filterText }); - await wait(0); - const listItems = document.querySelectorAll('.list > .list-item'); - t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, getOptionLabel(creatorItem, filterText)); - - select.$destroy(); -}); - -test('When isCreatable enabled, creator is not displayed when duplicate item value in item list', async (t) => { - const dupeValueForCheck = 'xxxxxx'; - const item = { - value: dupeValueForCheck, - label: dupeValueForCheck - }; - - const select = new Select({ - target, - props: { - items: [item], - isCreatable: true, - listOpen: true - } - }); - - await wait(0); - select.$set({ filterText: dupeValueForCheck }); - await wait(0); - - const listItems = document.querySelectorAll('.list > .list-item'); - t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, dupeValueForCheck); - - select.$destroy(); -}); - -test('When creator selected, selected item is set to created item', async (t) => { - const filterText = 'abc'; - - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true - } - }); - - await wait(0); - select.$set({ filterText }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - - const { value } = select; - t.ok(value.value === 'abc'); - t.ok(value.label === 'abc'); - - select.$destroy(); -}); - -test('When creator is selected, created item it added to multi selection', async (t) => { - const filterText = 'abc'; - - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true, - isMulti: true - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isCreatable: true, +// isFocused: true, +// listOpen: true, +// isMulti: true +// } +// }); - await wait(0); - select.$set({ filterText }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// await wait(0); +// select.$set({ filterText }); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - const { value } = select; - t.ok(value[0].value === 'abc'); - t.ok(value[0].label === 'abc'); +// const { value } = select; +// t.ok(value[0].value === 'abc'); +// t.ok(value[0].label === 'abc'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When creator is selected multiple times, items are all added to multi selection', async (t) => { - const filterTextForItem1 = 'abc'; - const filterTextForItem2 = 'def'; +// test('When creator is selected multiple times, items are all added to multi selection', async (t) => { +// const filterTextForItem1 = 'abc'; +// const filterTextForItem2 = 'def'; - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true, - isMulti: true - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isCreatable: true, +// isFocused: true, +// listOpen: true, +// isMulti: true +// } +// }); - await wait(0); - select.$set({ filterText: filterTextForItem1 }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - t.ok(select.value[0].value === 'abc'); +// await wait(0); +// select.$set({ filterText: filterTextForItem1 }); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// await wait(0); +// t.ok(select.value[0].value === 'abc'); - select.$set({ filterText: filterTextForItem2 }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - t.ok(select.value[1].value === 'def'); +// select.$set({ filterText: filterTextForItem2 }); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// await wait(0); +// t.ok(select.value[1].value === 'def'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isMulti and an items remove icon is clicked then item should be removed from value', async (t) => { - const select = new Select({ - target, - props: { - Multi, - items, - isCreatable: true, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - ], - isMulti: true - } - }); +// test('When isMulti and an items remove icon is clicked then item should be removed from value', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isCreatable: true, +// value: [ +// {value: 'pizza', label: 'Pizza'}, +// {value: 'cake', label: 'Cake'}, +// ], +// isMulti: true +// } +// }); - await querySelectorClick('.multiSelectItem_clear'); - t.ok(select.value[0].value === 'cake') - await querySelectorClick('.multiSelectItem_clear'); - t.ok(!select.value); +// await querySelectorClick('.multiSelectItem_clear'); +// t.ok(select.value[0].value === 'cake') +// await querySelectorClick('.multiSelectItem_clear'); +// t.ok(!select.value); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isCreatable with non-default item structure, item creator displays getCreatorLabel label for isCreator', async (t) => { - const _items = [ - {country: 'Italy', food: 'Pizza'}, - {country: 'Australia', food: 'Meat Pie'}, - {country: 'China', food: 'Fried Rice'} - ]; +// test('When isCreatable with non-default item structure, item creator displays getCreatorLabel label for isCreator', async (t) => { +// const _items = [ +// {country: 'Italy', food: 'Pizza'}, +// {country: 'Australia', food: 'Meat Pie'}, +// {country: 'China', food: 'Fried Rice'} +// ]; - const filterText = 'Fried Chicken Roll'; +// const filterText = 'Fried Chicken Roll'; - function creatorLabel(filterText) { - return `Do you want to create ${ filterText } as an added food?`; - } +// function creatorLabel(filterText) { +// return `Do you want to create ${ filterText } as an added food?`; +// } - function itemDisplay(item, filterText) { - return item.isCreator ? creatorLabel(filterText) : `${item.food} (${item.country})`; - } +// function itemDisplay(item, filterText) { +// return item.isCreator ? creatorLabel(filterText) : `${item.food} (${item.country})`; +// } - const select = new Select({ - target, - props: { - optionIdentifier: 'food', - getOptionLabel: itemDisplay, - getSelectionLabel: itemDisplay, - items: _items, - isCreatable: true, - createItem(filterText) { - return { - food: filterText, - country: 'Added' - }; - } - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// optionIdentifier: 'food', +// getOptionLabel: itemDisplay, +// getSelectionLabel: itemDisplay, +// items: _items, +// isCreatable: true, +// createItem(filterText) { +// return { +// food: filterText, +// country: 'Added' +// }; +// } +// } +// }); - await wait(0); - select.$set({ filterText }); - await wait(0); - const listItems = document.querySelectorAll('.list > .list-item'); - t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, creatorLabel(filterText)); +// await wait(0); +// select.$set({ filterText }); +// await wait(0); +// const listItems = document.querySelectorAll('.list > .list-item'); +// t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, creatorLabel(filterText)); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isCreatable and isMulti and optionIdentifier is supplied creator displays getCreatorLabel label', async (t) => { - const filterText = 'abc'; - const _items = [ - {foo: 'chocolate', label: 'Chocolate'}, - {foo: 'pizza', label: 'Pizza'} - ]; +// test('When isCreatable and isMulti and optionIdentifier is supplied creator displays getCreatorLabel label', async (t) => { +// const filterText = 'abc'; +// const _items = [ +// {foo: 'chocolate', label: 'Chocolate'}, +// {foo: 'pizza', label: 'Pizza'} +// ]; - const select = new Select({ - target, - props: { - optionIdentifier: 'foo', - isMulti: true, - items: _items, - isCreatable: true - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// optionIdentifier: 'foo', +// isMulti: true, +// items: _items, +// isCreatable: true +// } +// }); - await wait(0); - select.$set({ filterText }); - await wait(0); - const listItems = document.querySelectorAll('.list > .list-item'); - t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, `Create \"${ filterText }\"`); +// await wait(0); +// select.$set({ filterText }); +// await wait(0); +// const listItems = document.querySelectorAll('.list > .list-item'); +// t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, `Create \"${ filterText }\"`); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isCreatable and isMulti and optionIdentifier is supplied multiple creatable items can be added', async (t) => { - const filterText = 'foo'; - const filterText2 = 'bar'; +// test('When isCreatable and isMulti and optionIdentifier is supplied multiple creatable items can be added', async (t) => { +// const filterText = 'foo'; +// const filterText2 = 'bar'; - const _items = [ - {id: 1, tag_name: 'Banana'}, - {id: 5, tag_name: 'Orange'}, - {id: 4, tag_name: 'Tree'}, - {id: 3, tag_name: 'Guns'}, - {id: 2, tag_name: 'Cars'}, - ]; +// const _items = [ +// {id: 1, tag_name: 'Banana'}, +// {id: 5, tag_name: 'Orange'}, +// {id: 4, tag_name: 'Tree'}, +// {id: 3, tag_name: 'Guns'}, +// {id: 2, tag_name: 'Cars'}, +// ]; - const optionIdentifier = 'tag_name'; - const getOptionLabel = (option) => option.tag_name; - const getSelectionLabel = (option) => option.tag_name; - const createItem = (filterText) => ({id:undefined, tag_name:filterText}); +// const optionIdentifier = 'tag_name'; +// const getOptionLabel = (option) => option.tag_name; +// const getSelectionLabel = (option) => option.tag_name; +// const createItem = (filterText) => ({id:undefined, tag_name:filterText}); - const select = new Select({ - target, - props: { - optionIdentifier, - Multi, - isMulti: true, - items: _items, - isCreatable: true, - getOptionLabel, - getSelectionLabel, - createItem, - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// optionIdentifier, +// isMulti: true, +// items: _items, +// isCreatable: true, +// getOptionLabel, +// getSelectionLabel, +// createItem, +// } +// }); - await wait(0); - select.$set({ filterText }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - select.$set({ filterText: filterText2 }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); +// await wait(0); +// select.$set({ filterText }); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// await wait(0); +// select.$set({ filterText: filterText2 }); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// await wait(0); - t.ok(select.value.length === 2); - t.ok(select.value[0].tag_name); +// t.ok(select.value.length === 2); +// t.ok(select.value[0].tag_name); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isCreatable and item is created then createItem method should only run once', async (t) => { - let createItemRun = 0; - const createItem = (filterText) => { - createItemRun += 1; - return { - value: filterText, - label: filterText - }; - }; +// test('When isCreatable and item is created then createItem method should only run once', async (t) => { +// let createItemRun = 0; +// const createItem = (filterText) => { +// createItemRun += 1; +// return { +// value: filterText, +// label: filterText +// }; +// }; - const select = new Select({ - target, - props: { - isCreatable: true, - items, - createItem - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// isCreatable: true, +// items, +// createItem +// } +// }); - await wait(0); - select.$set({ filterText: 'foo' }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// await wait(0); +// select.$set({ filterText: 'foo' }); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(createItemRun === 2); +// t.ok(createItemRun === 2); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When items are collection and value a string then lookup item using optionIdentifier and update value to match', async (t) => { - const select = new Select({ - target, - props: { - items, - value: 'cake' - } - }); +// test('When items are collection and value a string then lookup item using optionIdentifier and update value to match', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: 'cake' +// } +// }); - await wait(0); - t.ok(select.value.value === 'cake'); - select.$set({ value: 'pizza' }); - await wait(0); - t.ok(select.value.value === 'pizza'); - select.$destroy(); -}); +// await wait(0); +// t.ok(select.value.value === 'cake'); +// select.$set({ value: 'pizza' }); +// await wait(0); +// t.ok(select.value.value === 'pizza'); +// select.$destroy(); +// }); -test('When listAutoWidth is set to false list container should have style of width:100%', async (t) => { - const select = new Select({ - target, - props: { - items, - listAutoWidth: false, - listOpen: true - } - }); +// test('When listAutoWidth is set to false list container should have style of width:100%', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// listAutoWidth: false, +// listOpen: true +// } +// }); - await wait(0); - const listWidth = document.querySelectorAll('.list')[0].style.width; - t.ok(listWidth === '100%'); - select.$destroy(); -}); +// await wait(0); +// const listWidth = document.querySelectorAll('.list')[0].style.width; +// t.ok(listWidth === '100%'); +// select.$destroy(); +// }); -test('When item is already active and is selected from list then close list', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true, - value: 'pizza' - } - }); +// test('When item is already active and is selected from list then close list', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// listOpen: true, +// value: 'pizza' +// } +// }); - await wait(0); - await querySelectorClick('.list > .list-item > .item.active'); - await wait(0); - t.ok(select.value.value === 'pizza'); - select.$destroy(); -}); +// await wait(0); +// await querySelectorClick('.list > .list-item > .item.active'); +// await wait(0); +// t.ok(select.value.value === 'pizza'); +// select.$destroy(); +// }); -test('When Icon prop is supplied then render on Select', async (t) => { - const select = new Select({ - target, - props: { - items, - Icon: TestIcon - } - }); +// test('When Icon prop is supplied then render on Select', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// Icon: TestIcon +// } +// }); - t.ok(document.querySelectorAll('#testIcon')[0]); +// t.ok(document.querySelectorAll('#testIcon')[0]); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When showChevron prop is true only show chevron when there is no value on Select', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'chocolate', label: 'Chocolate'}, - showChevron: true - } - }); +// test('When showChevron prop is true only show chevron when there is no value on Select', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: {value: 'chocolate', label: 'Chocolate'}, +// showChevron: true +// } +// }); - t.ok(document.querySelectorAll('.indicator').length === 0); +// t.ok(document.querySelectorAll('.indicator').length === 0); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When showChevron prop is true and no value show chevron on Select', async (t) => { - const select = new Select({ - target, - props: { - ChevronIcon, - items, - showChevron: true - } - }); +// test('When showChevron prop is true and no value show chevron on Select', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// ChevronIcon, +// items, +// showChevron: true +// } +// }); - t.ok(document.querySelectorAll('.chevron')[0]); +// t.ok(document.querySelectorAll('.chevron')[0]); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When showChevron and isClearable is true always show chevron on Select', async (t) => { - const select = new Select({ - target, - props: { - ChevronIcon, - items, - value: {value: 'chocolate', label: 'Chocolate'}, - showChevron: true, - isClearable: false - } - }); +// test('When showChevron and isClearable is true always show chevron on Select', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// ChevronIcon, +// items, +// value: {value: 'chocolate', label: 'Chocolate'}, +// showChevron: true, +// isClearable: false +// } +// }); - t.ok(document.querySelectorAll('.chevron')[0]); +// t.ok(document.querySelectorAll('.chevron')[0]); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When items and loadItems then listOpen should be false', async (t) => { - const select = new Select({ - target, - props: { - getSelectionLabel: (option) => option.name, - getOptionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - items: [{ - id: 1, - name: 'Initial Items #1' - }] +// test('When items and loadItems then listOpen should be false', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// getSelectionLabel: (option) => option.name, +// getOptionLabel: (option) => option.name, +// loadOptions: getPosts, +// optionIdentifier: 'id', +// items: [{ +// id: 1, +// name: 'Initial Items #1' +// }] - } - }); +// } +// }); - t.ok(select.listOpen === false); +// t.ok(select.listOpen === false); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('Select container classes can be injected', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'cake', label: 'Cake'}, - class: 'select-container testclass', - }, - }); +// test('Select container classes can be injected', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: {value: 'cake', label: 'Cake'}, +// class: 'select-container testclass', +// }, +// }); - t.ok( - document.querySelector('.select-container').classList.contains('testclass') - ); - select.$destroy(); -}); +// t.ok( +// document.querySelector('.select-container').classList.contains('testclass') +// ); +// select.$destroy(); +// }); -test('When noOptionsMessage is changed after List component has been created then propagate update', async (t) => { - const select = new Select({ - target, - props: { - getOptionLabel: (option) => option.name, - loadOptions: getPosts, - optionIdentifier: 'id', - Item: CustomItem, - Selection: CustomItem, - noOptionsMessage: 'FIRST' - }, - }); +// test('When noOptionsMessage is changed after List component has been created then propagate update', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// getOptionLabel: (option) => option.name, +// loadOptions: getPosts, +// optionIdentifier: 'id', +// Item: CustomItem, +// Selection: CustomItem, +// noOptionsMessage: 'FIRST' +// }, +// }); - await wait(0); - select.$set({listOpen: true}); - await wait(0); - t.ok(document.querySelector('.empty').innerHTML === 'FIRST'); - select.$set({noOptionsMessage: 'SECOND'}); - await wait(0); - t.ok(document.querySelector('.empty').innerHTML === 'SECOND'); - select.$set({filterText: 'sdfsf ssdfsdfs fs'}); - select.$set({noOptionsMessage: 'THIRD'}); - await wait(0); - t.ok(document.querySelector('.empty').innerHTML === 'THIRD'); +// await wait(0); +// select.$set({listOpen: true}); +// await wait(0); +// t.ok(document.querySelector('.empty').innerHTML === 'FIRST'); +// select.$set({noOptionsMessage: 'SECOND'}); +// await wait(0); +// t.ok(document.querySelector('.empty').innerHTML === 'SECOND'); +// select.$set({filterText: 'sdfsf ssdfsdfs fs'}); +// select.$set({noOptionsMessage: 'THIRD'}); +// await wait(0); +// t.ok(document.querySelector('.empty').innerHTML === 'THIRD'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When loadOptions promise is resolved then dispatch loaded', async (t) => { - const select = new Select({ - target, - props: { - loadOptions: resolvePromise, - }, - }); +// test('When loadOptions promise is resolved then dispatch loaded', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// loadOptions: resolvePromise, +// }, +// }); - let loadedEventData = undefined; - const loadedOff = select.$on('loaded', event => { - loadedEventData = event; - }); - let errorEventData = undefined; - const errorOff = select.$on('error', event => { - errorEventData = event; - }) +// let loadedEventData = undefined; +// const loadedOff = select.$on('loaded', event => { +// loadedEventData = event; +// }); +// let errorEventData = undefined; +// const errorOff = select.$on('error', event => { +// errorEventData = event; +// }) - await wait(0); - select.$set({listOpen: true}); - await wait(0); - select.$set({filterText: 'test'}); - await wait(500); +// await wait(0); +// select.$set({listOpen: true}); +// await wait(0); +// select.$set({filterText: 'test'}); +// await wait(500); - t.equal(loadedEventData.detail.items[0].value, 'a'); - t.equal(errorEventData, undefined); - - loadedOff(); - errorOff(); - select.$destroy(); -}); +// t.equal(loadedEventData.detail.items[0].value, 'a'); +// t.equal(errorEventData, undefined); -test('When loadOptions promise is rejected then dispatch error', async (t) => { - const select = new Select({ - target, - props: { - loadOptions: rejectPromise, - }, - }); +// loadedOff(); +// errorOff(); +// select.$destroy(); +// }); - let loadedEventData = undefined; - const loadedOff = select.$on('loaded', event => { - loadedEventData = event; - }); - let errorEventData = undefined; - const errorOff = select.$on('error', event => { - errorEventData = event; - }); +// test('When loadOptions promise is rejected then dispatch error', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// loadOptions: rejectPromise, +// }, +// }); - await wait(0); - select.$set({listOpen: true}); - await wait(0); - select.$set({filterText: 'test'}); - await wait(500); - t.equal(loadedEventData, undefined); - t.equal(errorEventData.detail.type, 'loadOptions'); - t.equal(errorEventData.detail.details, 'error 123'); +// let loadedEventData = undefined; +// const loadedOff = select.$on('loaded', event => { +// loadedEventData = event; +// }); +// let errorEventData = undefined; +// const errorOff = select.$on('error', event => { +// errorEventData = event; +// }); - loadedOff(); - errorOff(); - select.$destroy(); -}); +// await wait(0); +// select.$set({listOpen: true}); +// await wait(0); +// select.$set({filterText: 'test'}); +// await wait(500); +// t.equal(loadedEventData, undefined); +// t.equal(errorEventData.detail.type, 'loadOptions'); +// t.equal(errorEventData.detail.details, 'error 123'); + +// loadedOff(); +// errorOff(); +// select.$destroy(); +// }); -test('When items change then value should also update', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'chips', label: 'Chips'}, - }, - }); +// test('When items change then value should also update', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: {value: 'chips', label: 'Chips'}, +// }, +// }); - await wait(0); +// await wait(0); - select.$set({items: [ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - {value: 'chips', label: 'Loaded Fries'}, - {value: 'ice-cream', label: 'Ice Cream'}, - ]}); +// select.$set({items: [ +// {value: 'chocolate', label: 'Chocolate'}, +// {value: 'pizza', label: 'Pizza'}, +// {value: 'cake', label: 'Cake'}, +// {value: 'chips', label: 'Loaded Fries'}, +// {value: 'ice-cream', label: 'Ice Cream'}, +// ]}); - await wait(0); +// await wait(0); - t.ok(select.value.label === 'Loaded Fries'); - t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Loaded Fries'); +// t.ok(select.value.label === 'Loaded Fries'); +// t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Loaded Fries'); - select.$destroy(); +// select.$destroy(); - await wait(0); +// await wait(0); - const multiSelect = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], - }, - }); +// const multiSelect = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], +// }, +// }); - await wait(0); +// await wait(0); - multiSelect.$set({items: [ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'pizza', label: 'Cheese Pizza'}, - {value: 'cake', label: 'Cake'}, - {value: 'chips', label: 'Loaded Fries'}, - {value: 'ice-cream', label: 'Ice Cream'}, - ]}); +// multiSelect.$set({items: [ +// {value: 'chocolate', label: 'Chocolate'}, +// {value: 'pizza', label: 'Cheese Pizza'}, +// {value: 'cake', label: 'Cake'}, +// {value: 'chips', label: 'Loaded Fries'}, +// {value: 'ice-cream', label: 'Ice Cream'}, +// ]}); - await wait(0); +// await wait(0); - t.ok(multiSelect.value[0].label === 'Loaded Fries'); - t.ok(multiSelect.value[1].label === 'Cheese Pizza'); +// t.ok(multiSelect.value[0].label === 'Loaded Fries'); +// t.ok(multiSelect.value[1].label === 'Cheese Pizza'); - multiSelect.$destroy(); -}); +// multiSelect.$destroy(); +// }); -test('When items change then value should also update but only if found in items', async (t) => { - const select = new Select({ - target, - props: { - items, - value: {value: 'chips', label: 'Chips'}, - }, - }); +// test('When items change then value should also update but only if found in items', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: {value: 'chips', label: 'Chips'}, +// }, +// }); - await wait(0); +// await wait(0); - select.$set({items: [ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'pizza', label: 'Pizza'}, - {value: 'cake', label: 'Cake'}, - {value: 'loaded-fries', label: 'Loaded Fries'}, - {value: 'ice-cream', label: 'Ice Cream'}, - ]}); +// select.$set({items: [ +// {value: 'chocolate', label: 'Chocolate'}, +// {value: 'pizza', label: 'Pizza'}, +// {value: 'cake', label: 'Cake'}, +// {value: 'loaded-fries', label: 'Loaded Fries'}, +// {value: 'ice-cream', label: 'Ice Cream'}, +// ]}); - await wait(0); +// await wait(0); - t.ok(select.value.label === 'Chips'); - t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); +// t.ok(select.value.label === 'Chips'); +// t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isMulti and multiFullItemClearable then clicking anywhere on the item will remove item', async (t) => { - const multiSelect = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - multiFullItemClearable: true, - value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], - }, - }); +// test('When isMulti and multiFullItemClearable then clicking anywhere on the item will remove item', async (t) => { +// const multiSelect = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// multiFullItemClearable: true, +// value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], +// }, +// }); - await wait(0); - await querySelectorClick('.multiSelectItem'); - await wait(0); - t.ok(multiSelect.value[0].label === 'Pizza'); +// await wait(0); +// await querySelectorClick('.multiSelectItem'); +// await wait(0); +// t.ok(multiSelect.value[0].label === 'Pizza'); - multiSelect.$destroy(); -}); +// multiSelect.$destroy(); +// }); -test('When isMulti and filterText then items should filter out already selected items', async (t) => { - const multiSelect = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], - }, - }); +// test('When isMulti and filterText then items should filter out already selected items', async (t) => { +// const multiSelect = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items, +// value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], +// }, +// }); - t.ok(multiSelect.getFilteredItems().length === 3); +// t.ok(multiSelect.getFilteredItems().length === 3); - multiSelect.$destroy(); -}); +// multiSelect.$destroy(); +// }); -test('when loadOptions and items is supplied then list should close on blur', async (t) => { - const div = document.createElement('div'); - document.body.appendChild(div); - let items=[{value:1, label:1}, {value:2, label:2}]; - let loadOptions = async(filterText) => { - const res = await fetch(`https://api.punkapi.com/v2/beers?beer_name=${filterText}`) - const data = await res.json(); - return data.map((beer)=> ({value: beer.id, label: beer.name})); - } +// test('when loadOptions and items is supplied then list should close on blur', async (t) => { +// const div = document.createElement('div'); +// document.body.appendChild(div); +// let items=[{value:1, label:1}, {value:2, label:2}]; +// let loadOptions = async(filterText) => { +// const res = await fetch(`https://api.punkapi.com/v2/beers?beer_name=${filterText}`) +// const data = await res.json(); +// return data.map((beer)=> ({value: beer.id, label: beer.name})); +// } - const select = new Select({ - target, - props: { - items, - loadOptions, - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// items, +// loadOptions, +// } +// }); - select.$set({isFocused: true}); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - await wait(0); - select.$set(({ filterText: 's'})) - await wait(600); - div.click(); - div.remove(); +// select.$set({isFocused: true}); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); +// await wait(0); +// select.$set(({ filterText: 's'})) +// await wait(600); +// div.click(); +// div.remove(); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when isCreatable and item created then event "itemCreated" should dispatch', async (t) => { - const select = new Select({ - target, - props: { - items, - isCreatable: true, - isFocused: true, - listOpen: true, - isMulti: true - } - }); +// test('when isCreatable and item created then event "itemCreated" should dispatch', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isCreatable: true, +// isFocused: true, +// listOpen: true, +// isMulti: true +// } +// }); - let eventDetail; - select.$on('itemCreated', (event) => { - eventDetail = event.detail; - }); +// let eventDetail; +// select.$on('itemCreated', (event) => { +// eventDetail = event.detail; +// }); - select.$set({ filterText: 'TestCreate' }); - await wait(0); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - await wait(0); - t.ok(eventDetail === 'TestCreate'); +// select.$set({ filterText: 'TestCreate' }); +// await wait(0); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); +// await wait(0); +// t.ok(eventDetail === 'TestCreate'); - select.$destroy(); -}); +// select.$destroy(); +// }); -async function getCancelledRes() { - Promise.resolve({cancelled: true}); -} +// async function getCancelledRes() { +// Promise.resolve({cancelled: true}); +// } -test('when loadOptions response returns cancelled true then dont end loading state', async (t) => { - const select = new Select({ - target, - props: { - loadOptions: getCancelledRes, - } - }); +// test('when loadOptions response returns cancelled true then dont end loading state', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// loadOptions: getCancelledRes, +// } +// }); - select.$set({filterText: 'Juniper'}); - await wait(0); +// select.$set({filterText: 'Juniper'}); +// await wait(0); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when ClearItem replace clear icon', async (t) => { - const select = new Select({ - target, - props: { - items, - ClearIcon: TestClearIcon, - value: {value: 'chips', label: 'Chips'} - } - }); +// test('when ClearItem replace clear icon', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// ClearIcon: TestClearIcon, +// value: {value: 'chips', label: 'Chips'} +// } +// }); - t.ok(target.querySelector('.testClearIcon')); +// t.ok(target.querySelector('.testClearIcon')); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('clicking outside the Select should close and blur it', async (t) => { - const select = new Select({ - target, - props: { - items, - } - }); +// test('clicking outside the Select should close and blur it', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// } +// }); - await querySelectorClick('.select-container'); - t.ok(select.listOpen); - await querySelectorClick('#extra'); - t.ok(!select.listOpen); +// await querySelectorClick('.select-container'); +// t.ok(select.listOpen); +// await querySelectorClick('#extra'); +// t.ok(!select.listOpen); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('clicking on an external textarea should close and blur it', async (t) => { - const textarea = document.createElement('textarea'); - document.body.appendChild(textarea); - const select = new Select({ - target, - props: { - items, - } - }); +// test('clicking on an external textarea should close and blur it', async (t) => { +// const textarea = document.createElement('textarea'); +// document.body.appendChild(textarea); +// const select = new Select({ +// target, +// props: { +// config, +// items, +// } +// }); - await querySelectorClick('.select-container'); - t.ok(select.listOpen); - await querySelectorClick('textarea'); - t.ok(!select.listOpen); +// await querySelectorClick('.select-container'); +// t.ok(select.listOpen); +// await querySelectorClick('textarea'); +// t.ok(!select.listOpen); - textarea.remove(); - select.$destroy(); -}); +// textarea.remove(); +// select.$destroy(); +// }); -test('when switching between isMulti true/false ensure Select continues working', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true, - value: {value: 'chips', label: 'Chips'} - } - }); +// test('when switching between isMulti true/false ensure Select continues working', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// listOpen: true, +// value: {value: 'chips', label: 'Chips'} +// } +// }); - select.isMulti = true; - select.loadOptions = itemsPromise; +// select.isMulti = true; +// select.loadOptions = itemsPromise; - t.ok(JSON.stringify(select.value) === JSON.stringify([{value: 'chips', label: 'Chips'}])); - t.ok(Array.isArray(select.value)); +// t.ok(JSON.stringify(select.value) === JSON.stringify([{value: 'chips', label: 'Chips'}])); +// t.ok(Array.isArray(select.value)); - select.isMulti = false; - select.loadOptions = null; - select.items = [...items]; +// select.isMulti = false; +// select.loadOptions = null; +// select.items = [...items]; - t.ok(!select.value); +// t.ok(!select.value); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when isSearchable is false then input should be readonly', async (t) => { - const select = new Select({ - target, - props: { - items, - isSearchable: false - } - }); +// test('when isSearchable is false then input should be readonly', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isSearchable: false +// } +// }); - let elem = target.querySelector('.select-container input'); - t.ok(elem.hasAttribute('readonly')); +// let elem = target.querySelector('.select-container input'); +// t.ok(elem.hasAttribute('readonly')); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when esc key pressed should close list', async (t) => { - const select = new Select({ - target, - props: { - items, - listOpen: true - } - }); +// test('when esc key pressed should close list', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// listOpen: true +// } +// }); - await wait(0); - t.ok(select.listOpen === true); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Escape'})); - t.ok(select.listOpen === false); +// await wait(0); +// t.ok(select.listOpen === true); +// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Escape'})); +// t.ok(select.listOpen === false); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when isMulti and placeholderAlwaysShow then always show placeholder text', async (t) => { - const select = new Select({ - target, - props: { - items, - value: [{value: 'chocolate', label: 'Chocolate'}, - {value: 'pizza', label: 'Pizza'},], - Multi, - isMulti: true, - placeholderAlwaysShow: true, - placeholder: 'foo bar' - } - }); +// test('when isMulti and placeholderAlwaysShow then always show placeholder text', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// value: [{value: 'chocolate', label: 'Chocolate'}, +// {value: 'pizza', label: 'Pizza'},], +// isMulti: true, +// placeholderAlwaysShow: true, +// placeholder: 'foo bar' +// } +// }); - await wait(0); - let elem = target.querySelector('.select-container input[type="text"]'); - t.ok(elem.placeholder === 'foo bar'); +// await wait(0); +// let elem = target.querySelector('.select-container input[type="text"]'); +// t.ok(elem.placeholder === 'foo bar'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when loadOptions and value then items should show on promise resolve',async (t) => { - const loadOptionsFn = async () => { - return Promise.resolve([ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'ice-cream', label: 'Ice-cream'}, - {value: 'pizza', label: 'pizza'}, - ]); - } +// test('when loadOptions and value then items should show on promise resolve',async (t) => { +// const loadOptionsFn = async () => { +// return Promise.resolve([ +// {value: 'chocolate', label: 'Chocolate'}, +// {value: 'ice-cream', label: 'Ice-cream'}, +// {value: 'pizza', label: 'pizza'}, +// ]); +// } - const select = new Select({ - target, - props: { - value: { - value: 'chocolate', label: 'Chocolate' - }, - listOpen: true, - filterText: 'a', - loadOptions: loadOptionsFn - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// value: { +// value: 'chocolate', label: 'Chocolate' +// }, +// listOpen: true, +// filterText: 'a', +// loadOptions: loadOptionsFn +// } +// }); - await wait(300); - t.ok(select.getFilteredItems().length === 3); +// await wait(300); +// t.ok(select.getFilteredItems().length === 3); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('when loadOptions, isMulti and value then filterText should remain on promise resolve',async (t) => { - const loadOptionsFn = async () => { - return Promise.resolve([ - {value: 'chocolate', label: 'Chocolate'}, - {value: 'ice-cream', label: 'Ice-cream'}, - {value: 'pizza', label: 'pizza'}, - ]); - } +// test('when loadOptions, isMulti and value then filterText should remain on promise resolve',async (t) => { +// const loadOptionsFn = async () => { +// return Promise.resolve([ +// {value: 'chocolate', label: 'Chocolate'}, +// {value: 'ice-cream', label: 'Ice-cream'}, +// {value: 'pizza', label: 'pizza'}, +// ]); +// } - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - value: { - value: 'chocolate', label: 'Chocolate' - }, - listOpen: true, - filterText: 'test', - loadOptions: loadOptionsFn - } - }); +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// value: { +// value: 'chocolate', label: 'Chocolate' +// }, +// listOpen: true, +// filterText: 'test', +// loadOptions: loadOptionsFn +// } +// }); - await wait(300); - t.ok(select.filterText === 'test'); +// await wait(300); +// t.ok(select.filterText === 'test'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When listOffset is set list position offset changes', async (t) => { - const select = new Select({ - target, - props: { - items, - listOffset: 0, - listOpen: true - }, - }); +// test('When listOffset is set list position offset changes', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// listOffset: 0, +// listOpen: true +// }, +// }); - let elem = target.querySelector('.list'); - t.ok(elem.style.top === '42px'); +// let elem = target.querySelector('.list'); +// t.ok(elem.style.top === '42px'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When items are updated post onMount ensure filtering still works', async (t) => { - const select = new Select({ - target, - props: { - items: null - }, - }); +// test('When items are updated post onMount ensure filtering still works', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: null +// }, +// }); - await wait(0); +// await wait(0); - select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item })); - select.filterText = 'Two'; - select.listOpen = true; +// select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item })); +// select.filterText = 'Two'; +// select.listOpen = true; - t.ok(select.getFilteredItems().length === 1); - t.ok(select.getFilteredItems()[0].value === 'Two'); +// t.ok(select.getFilteredItems().length === 1); +// t.ok(select.getFilteredItems()[0].value === 'Two'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When grouped items are updated post onMount ensure filtering still works', async (t) => { - const select = new Select({ - target, - props: { - groupBy: item => item.group - }, - }); +// test('When grouped items are updated post onMount ensure filtering still works', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// groupBy: item => item.group +// }, +// }); - await wait(0); +// await wait(0); - select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item, group: item.includes('T') ? '2nd Group' : '1st Group' })); - select.filterText = 'Tw'; - select.listOpen = true; +// select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item, group: item.includes('T') ? '2nd Group' : '1st Group' })); +// select.filterText = 'Tw'; +// select.listOpen = true; - t.ok(select.getFilteredItems().length === 2); - t.ok(select.getFilteredItems()[0].label === '2nd Group'); - t.ok(select.getFilteredItems()[1].label === 'Two'); +// t.ok(select.getFilteredItems().length === 2); +// t.ok(select.getFilteredItems()[0].label === '2nd Group'); +// t.ok(select.getFilteredItems()[1].label === 'Two'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When groupBy and value selected ensure filtering still works', async (t) => { - const select = new Select({ - target, - props: { - items: itemsWithGroup, - groupBy: (item) => item.group, +// test('When groupBy and value selected ensure filtering still works', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: itemsWithGroup, +// groupBy: (item) => item.group, - }, - }); - - select.filterText = 'Cake'; - document.querySelector('.list-item .item').click(); - await wait(0); - t.ok(select.getFilteredItems().length === 7); +// }, +// }); - select.$destroy(); -}); +// select.filterText = 'Cake'; +// document.querySelector('.list-item .item').click(); +// await wait(0); +// t.ok(select.getFilteredItems().length === 7); -test('When value selected and filterText then ensure selecting the active value still clears filterText', async (t) => { - const select = new Select({ - target, - props: { - items, - }, - }); +// select.$destroy(); +// }); - select.filterText = 'Cake'; - document.querySelector('.list-item .item').click(); - await wait(0); - select.listOpen = true; - select.filterText = 'Cake'; - document.querySelector('.list-item .item').click(); +// test('When value selected and filterText then ensure selecting the active value still clears filterText', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// }, +// }); + +// select.filterText = 'Cake'; +// document.querySelector('.list-item .item').click(); +// await wait(0); +// select.listOpen = true; +// select.filterText = 'Cake'; +// document.querySelector('.list-item .item').click(); - t.ok(select.filterText.length === 0); +// t.ok(select.filterText.length === 0); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When groupBy, optionIdentifier and labelIdentifier then ensure list displays correctly', async (t) => { - const select = new Select({ - target, - props: { - items: itemsWithGroupIds, - optionIdentifier: '_id', - labelIdentifier: 'name', - groupBy: (item) => item.groupie, - listOpen: true, - }, - }); +// test('When groupBy, optionIdentifier and labelIdentifier then ensure list displays correctly', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: itemsWithGroupIds, +// optionIdentifier: '_id', +// labelIdentifier: 'name', +// groupBy: (item) => item.groupie, +// listOpen: true, +// }, +// }); - let titles = document.querySelectorAll('.list-group-title'); - let items = document.querySelectorAll('.list-item .item'); - t.equal(titles[0].innerHTML, 'Sweet'); - t.equal(titles[1].innerHTML, 'Savory'); - t.equal(items[0].innerHTML, 'Chocolate'); - t.equal(items[4].innerHTML, 'Chips'); +// let titles = document.querySelectorAll('.list-group-title'); +// let items = document.querySelectorAll('.list-item .item'); +// t.equal(titles[0].innerHTML, 'Sweet'); +// t.equal(titles[1].innerHTML, 'Savory'); +// t.equal(items[0].innerHTML, 'Chocolate'); +// t.equal(items[4].innerHTML, 'Chips'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When groupBy, optionIdentifier, labelIdentifier and createGroupHeaderItem then ensure list displays correctly', async (t) => { - const select = new Select({ - target, - props: { - items: itemsWithGroupIds, - optionIdentifier: '_id', - labelIdentifier: 'name', - groupBy: (item) => item.groupie, - listOpen: true, - createGroupHeaderItem: (groupValue, item) => { - return { - name: `XXX ${groupValue} XXX ${item.name}` - }; - } - }, - }); +// test('When groupBy, optionIdentifier, labelIdentifier and createGroupHeaderItem then ensure list displays correctly', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: itemsWithGroupIds, +// optionIdentifier: '_id', +// labelIdentifier: 'name', +// groupBy: (item) => item.groupie, +// listOpen: true, +// createGroupHeaderItem: (groupValue, item) => { +// return { +// name: `XXX ${groupValue} XXX ${item.name}` +// }; +// } +// }, +// }); - let titles = document.querySelectorAll('.list-group-title'); - let items = document.querySelectorAll('.list-item .item'); - t.equal(titles[0].innerHTML, 'XXX Sweet XXX Chocolate'); - t.equal(titles[1].innerHTML, 'XXX Savory XXX Pizza'); - t.equal(items[0].innerHTML, 'Chocolate'); - t.equal(items[4].innerHTML, 'Chips'); +// let titles = document.querySelectorAll('.list-group-title'); +// let items = document.querySelectorAll('.list-item .item'); +// t.equal(titles[0].innerHTML, 'XXX Sweet XXX Chocolate'); +// t.equal(titles[1].innerHTML, 'XXX Savory XXX Pizza'); +// t.equal(items[0].innerHTML, 'Chocolate'); +// t.equal(items[4].innerHTML, 'Chips'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isMulti on:select events should fire on each item removal (including the last item)', async (t) => { - const select = new Select({ - target, - props: { - items, - Multi, - isMulti: true, - value: ['Cake', 'Chips'] - }, - }); +// test('When isMulti on:select events should fire on each item removal (including the last item)', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items, +// isMulti: true, +// value: ['Cake', 'Chips'] +// }, +// }); - let events = []; +// let events = []; - select.$on('select', (e) => { - events.push('event fired'); - }); +// select.$on('select', (e) => { +// events.push('event fired'); +// }); - document.querySelector('.multiSelectItem_clear').click(); - await wait(0); - document.querySelector('.multiSelectItem_clear').click(); - await wait(0); - t.ok(events.length === 2); +// document.querySelector('.multiSelectItem_clear').click(); +// await wait(0); +// document.querySelector('.multiSelectItem_clear').click(); +// await wait(0); +// t.ok(events.length === 2); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When loadOptions and isCreatable then create new item is active when promise resolves with no items', async (t) => { - const select = new Select({ - target, - props: { - loadOptions: itemsPromiseEmpty, - isCreatable: true, - }, - }); +// test('When loadOptions and isCreatable then create new item is active when promise resolves with no items', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// loadOptions: itemsPromiseEmpty, +// isCreatable: true, +// }, +// }); - select.filterText = 'Cake'; - await wait(400); - let createText = document.querySelector('.list-item .item').innerHTML; - t.equal(createText, 'Create "Cake"'); +// select.filterText = 'Cake'; +// await wait(400); +// let createText = document.querySelector('.list-item .item').innerHTML; +// t.equal(createText, 'Create "Cake"'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When loadOptions and isCreatable then create new item show at bottom of results when promise resolves', async (t) => { - const select = new Select({ - target, - props: { - loadOptions: itemsPromise, - isCreatable: true, - }, - }); +// test('When loadOptions and isCreatable then create new item show at bottom of results when promise resolves', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// loadOptions: itemsPromise, +// isCreatable: true, +// }, +// }); - select.filterText = 'Cake'; - await wait(400); - let createText = document.querySelector('.list-item:last-child .item').innerHTML; - t.equal(createText, 'Create "Cake"'); +// select.filterText = 'Cake'; +// await wait(400); +// let createText = document.querySelector('.list-item:last-child .item').innerHTML; +// t.equal(createText, 'Create "Cake"'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When inputAttributes.name supplied, add to hidden input', async (t) => { - const select = new Select({ - target, - props: { - inputAttributes: { name: 'Foods' }, - items: items, - showChevron: true, - }, - }); +// test('When inputAttributes.name supplied, add to hidden input', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// inputAttributes: { name: 'Foods' }, +// items: items, +// showChevron: true, +// }, +// }); - let hidden = document.querySelector('input[type="hidden"]').name; - t.equal(hidden, 'Foods'); +// let hidden = document.querySelector('input[type="hidden"]').name; +// t.equal(hidden, 'Foods'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When no value then hidden field should also have no value', async (t) => { - const select = new Select({ - target, - props: { - inputAttributes: { name: 'Foods' }, - items: items, +// test('When no value then hidden field should also have no value', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// inputAttributes: { name: 'Foods' }, +// items: items, - }, - }); +// }, +// }); - let hidden = document.querySelector('input[type="hidden"]').value; - t.ok(!hidden); +// let hidden = document.querySelector('input[type="hidden"]').value; +// t.ok(!hidden); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When value then hidden field should have value.label', async (t) => { - const select = new Select({ - target, - props: { - items: items, - value: {value: 'cake', label: 'Cake'}, - }, - }); +// test('When value then hidden field should have value.label', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: items, +// value: {value: 'cake', label: 'Cake'}, +// }, +// }); - let hidden = document.querySelector('input[type="hidden"]').value; - t.equal(hidden, 'Cake'); +// let hidden = document.querySelector('input[type="hidden"]').value; +// t.equal(hidden, 'Cake'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isMulti and no value then hidden field should no value', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items: items, - }, - }); +// test('When isMulti and no value then hidden field should no value', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items: items, +// }, +// }); - let hidden = document.querySelector('input[type="hidden"]').value; - t.ok(!hidden); +// let hidden = document.querySelector('input[type="hidden"]').value; +// t.ok(!hidden); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When isMulti and value then hidden fields should list value items', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items: items, - value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},] - }, - }); +// test('When isMulti and value then hidden fields should list value items', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items: items, +// value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},] +// }, +// }); - let hidden = document.querySelectorAll('input[type="hidden"]'); - t.equal(hidden[0].value, 'Cake'); - t.equal(hidden[1].value, 'Pizza'); +// let hidden = document.querySelectorAll('input[type="hidden"]'); +// t.equal(hidden[0].value, 'Cake'); +// t.equal(hidden[1].value, 'Pizza'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When listOpen then aria-context describes highlighted item', async (t) => { - const select = new Select({ - target, - props: { - items: items, - listOpen: true - }, - }); +// test('When listOpen then aria-context describes highlighted item', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: items, +// listOpen: true +// }, +// }); - let aria = document.querySelector('#aria-context'); - t.ok(aria.innerHTML.includes('Chocolate')); - await handleKeyboard('ArrowDown'); - t.ok(aria.innerHTML.includes('Pizza')); +// let aria = document.querySelector('#aria-context'); +// t.ok(aria.innerHTML.includes('Chocolate')); +// await handleKeyboard('ArrowDown'); +// t.ok(aria.innerHTML.includes('Pizza')); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When listOpen and value then aria-selection describes value', async (t) => { - const select = new Select({ - target, - props: { - items: items, - value: {value: 'cake', label: 'Cake'}, - isFocused: true - }, - }); +// test('When listOpen and value then aria-selection describes value', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: items, +// value: {value: 'cake', label: 'Cake'}, +// isFocused: true +// }, +// }); - let aria = document.querySelector('#aria-selection'); - t.ok(aria.innerHTML.includes('Cake')); +// let aria = document.querySelector('#aria-selection'); +// t.ok(aria.innerHTML.includes('Cake')); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When listOpen, value and isMulti then aria-selection describes value', async (t) => { - const select = new Select({ - target, - props: { - isMulti: true, - items: items, - value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},], - isFocused: true - }, - }); +// test('When listOpen, value and isMulti then aria-selection describes value', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// isMulti: true, +// items: items, +// value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},], +// isFocused: true +// }, +// }); - let aria = document.querySelector('#aria-selection'); - t.ok(aria.innerHTML.includes('Cake')); - t.ok(aria.innerHTML.includes('Pizza')); +// let aria = document.querySelector('#aria-selection'); +// t.ok(aria.innerHTML.includes('Cake')); +// t.ok(aria.innerHTML.includes('Pizza')); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When ariaValues and value supplied, then aria-selection uses default updated', async (t) => { - const select = new Select({ - target, - props: { - items: items, - value: {value: 'pizza', label: 'Pizza'}, - isFocused: true, - ariaValues: (val) => `Yummy ${val} in my tummy!` - }, - }); +// test('When ariaValues and value supplied, then aria-selection uses default updated', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: items, +// value: {value: 'pizza', label: 'Pizza'}, +// isFocused: true, +// ariaValues: (val) => `Yummy ${val} in my tummy!` +// }, +// }); - let aria = document.querySelector('#aria-selection'); - t.equal(aria.innerHTML, 'Yummy Pizza in my tummy!'); +// let aria = document.querySelector('#aria-selection'); +// t.equal(aria.innerHTML, 'Yummy Pizza in my tummy!'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When ariaListOpen, listOpen, then aria-context uses default updated', async (t) => { - const select = new Select({ - target, - props: { - items: items, - listOpen: true, - ariaListOpen: (label, count) => `label: ${label}, count: ${count}` - }, - }); +// test('When ariaListOpen, listOpen, then aria-context uses default updated', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: items, +// listOpen: true, +// ariaListOpen: (label, count) => `label: ${label}, count: ${count}` +// }, +// }); - let aria = document.querySelector('#aria-context'); - t.equal(aria.innerHTML, 'label: Chocolate, count: 5'); +// let aria = document.querySelector('#aria-context'); +// t.equal(aria.innerHTML, 'label: Chocolate, count: 5'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When ariaFocused, focused value supplied, then aria-context uses default updated', async (t) => { - const select = new Select({ - target, - props: { - items: items, - isFocused: true, - ariaFocused: () => `nothing to see here.` - }, - }); +// test('When ariaFocused, focused value supplied, then aria-context uses default updated', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// items: items, +// isFocused: true, +// ariaFocused: () => `nothing to see here.` +// }, +// }); - let aria = document.querySelector('#aria-context'); - t.equal(aria.innerHTML, 'nothing to see here.'); +// let aria = document.querySelector('#aria-context'); +// t.equal(aria.innerHTML, 'nothing to see here.'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('When id supplied then add to input', async (t) => { - const select = new Select({ - target, - props: { - id: 'foods', - items: items, - }, - }); +// test('When id supplied then add to input', async (t) => { +// const select = new Select({ +// target, +// props: { +// config, +// id: 'foods', +// items: items, +// }, +// }); - let aria = document.querySelector('input[type="text"]'); - t.equal(aria.id, 'foods'); +// let aria = document.querySelector('input[type="text"]'); +// t.equal(aria.id, 'foods'); - select.$destroy(); -}); +// select.$destroy(); +// }); -test('allows the user to select an item by clicking with a focusable ancestor', async (t) => { - const ancestor = document.createElement("div"); - ancestor.setAttribute("tabindex", "-1"); - target.appendChild(ancestor); +// test('allows the user to select an item by clicking with a focusable ancestor', async (t) => { +// const ancestor = document.createElement("div"); +// ancestor.setAttribute("tabindex", "-1"); +// target.appendChild(ancestor); - const select = new Select({ - target: ancestor, - props: { - items, - }, - }); +// const select = new Select({ +// target: ancestor, +// props: { +// config, +// items, +// }, +// }); - await querySelectorClick('.select-container'); - await querySelectorClick('.list-item'); - t.equal(select.value.label, 'Chocolate'); +// await querySelectorClick('.select-container'); +// await querySelectorClick('.list-item'); +// t.equal(select.value.label, 'Chocolate'); - select.$destroy(); -}); +// select.$destroy(); +// }); From a06b0ded268fc625570a285702bf869bc47a3ee3 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 8 Nov 2021 16:01:57 +1100 Subject: [PATCH 295/635] fixing tests --- test/src/index.js | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/test/src/index.js b/test/src/index.js index aa5fff86..a99b6b4f 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1078,7 +1078,7 @@ test(`show ellipsis for overflowing text in a List item`, async (t) => { target.style.width = ''; }); -test.only('focusing in an external textarea should close and blur it', async (t) => { +test('focusing in an external textarea should close and blur it', async (t) => { const textarea = document.createElement('textarea'); document.body.appendChild(textarea); @@ -1091,22 +1091,15 @@ test.only('focusing in an external textarea should close and blur it', async (t) } }); - // await querySelectorClick('.select-container'); const input = document.querySelector('.select-container input'); input.focus(); input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - t.ok(select.listOpen); - - // await wait(100); - // document.querySelector('.select-container input').blur(); - + t.ok(select.listOpen); await wait(0); - textarea.focus(); - // await wait(0); - // t.ok(!select.listOpen); - // textarea.remove(); - // select.$destroy(); + t.ok(!select.listOpen); + textarea.remove(); + select.$destroy(); }); test('clicking between Selects should close and blur other Select', async (t) => { @@ -1340,12 +1333,9 @@ test('clicking an item with selectable: false should not make a selected', async }); await wait(0); - - // notSelectable1 - await querySelectorClick('.list-item:nth-child(1)') + await querySelectorClick('.list-item:nth-child(1)'); t.ok(!select.value); - - // notSelectable2 + select.listOpen = true; await querySelectorClick('.list-item:nth-child(4)') t.ok(!select.value); @@ -1692,8 +1682,10 @@ test('when isMulti and value is populated then navigating with LeftArrow updates }); target.style.maxWidth = '100%'; - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); + + const input = document.querySelector('.select-container input'); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); t.ok(select.$capture_state().activeValue === 1); From 11f47a0ac1329f6c4f87809f48c4f3a68284ee84 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 9 Nov 2021 13:33:22 +1100 Subject: [PATCH 296/635] fixed tests and added svelte-tiny-virtual-list support --- CHANGELOG.md | 5 + package-lock.json | 13 + package.json | 1 + src/lib/List.svelte | 18 +- src/lib/Select.svelte | 64 +- src/lib/VirtualList.svelte | 159 - src/lib/default.css | 5 +- src/lib/presets.js | 28 - src/lib/presets/vanilla.js | 5 +- test/src/Select/Select--multiSelected.svelte | 119 - test/src/index.js | 3710 +++++++++--------- test/utils/nameGen.js | 2284 +++++++++++ 12 files changed, 4181 insertions(+), 2230 deletions(-) delete mode 100644 src/lib/VirtualList.svelte delete mode 100644 src/lib/presets.js delete mode 100644 test/src/Select/Select--multiSelected.svelte create mode 100644 test/utils/nameGen.js diff --git a/CHANGELOG.md b/CHANGELOG.md index f336dff4..8bf0773d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## unreleased +* added support for svelte-tiny-virtual-list +* removed virtual-list class and css props +* moved VirtualList to config +* moved debounce to config +* loadOptionsInterval -> debounceWait * selectedValue removed * borrowed some code from svelte-materialify for the clickOutside function * MultiSelection -> Multi diff --git a/package-lock.json b/package-lock.json index 03a72da5..e66d2e98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "sirv-cli": "^1.0.14", "svelte": "^3.44.1", "svelte-preprocess": "^4.9.8", + "svelte-tiny-virtual-list": "^1.1.7", "svelte2tsx": "^0.4.8", "tailwindcss": "^2.2.19", "tape-modern": "^1.1.2", @@ -3778,6 +3779,12 @@ } } }, + "node_modules/svelte-tiny-virtual-list": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-1.1.7.tgz", + "integrity": "sha512-8314cmLXOVqIQwSc3NFu8yGU7BdHEJeixrwFirmnMoWl6YNcCq5jVjCKjE3tDNJfUenz1LN5M5YshPt6GcPuww==", + "dev": true + }, "node_modules/svelte2tsx": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.4.8.tgz", @@ -6761,6 +6768,12 @@ "strip-indent": "^3.0.0" } }, + "svelte-tiny-virtual-list": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-1.1.7.tgz", + "integrity": "sha512-8314cmLXOVqIQwSc3NFu8yGU7BdHEJeixrwFirmnMoWl6YNcCq5jVjCKjE3tDNJfUenz1LN5M5YshPt6GcPuww==", + "dev": true + }, "svelte2tsx": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.4.8.tgz", diff --git a/package.json b/package.json index 88c855e9..c62ab002 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "sirv-cli": "^1.0.14", "svelte": "^3.44.1", "svelte-preprocess": "^4.9.8", + "svelte-tiny-virtual-list": "^1.1.7", "svelte2tsx": "^0.4.8", "tailwindcss": "^2.2.19", "tape-modern": "^1.1.2", diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 4dc4f50b..d457a0cc 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -96,8 +96,6 @@ } async function updateHoverItem(increment) { - if (VirtualList) return; - let isNonSelectableItem = true; while (isNonSelectableItem) { @@ -214,20 +212,20 @@ -
+
{#if VirtualList} - -
handleHover(i)} on:focus={() => handleHover(i)} on:click={(event) => handleClick({ item, i, event })} class="list-item" tabindex="-1"> + +
handleHover(index)} on:focus={() => handleHover(index)} on:click={(event) => handleClick({ item:items[index], i:index, event })} class="list-item" tabindex="-1"> + isFirst={isItemFirst(index)} + isActive={isItemActive(items[index], value, optionIdentifier)} + isHover={isItemHover(hoverItemIndex, items[index], index, items)} + isSelectable={isItemSelectable(items[index])} />
{:else} diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 36f87d74..817704e6 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -3,7 +3,7 @@ export let config = {}; - const { Item, List, Selection, Multi, debounce } = config; + const { Item, List, Selection, Multi, VirtualList, debounce } = config; const dispatch = createEventDispatcher(); @@ -64,7 +64,7 @@ export let isWaiting = false; export let listPlacement = 'auto'; export let listOpen = false; - // export let loadOptionsInterval = 300; + export let debounceWait = 300; export let noOptionsMessage = 'No options'; export let hideEmptyState = false; export let inputAttributes = {}; @@ -75,7 +75,6 @@ export let showChevron = false; export let listOffset = 5; - export let VirtualList = null; export let ChevronIcon = null; export let ClearIcon = null; export let LoadingIcon = null; @@ -142,33 +141,34 @@ let prev_isMulti; let hoverItemIndex; - // const getItems = debounce(async () => { - // isWaiting = true; - // let res = await loadOptions(filterText).catch((err) => { - // console.warn('svelte-select loadOptions error :>> ', err); - // dispatch('error', { type: 'loadOptions', details: err }); - // }); - - // if (res && !res.cancelled) { - // if (res) { - // if (res && res.length > 0 && typeof res[0] !== 'object') { - // res = convertStringItemsToObjects(res); - // } - // filteredItems = [...res]; - // dispatch('loaded', { items: filteredItems }); - // } else { - // filteredItems = []; - // } - - // if (isCreatable) { - // filteredItems = addCreatableItem(filteredItems, filterText); - // } - - // isWaiting = false; - // isFocused = true; - // listOpen = true; - // } - // }, loadOptionsInterval); + const getItems = debounce(async () => { + isWaiting = true; + + let res = await loadOptions(filterText).catch((err) => { + console.warn('svelte-select loadOptions error :>> ', err); + dispatch('error', { type: 'loadOptions', details: err }); + }); + + if (res && !res.cancelled) { + if (res) { + if (res && res.length > 0 && typeof res[0] !== 'object') { + res = convertStringItemsToObjects(res); + } + filteredItems = [...res]; + dispatch('loaded', { items: filteredItems }); + } else { + filteredItems = []; + } + + if (isCreatable) { + filteredItems = addCreatableItem(filteredItems, filterText); + } + + isWaiting = false; + isFocused = true; + listOpen = true; + } + }, debounceWait); $: updateValueDisplay(items); @@ -341,7 +341,7 @@ listOpen = true; if (loadOptions) { - // getItems(); + getItems(); } else { listOpen = true; @@ -622,10 +622,8 @@ - import { onMount, tick } from 'svelte'; - - export let items = undefined; - export let height = '100%'; - export let itemHeight = 40; - export let hoverItemIndex = 0; - export let start = 0; - export let end = 0; - - let height_map = []; - let rows; - let viewport; - let contents; - let viewport_height = 0; - let visible; - let mounted; - - let top = 0; - let bottom = 0; - let average_height; - - $: visible = items.slice(start, end).map((data, i) => { - return { index: i + start, data }; - }); - - $: if (mounted) refresh(items, viewport_height, itemHeight); - - async function refresh(items, viewport_height, itemHeight) { - const { scrollTop } = viewport; - - await tick(); - - let content_height = top - scrollTop; - let i = start; - - while (content_height < viewport_height && i < items.length) { - let row = rows[i - start]; - - if (!row) { - end = i + 1; - await tick(); - row = rows[i - start]; - } - - const row_height = (height_map[i] = itemHeight || row.offsetHeight); - content_height += row_height; - i += 1; - } - - end = i; - - const remaining = items.length - end; - average_height = (top + content_height) / end; - - bottom = remaining * average_height; - height_map.length = items.length; - - if (viewport) viewport.scrollTop = 0; - } - - async function handle_scroll() { - const { scrollTop } = viewport; - - const old_start = start; - - for (let v = 0; v < rows.length; v += 1) { - height_map[start + v] = itemHeight || rows[v].offsetHeight; - } - - let i = 0; - let y = 0; - - while (i < items.length) { - const row_height = height_map[i] || average_height; - if (y + row_height > scrollTop) { - start = i; - top = y; - - break; - } - - y += row_height; - i += 1; - } - - while (i < items.length) { - y += height_map[i] || average_height; - i += 1; - - if (y > scrollTop + viewport_height) break; - } - - end = i; - - const remaining = items.length - end; - average_height = y / end; - - while (i < items.length) height_map[i++] = average_height; - bottom = remaining * average_height; - - if (start < old_start) { - await tick(); - - let expected_height = 0; - let actual_height = 0; - - for (let i = start; i < old_start; i += 1) { - if (rows[i - start]) { - expected_height += height_map[i]; - actual_height += itemHeight || rows[i - start].offsetHeight; - } - } - - const d = actual_height - expected_height; - viewport.scrollTo(0, scrollTop + d); - } - } - - onMount(() => { - rows = contents.getElementsByTagName('svelte-virtual-list-row'); - mounted = true; - }); - - - - - {#each visible as row (row.index)} - - Missing template - - {/each} - - - - diff --git a/src/lib/default.css b/src/lib/default.css index 39b67bc6..1954e7bd 100644 --- a/src/lib/default.css +++ b/src/lib/default.css @@ -26,6 +26,7 @@ position: absolute; left: var(--inputLeft, 0); margin: var(--inputMargin, 0); + box-sizing: border-box; } .select-container input::placeholder { @@ -152,10 +153,6 @@ right: var(--listRight, 0); } -.list.virtual-list { - height: var(--virtualListHeight, 200px); -} - .list .list-group-title { color: var(--groupTitleColor, #8f8f8f); cursor: default; diff --git a/src/lib/presets.js b/src/lib/presets.js deleted file mode 100644 index c5bafb53..00000000 --- a/src/lib/presets.js +++ /dev/null @@ -1,28 +0,0 @@ -// import defaultStyles from './default.css'; -import tailwindStyles from './tailwind.css'; -// import Multi from './Multi.svelte'; -import List from './List.svelte'; -import Item from './Item.svelte'; -import Selection from './Selection.svelte'; -import debounce from './debounce'; - -const vanilla = { - // theme: defaultStyles - - -} - -const tailwind = { - theme: tailwindStyles, - // selection: Multi, - List, - Item, - Selection, - debounce -} - - -export { - // vanilla, - tailwind -} \ No newline at end of file diff --git a/src/lib/presets/vanilla.js b/src/lib/presets/vanilla.js index 144571c0..d5c8378c 100644 --- a/src/lib/presets/vanilla.js +++ b/src/lib/presets/vanilla.js @@ -2,13 +2,12 @@ import defaultStyles from '../default.css'; import List from '../List.svelte'; import Item from '../Item.svelte'; import Selection from '../Selection.svelte'; -import Multi from '../Multi.svelte'; - +import debounce from '../debounce'; export default { theme: defaultStyles, List, Item, Selection, - Multi + debounce } \ No newline at end of file diff --git a/test/src/Select/Select--multiSelected.svelte b/test/src/Select/Select--multiSelected.svelte deleted file mode 100644 index 3baa729a..00000000 --- a/test/src/Select/Select--multiSelected.svelte +++ /dev/null @@ -1,119 +0,0 @@ - -
-
-
- Pizza -
-
- - - -
-
-
-
- Chips -
-
- - - -
-
- -
- - - -
-
- - diff --git a/test/src/index.js b/test/src/index.js index a99b6b4f..80be9d11 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -1,14 +1,16 @@ import normalizeHtml from '../utils/normalizeHtml'; import CustomItem from './CustomItem.svelte'; import Select from '../../src/lib/Select.svelte'; +import Multi from '../../src/lib/Multi.svelte'; import ChevronIcon from '../../src/lib/ChevronIcon.svelte'; import LoadingIcon from '../../src/lib/LoadingIcon.svelte'; import TestIcon from './TestIcon.svelte'; import TestClearIcon from './TestClearIcon.svelte'; import SelectDefault from './Select/Select--default.svelte' -import SelectMultiSelected from './Select/Select--multiSelected.svelte' import ParentContainer from './Select/ParentContainer.svelte' import {assert, test} from 'tape-modern'; +import VirtualList from 'svelte-tiny-virtual-list'; +import getName from '../utils/nameGen'; import config from '../../src/lib/presets/vanilla'; @@ -20,8 +22,8 @@ function querySelectorClick(selector) { return new Promise(f => setTimeout(f, 0)); } -function handleKeyboard(key) { - window.dispatchEvent(new KeyboardEvent('keydown', {'key': key})); +function handleKeyboard(key, target=window) { + target.dispatchEvent(new KeyboardEvent('keydown', {'key': key})); return new Promise(f => setTimeout(f, 0)); } @@ -163,7 +165,10 @@ test('with no data creates default elements', async (t) => { }); const select = new Select({ - target + target, + props: { + config + } }); t.htmlEqual(target.innerHTML, testTarget.innerHTML); @@ -1487,7 +1492,7 @@ test('when isMulti is true show each item in value', async (t) => { const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items, value: [ @@ -1508,7 +1513,7 @@ test('when isMulti is true and value is undefined show placeholder text', async const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items, value: undefined @@ -1524,7 +1529,7 @@ test('when isMulti is true clicking item in List will populate value', async (t) const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items, value: undefined @@ -1543,7 +1548,7 @@ test('when isMulti is true items in value will not appear in List', async (t) => const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1566,7 +1571,7 @@ test('when isMulti is true both value and filterText filters List', async (t) => const select = new Select({ target, props: { - config, + config: {...config, Multi}, listOpen: true, isMulti: true, items, @@ -1587,7 +1592,7 @@ test('when isMulti is true clicking X on a selected item will remove it from val const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] @@ -1604,7 +1609,7 @@ test('when isMulti is true and all selected items have been removed then placeho const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1620,7 +1625,7 @@ test('when isMulti is true and items are selected then clear all should wipe all const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] @@ -1637,7 +1642,7 @@ test('when isMulti and groupBy is active then items should be selectable', async const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1656,7 +1661,7 @@ test('when isMulti and selected items reach edge of container then Select height const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items } @@ -1673,7 +1678,7 @@ test('when isMulti and value is populated then navigating with LeftArrow updates const select = new Select({ target, props: { - config, + config: {...config, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], @@ -1692,2269 +1697,2226 @@ test('when isMulti and value is populated then navigating with LeftArrow updates select.$destroy(); }); -// test('when isMulti and value is populated then navigating with ArrowRight updates activeValue', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], -// isFocused: true -// } -// }); - -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowRight'})); -// t.ok(select.$capture_state().activeValue === 1); +test('when isMulti and value is populated then navigating with ArrowRight updates activeValue', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], + isFocused: true + } + }); -// select.$destroy(); -// }); + const input = document.querySelector('.select-container input'); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowRight'})); + t.ok(select.$capture_state().activeValue === 1); -// test('when isMulti and value has items and list opens then first item in list should be active', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// isFocused: true -// } -// }); + select.$destroy(); +}); -// await querySelectorClick('.select-container'); -// await querySelectorClick('.list-item'); -// await handleKeyboard('ArrowDown'); +test('when isMulti and value has items and list opens then first item in list should be active', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + isFocused: true + } + }); -// t.ok(document.querySelector('.list-item .hover')); + await querySelectorClick('.select-container'); + await querySelectorClick('.list-item'); -// select.$destroy(); -// }); + const input = document.querySelector('.select-container input'); + input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + await wait(0); + t.ok(document.querySelector('.list-item .hover')); + select.$destroy(); +}); -// test('when isMulti, isDisabled, and value has items then items should be locked', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// isDisabled: true, -// value: [{value: 'chocolate', label: 'Chocolate'}], -// } -// }); +test('when isMulti, isDisabled, and value has items then items should be locked', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + isDisabled: true, + value: [{value: 'chocolate', label: 'Chocolate'}], + } + }); -// t.ok(document.querySelector('.multiSelectItem.disabled')); + t.ok(document.querySelector('.multiSelectItem.disabled')); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when isMulti is true show each item in value if simple arrays are used', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items: ['pizza', 'chips', 'chocolate'], -// value: ['pizza', 'chocolate'] -// } -// }); +test('when isMulti is true show each item in value if simple arrays are used', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items: ['pizza', 'chips', 'chocolate'], + value: ['pizza', 'chocolate'] + } + }); -// const all = target.querySelectorAll('.multiSelectItem .multiSelectItem_label'); -// t.ok(all[0].innerHTML === 'pizza'); -// t.ok(all[1].innerHTML === 'chocolate'); + const all = target.querySelectorAll('.multiSelectItem .multiSelectItem_label'); + t.ok(all[0].innerHTML === 'pizza'); + t.ok(all[1].innerHTML === 'chocolate'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when labelIdentifier is set you can pass a string and see the right label', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: [{id: 0, name: 'ONE'}, {id: 1, name: 'TWO'}], -// value: {id: 0, name: 'ONE'}, -// optionIdentifier: 'id', -// labelIdentifier: 'name', -// } -// }); +test('when labelIdentifier is set you can pass a string and see the right label', async (t) => { + const select = new Select({ + target, + props: { + config, + items: [{id: 0, name: 'ONE'}, {id: 1, name: 'TWO'}], + value: {id: 0, name: 'ONE'}, + optionIdentifier: 'id', + labelIdentifier: 'name', + } + }); -// t.ok(document.querySelector('.selection').innerHTML === 'ONE'); + t.ok(document.querySelector('.selection').innerHTML === 'ONE'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when getValue method is set should use that key to update value', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: [{id: 0, label: 'ONE'}, {id: 1, label: 'TWO'}], -// value: {id: 0, label: 'ONE'}, -// optionIdentifier: 'id' -// } -// }); +test('when getValue method is set should use that key to update value', async (t) => { + const select = new Select({ + target, + props: { + config, + items: [{id: 0, label: 'ONE'}, {id: 1, label: 'TWO'}], + value: {id: 0, label: 'ONE'}, + optionIdentifier: 'id' + } + }); -// t.ok(select.value.id === 0); -// await querySelectorClick('.select-container'); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// t.ok(select.value.id === 1); + t.ok(select.value.id === 0); + await querySelectorClick('.select-container'); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + t.ok(select.value.id === 1); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when loadOptions method is supplied and filterText has length then items should populate via promise resolve', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// getOptionLabel: (option) => option.name, -// loadOptions: getPosts, -// optionIdentifier: 'id', -// Item: CustomItem, -// Selection: CustomItem -// } -// }); +test('when loadOptions method is supplied and filterText has length then items should populate via promise resolve', async (t) => { + const select = new Select({ + target, + props: { + config: { ...config, Item: CustomItem, Selection: CustomItem }, + getOptionLabel: (option) => option.name, + loadOptions: getPosts, + optionIdentifier: 'id', + } + }); -// await wait(0); -// select.$set({filterText: 'Juniper'}); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + await wait(0); + select.$set({filterText: 'Juniper'}); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when noOptionsMessage is set and there are no items then show message', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// noOptionsMessage: 'SO SO SO SCANDALOUS', -// isFocused: true -// } -// }); +test('when noOptionsMessage is set and there are no items then show message', async (t) => { + const select = new Select({ + target, + props: { + config, + noOptionsMessage: 'SO SO SO SCANDALOUS', + listOpen: true + } + }); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); -// await wait(0); -// t.ok(document.querySelector('.empty').innerHTML === 'SO SO SO SCANDALOUS'); + t.ok(document.querySelector('.empty').innerHTML === 'SO SO SO SCANDALOUS'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when getSelectionLabel method is supplied and value are no items then display result of getSelectionLabel', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// getSelectionLabel: (option) => option.notLabel, -// value: {notLabel: 'This is not a label', value: 'not important'}, -// } -// }); +test('when getSelectionLabel method is supplied and value are no items then display result of getSelectionLabel', async (t) => { + const select = new Select({ + target, + props: { + config, + getSelectionLabel: (option) => option.notLabel, + value: {notLabel: 'This is not a label', value: 'not important'}, + } + }); -// t.ok(document.querySelector('.selection').innerHTML === 'This is not a label'); + t.ok(document.querySelector('.selection').innerHTML === 'This is not a label'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// getOptionLabel: (option) => option.notLabel, -// isFocused: true, -// items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], -// } -// }); +test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { + const select = new Select({ + target, + props: { + config, + getOptionLabel: (option) => option.notLabel, + isFocused: true, + items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], + } + }); -// await handleKeyboard('ArrowDown'); -// t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); + await handleKeyboard('ArrowDown', select.input); + t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// getOptionLabel: (option) => option.notLabel, -// isFocused: true, -// items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], -// } -// }); +test('when getOptionLabel method and items is supplied then display result of getOptionLabel for each option', async (t) => { + const select = new Select({ + target, + props: { + config, + getOptionLabel: (option) => option.notLabel, + isFocused: true, + items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], + } + }); -// await handleKeyboard('ArrowDown'); -// t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); + await handleKeyboard('ArrowDown', select.input); + t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when a custom Item component is supplied then use to display each item', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// Item: CustomItem, -// getOptionLabel: (option) => option.name, -// isFocused: true, -// items: [{ -// image_url: 'https://images.punkapi.com/v2/keg.png', -// name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], -// } -// }); +test('when a custom Item component is supplied then use to display each item', async (t) => { + const select = new Select({ + target, + props: { + config: { ...config, Item: CustomItem}, + getOptionLabel: (option) => option.name, + isFocused: true, + items: [{ + image_url: 'https://images.punkapi.com/v2/keg.png', + name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], + } + }); -// await handleKeyboard('ArrowDown'); -// t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); + await handleKeyboard('ArrowDown', select.input); + t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when a custom Selection component is supplied then use to display selection', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// Item: CustomItem, -// Selection: CustomItem, -// getOptionLabel: (option) => option.name, -// isFocused: true, -// items: [{ -// image_url: 'https://images.punkapi.com/v2/keg.png', -// name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], -// } -// }); +test('when a custom Selection component is supplied then use to display selection', async (t) => { + const select = new Select({ + target, + props: { + config: { ...config, + Item: CustomItem, + Selection: CustomItem + }, + getOptionLabel: (option) => option.name, + isFocused: true, + items: [{ + image_url: 'https://images.punkapi.com/v2/keg.png', + name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], + } + }); -// await handleKeyboard('ArrowDown'); -// await handleKeyboard('Enter'); + await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('Enter'); -// t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); + t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when loadOptions method is supplied, isMulti is true and filterText has length then items should populate via promise resolve', async (t) => { +// test.only('when loadOptions method is supplied, isMulti is true and filterText has length then items should populate via promise resolve', async (t) => { // const select = new Select({ // target, // props: { -// config, +// config: { ...config, Item: CustomItem}, // getOptionLabel: (option) => option.name, // getSelectionLabel: (option) => option.name, // loadOptions: getPosts, // optionIdentifier: 'id', -// Item: CustomItem, // isMulti: true // } // }); -// await wait(0); -// await handleSet(select, {filterText: 'Juniper'}); -// await wait(600); -// await handleKeyboard('ArrowDown'); -// await handleKeyboard('Enter'); -// t.ok(document.querySelector('.multiSelectItem_label').innerHTML === 'Juniper Wheat Beer'); -// select.$destroy(); +// // await wait(0); +// // await handleSet(select, {filterText: 'Juniper'}); +// // await wait(600); +// // await handleKeyboard('ArrowDown', select.input); +// // await handleKeyboard('Enter', select.input); +// // t.ok(document.querySelector('.multiSelectItem_label').innerHTML === 'Juniper Wheat Beer'); +// // select.$destroy(); // }); -// test('when getSelectionLabel contains HTML then render the HTML', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// value: items[0], -// getSelectionLabel: (option) => `

${option.label}

`, -// } -// }); +test('when getSelectionLabel contains HTML then render the HTML', async (t) => { + const select = new Select({ + target, + props: { + config, + value: items[0], + getSelectionLabel: (option) => `

${option.label}

`, + } + }); -// t.ok(document.querySelector('.selection').innerHTML === '

Chocolate

'); + t.ok(document.querySelector('.selection').innerHTML === '

Chocolate

'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when getOptionLabel contains HTML then render the HTML', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// getOptionLabel: (option) => `

${option.label}

`, -// isFocused: true -// } -// }); +test('when getOptionLabel contains HTML then render the HTML', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + getOptionLabel: (option) => `

${option.label}

`, + isFocused: true + } + }); -// await handleKeyboard('ArrowDown'); -// t.ok(document.querySelector('.item').innerHTML === '

Chocolate

'); + await handleKeyboard('ArrowDown', select.input); + t.ok(document.querySelector('.item').innerHTML === '

Chocolate

'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when isMulti is true, value populated and arrowLeft is pressed then no items in list should be active', async (t) => { -// const selectMultiSelected = new SelectMultiSelected({ -// target: testTarget, -// }); +test('when isMulti is true, value populated and arrowLeft is pressed then no items in list should be active', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + value: [ + {value: 'pizza', label: 'Pizza'}, + {value: 'chips', label: 'Chips'}, + ], + isFocused: true + } + }); -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// value: [ -// {value: 'pizza', label: 'Pizza'}, -// {value: 'chips', label: 'Chips'}, -// ], -// isFocused: true -// } -// }); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); + t.ok(!document.querySelector('.hover')); + select.$destroy(); +}); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); -// t.ok(!document.querySelector('.hover')); -// select.$destroy(); -// selectMultiSelected.$destroy(); -// }); +test('when hideEmptyState true then do not show "no options" div ', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + listOpen: true, + filterText: 'x', + hideEmptyState: true + } + }); -// test('when hideEmptyState true then do not show "no options" div ', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// listOpen: true, -// filterText: 'x', -// hideEmptyState: true -// } -// }); + await wait(0); -// await wait(0); + t.ok(!document.querySelector('.empty')); -// t.ok(!document.querySelector('.empty')); + select.$destroy(); +}); -// select.$destroy(); -// }); +test('when value changes then select event should fire', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + } + }); -// test('when value changes then select event should fire', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// } -// }); + let selectEvent = undefined; -// let selectEvent = undefined; + select.$on('select', event => { + selectEvent = event; + }); -// select.$on('select', event => { -// selectEvent = event; -// }); + await handleSet(select, {isFocused: true}); + await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('Enter'); -// await handleSet(select, {isFocused: true}); -// await handleKeyboard('ArrowDown'); -// await handleKeyboard('Enter'); + t.ok(selectEvent); -// t.ok(selectEvent); + select.$destroy(); +}); -// select.$destroy(); -// }); +test('when value is cleared the clear event is fired', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + value: items[0], + } + }); -// test('when value is cleared the clear event is fired', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: items[0], -// } -// }); + let clearEvent = false; + select.$on('clear', () => { + clearEvent = true; + }); -// let clearEvent = false; -// select.$on('clear', () => { -// clearEvent = true; -// }); + document.querySelector('.clearSelect').click(); + t.ok(clearEvent); -// document.querySelector('.clearSelect').click(); -// t.ok(clearEvent); + select.$destroy(); +}); -// select.$destroy(); -// }); +test('when multi item is cleared the clear event is fired with removed item', async (t) => { + const itemToRemove = items[0]; -// test('when multi item is cleared the clear event is fired with removed item', async (t) => { -// const itemToRemove = items[0]; + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + value: [itemToRemove] + } + }); -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// value: [itemToRemove] -// } -// }); + let removedItem; -// let removedItem; + select.$on('clear', (event) => { + removedItem = event.detail; + }); -// select.$on('clear', (event) => { -// removedItem = event.detail; -// }); + document.querySelector('.multiSelectItem_clear').click(); + t.equal(JSON.stringify(removedItem), JSON.stringify(itemToRemove)); -// document.querySelector('.multiSelectItem_clear').click(); -// t.equal(JSON.stringify(removedItem), JSON.stringify(itemToRemove)); + select.$destroy(); +}); -// select.$destroy(); -// }); +test('when items in list filter or update then first item in list should highlight', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + isFocused: true + } + }); -// test('when items in list filter or update then first item in list should highlight', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isFocused: true -// } -// }); + await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('ArrowDown'); + await handleKeyboard('ArrowDown'); + + t.ok(document.querySelector('.hover').innerHTML === 'Cake'); + await handleSet(select, {filterText: 'c'}); + t.ok(document.querySelector('.hover').innerHTML === 'Chocolate'); -// await handleKeyboard('ArrowDown'); -// await handleKeyboard('ArrowDown'); -// await handleKeyboard('ArrowDown'); + select.$destroy(); +}); -// t.ok(document.querySelector('.hover').innerHTML === 'Cake'); -// await handleSet(select, {filterText: 'c'}); -// t.ok(document.querySelector('.hover').innerHTML === 'Chocolate'); +test('when item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + value: {value: 'cake', label: 'Cake'} + } + }); -// select.$destroy(); -// }); + let item = undefined; -// test('when item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: {value: 'cake', label: 'Cake'} -// } -// }); + select.$on('select', () => { + item = true; + }); -// let item = undefined; + await handleSet(select, {value: {value: 'cake', label: 'Cake'}}); -// select.$on('select', () => { -// item = true; -// }); + t.ok(!item) + select.$destroy(); +}); -// await handleSet(select, {value: {value: 'cake', label: 'Cake'}}); +test('when isMulti and item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + value: [ + {value: 'pizza', label: 'Pizza'}, + {value: 'chips', label: 'Chips'}, + ], + } + }); -// t.ok(!item) -// select.$destroy(); -// }); + let item = undefined; -// test('when isMulti and item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// value: [ -// {value: 'pizza', label: 'Pizza'}, -// {value: 'chips', label: 'Chips'}, -// ], -// } -// }); + select.$on('select', () => { + item = true; + }); -// let item = undefined; + await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'},{value: 'chips', label: 'Chips'}]}); + t.ok(!item); + item = false; + await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'}]}); -// select.$on('select', () => { -// item = true; -// }); + t.ok(item); + select.$destroy(); +}); -// await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'},{value: 'chips', label: 'Chips'}]}); -// t.ok(!item); -// item = false; -// await handleSet(select, {value: [{value: 'pizza', label: 'Pizza'}]}); +test('when isFocused turns to false then check Select is no longer in focus', async (t) => { + const select = new Select({ + target, + props: { + config, + isFocused: true, + items, + } + }); -// t.ok(item); -// select.$destroy(); -// }); + const selectSecond = new Select({ + target: extraTarget, + props: { + config, + isFocused: false, + items, + } + }); -// test('when isFocused turns to false then check Select is no longer in focus', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isFocused: true, -// items, -// } -// }); + select.$on('select', () => { + setTimeout(() => { + select.$set({ + isFocused: false, + }) + }, 0) -// const selectSecond = new Select({ -// target: extraTarget, -// props: { -// config, -// isFocused: false, -// items, -// } -// }); + selectSecond.$set({ + isFocused: true + }) + }); -// select.$on('select', () => { -// setTimeout(() => { -// select.$set({ -// isFocused: false, -// }) -// }, 0) + await handleSet(select, {value: {value: 'pizza', label: 'Pizza'}}); -// selectSecond.$set({ -// isFocused: true -// }) -// }); -// await handleSet(select, {value: {value: 'pizza', label: 'Pizza'}}); + await wait(0); + t.ok(selectSecond.isFocused); + t.ok(!select.isFocused); -// await wait(0); + selectSecond.$destroy(); + select.$destroy(); +}); -// t.ok(selectSecond.isFocused); -// t.ok(!select.isFocused); +test('when items and loadOptions method are both supplied then fallback to items until filterText changes', async (t) => { + const _items = [{name: 'test1', id: 0}, {name: 'test2', id: 1}, {name: 'test3', id: 2}]; -// selectSecond.$destroy(); -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + getOptionLabel: (option) => option.name, + getSelectionLabel: (option) => option.name, + loadOptions: getPosts, + optionIdentifier: 'id', + items: _items, + isFocused: true, + listOpen: true + } + }); -// test('when items and loadOptions method are both supplied then fallback to items until filterText changes', async (t) => { -// const _items = [{name: 'test1', id: 0}, {name: 'test2', id: 1}, {name: 'test3', id: 2}]; + await wait(0); + t.ok(document.querySelector('.item').innerHTML === 'test1'); + await handleSet(select, {filterText: 'Juniper'}); + await wait(500); + t.ok(document.querySelector('.item').innerHTML === 'Juniper Wheat Beer'); -// const select = new Select({ -// target, -// props: { -// config, -// getOptionLabel: (option) => option.name, -// getSelectionLabel: (option) => option.name, -// loadOptions: getPosts, -// optionIdentifier: 'id', -// items: _items, -// isFocused: true, -// listOpen: true -// } -// }); + select.$destroy(); +}); -// await wait(0); -// t.ok(document.querySelector('.item').innerHTML === 'test1'); -// await handleSet(select, {filterText: 'Juniper'}); -// await wait(500); -// t.ok(document.querySelector('.item').innerHTML === 'Juniper Wheat Beer'); +test('when items is just an array of strings then render list', async (t) => { + const items = ['one', 'two', 'three']; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + items, + listOpen: true + } + }); -// test('when items is just an array of strings then render list', async (t) => { -// const items = ['one', 'two', 'three']; + await wait(0); + t.ok(document.querySelector('.item').innerHTML === 'one'); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// listOpen: true -// } -// }); + select.$destroy(); +}); -// await wait(0); -// t.ok(document.querySelector('.item').innerHTML === 'one'); +test('when items are just strings then value should render', async (t) => { + const items = ['one', 'two', 'three']; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + items, + value: {value: 'one', label: 'one', index: 0} + } + }); -// test('when items are just strings then value should render', async (t) => { -// const items = ['one', 'two', 'three']; + t.ok(document.querySelector('.selection').innerHTML === 'one'); + select.$destroy(); +}); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: {value: 'one', label: 'one', index: 0} -// } -// }); +test('when VirtualList then render list', async (t) => { + function fill(len, fn) { + return Array(len).fill().map((_, i) => fn(i)); + } -// t.ok(document.querySelector('.selection').innerHTML === 'one'); -// select.$destroy(); -// }); + const items = fill(10000, (i) => { + const name = getName(); + return name + }); -// // test('when isVirtualList then render list', async (t) => { -// // function fill(len, fn) { -// // return Array(len).fill().map((_, i) => fn(i)); -// // } - -// // const items = fill(10000, (i) => { -// // const name = getName(); -// // return name -// // }); - -// // const select = new Select({ -// // target, -// // props: { -// // config, -// // items, -// // isVirtualList: true, -// // listOpen: true -// // } -// // }); - -// // await wait(0); -// // t.ok(document.querySelector('.list-item')); - -// // select.$destroy(); -// // }); - -// // test('when isVirtualList and filterText changes then rendered list scrolls to top', async (t) => { -// // function fill(len, fn) { -// // return Array(len).fill().map((_, i) => fn(i)); -// // } - -// // const items = fill(10000, (i) => { -// // const name = getName(); -// // return name -// // }); - -// // const select = new Select({ -// // target, -// // props: { -// // config, -// // items, -// // isVirtualList: true, -// // listOpen: true -// // } -// // }); - -// // await wait(0); -// // const virtual = document.querySelector('svelte-virtual-list-viewport'); -// // virtual.scrollTop = 120000; - -// // select.$set({ -// // filterText: 'swift' -// // }); - -// // await wait(0); -// // t.ok(virtual.scrollTop === 0); - -// // select.$destroy(); -// // }); - -// test('when isMulti and value has items then check each item is unique', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// value: [ -// {value: 'pizza', label: 'Pizza'}, -// {value: 'pizza', label: 'Pizza'}, -// {value: 'cake', label: 'Cake'}, -// ], -// } -// }); + const select = new Select({ + target, + props: { + config: { ...config, VirtualList }, + items, + listOpen: true + } + }); -// t.ok(select.value.length === 2); + await wait(0); + t.ok(document.querySelector('.list-item')); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when isMulti and textFilter has length then enter should select item', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// isFocused: true, -// filterText: 'p', -// listOpen: true -// } -// }); +test('when isMulti and value has items then check each item is unique', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + value: [ + {value: 'pizza', label: 'Pizza'}, + {value: 'pizza', label: 'Pizza'}, + {value: 'cake', label: 'Cake'}, + ], + } + }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// t.ok(select.value[0].value === 'pizza'); + t.ok(select.value.length === 2); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when isMulti and textFilter has length and no items in list then enter should do nothing', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// isFocused: true, -// filterText: 'zc', -// listOpen: true -// } -// }); +test('when isMulti and textFilter has length then enter should select item', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + isFocused: true, + filterText: 'p', + listOpen: true + } + }); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// t.ok(!select.value); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + t.ok(select.value[0].value === 'pizza'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When isMulti and no selected item then delete should do nothing', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// isFocused: true, -// listOpen: true -// } -// }); +test('when isMulti and textFilter has length and no items in list then enter should do nothing', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + isFocused: true, + filterText: 'zc', + listOpen: true + } + }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Backspace'})); -// t.ok(select.listOpen === true); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + t.ok(!select.value); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When list is open, filterText applied and Enter/Tab key pressed should select and show highlighted value', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// listOpen: true, -// isFocused: true, -// filterText: 'A5', -// items: ['A5', 'test string', 'something else'] -// } -// }); +test('When isMulti and no selected item then delete should do nothing', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + isFocused: true, + listOpen: true + } + }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// t.equal(select.value.value, 'A5'); -// await wait(0); -// t.ok(target.querySelector('.selected-item .selection').innerHTML === 'A5'); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Backspace'})); + t.ok(select.listOpen === true); -// select.$destroy(); -// }); + select.$destroy(); +}); +test('When list is open, filterText applied and Enter/Tab key pressed should select and show highlighted value', async (t) => { + const select = new Select({ + target, + props: { + config, + listOpen: true, + isFocused: true, + filterText: 'A5', + items: ['A5', 'test string', 'something else'] + } + }); -// test('When inputAttributes is supplied each attribute is placed on the Select input field', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// inputAttributes: { -// id: 'testId', -// autocomplete: 'custom-value' -// } -// } -// }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + t.equal(select.value.value, 'A5'); + await wait(0); + t.ok(target.querySelector('.selected-item .selection').innerHTML === 'A5'); -// const el = document.getElementById('testId'); + select.$destroy(); +}); -// t.equal(el.id, 'testId'); -// t.equal(el.getAttribute('autocomplete'), 'custom-value'); -// select.$destroy(); -// }); +test('When inputAttributes is supplied each attribute is placed on the Select input field', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + inputAttributes: { + id: 'testId', + autocomplete: 'custom-value' + } + } + }); -// test('when items and value supplied as just strings then value should render correctly', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: ['Pizza', 'Chocolate', 'Crisps'], -// value: 'Pizza' -// } -// }); + const el = document.getElementById('testId'); -// t.equal(document.querySelector('.selected-item .selection').innerHTML, 'Pizza'); + t.equal(el.id, 'testId'); + t.equal(el.getAttribute('autocomplete'), 'custom-value'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when isMulti with items and value supplied as just strings then value should render correctly', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items: ['Pizza', 'Chocolate', 'Crisps'], -// value: ['Pizza'] -// } -// }); +test('when items and value supplied as just strings then value should render correctly', async (t) => { + const select = new Select({ + target, + props: { + config, + items: ['Pizza', 'Chocolate', 'Crisps'], + value: 'Pizza' + } + }); -// t.equal(document.querySelector('.multiSelectItem_label').innerHTML, 'Pizza'); + t.equal(document.querySelector('.selected-item .selection').innerHTML, 'Pizza'); -// select.$destroy(); -// }); + select.$destroy(); +}); + +test('when isMulti with items and value supplied as just strings then value should render correctly', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items: ['Pizza', 'Chocolate', 'Crisps'], + value: ['Pizza'] + } + }); + + t.equal(document.querySelector('.multiSelectItem_label').innerHTML, 'Pizza'); + + select.$destroy(); +}); + +test('when isMulti, groupBy and value are supplied then list should be filtered', async (t) => { + let _items = [ + { id: 1, name: "Foo", group: "first" }, + { id: 2, name: "Bar", group: "second" }, + { id: 3, name: "Baz", group: "second" }, + { id: 4, name: "Qux", group: "first" }, + { id: 5, name: "Bah", group: "first" }, + ]; + + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items: _items, + groupBy: (item) => item.group, + optionIdentifier: 'id', + getSelectionLabel: (item) => item.name, + getOptionLabel: (item) => item.name, + value: [{ id: 2, name: "Bar", group: "second" }], + listOpen: true + } + }); -// test('when isMulti, groupBy and value are supplied then list should be filtered', async (t) => { -// let _items = [ -// { id: 1, name: "Foo", group: "first" }, -// { id: 2, name: "Bar", group: "second" }, -// { id: 3, name: "Baz", group: "second" }, -// { id: 4, name: "Qux", group: "first" }, -// { id: 5, name: "Bah", group: "first" }, -// ]; + t.ok(!select.getFilteredItems().find(item => item.name === 'Bar')); -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items: _items, -// groupBy: (item) => item.group, -// optionIdentifier: 'id', -// getSelectionLabel: (item) => item.name, -// getOptionLabel: (item) => item.name, -// value: [{ id: 2, name: "Bar", group: "second" }], -// listOpen: true -// } -// }); + select.$destroy(); +}); -// t.ok(!select.getFilteredItems().find(item => item.name === 'Bar')); +test('When isCreatable disabled, creator is not displayed', async (t) => { + const filterText = 'abc'; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + items, + isFocused: true, + listOpen: true + } + }); -// test('When isCreatable disabled, creator is not displayed', async (t) => { -// const filterText = 'abc'; + select.$set({ filterText }); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isFocused: true, -// listOpen: true -// } -// }); + await wait(0); -// select.$set({ filterText }); + t.ok(document.querySelector('.list > .empty')); -// await wait(0); + select.$destroy(); +}); -// t.ok(document.querySelector('.list > .empty')); +test('When isCreatable enabled, creator displays getOptionLabel for isCreator', async (t) => { + const filterText = 'abc_XXXX'; -// select.$destroy(); -// }); + function getOptionLabel(item, filterText) { + return item.isCreator ? `Wanna add ${filterText}?`: item.label; + } -// test('When isCreatable enabled, creator displays getOptionLabel for isCreator', async (t) => { -// const filterText = 'abc_XXXX'; + const creatorItem = { label: filterText, value: filterText, isCreator: true }; -// function getOptionLabel(item, filterText) { -// return item.isCreator ? `Wanna add ${filterText}?`: item.label; -// } + const select = new Select({ + target, + props: { + config, + items, + isCreatable: true, + isFocused: true, + listOpen: true, + getOptionLabel + } + }); -// const creatorItem = { label: filterText, value: filterText, isCreator: true }; + await wait(0); + select.$set({ filterText }); + await wait(0); + const listItems = document.querySelectorAll('.list > .list-item'); + t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, getOptionLabel(creatorItem, filterText)); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isCreatable: true, -// isFocused: true, -// listOpen: true, -// getOptionLabel -// } -// }); + select.$destroy(); +}); -// await wait(0); -// select.$set({ filterText }); -// await wait(0); -// const listItems = document.querySelectorAll('.list > .list-item'); -// t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, getOptionLabel(creatorItem, filterText)); +test('When isCreatable enabled, creator is not displayed when duplicate item value in item list', async (t) => { + const dupeValueForCheck = 'xxxxxx'; + const item = { + value: dupeValueForCheck, + label: dupeValueForCheck + }; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + items: [item], + isCreatable: true, + listOpen: true + } + }); -// test('When isCreatable enabled, creator is not displayed when duplicate item value in item list', async (t) => { -// const dupeValueForCheck = 'xxxxxx'; -// const item = { -// value: dupeValueForCheck, -// label: dupeValueForCheck -// }; + await wait(0); + select.$set({ filterText: dupeValueForCheck }); + await wait(0); -// const select = new Select({ -// target, -// props: { -// config, -// items: [item], -// isCreatable: true, -// listOpen: true -// } -// }); + const listItems = document.querySelectorAll('.list > .list-item'); + t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, dupeValueForCheck); -// await wait(0); -// select.$set({ filterText: dupeValueForCheck }); -// await wait(0); + select.$destroy(); +}); -// const listItems = document.querySelectorAll('.list > .list-item'); -// t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, dupeValueForCheck); +test('When creator selected, selected item is set to created item', async (t) => { + const filterText = 'abc'; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + items, + isCreatable: true, + isFocused: true, + listOpen: true + } + }); -// test('When creator selected, selected item is set to created item', async (t) => { -// const filterText = 'abc'; + await wait(0); + select.$set({ filterText }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isCreatable: true, -// isFocused: true, -// listOpen: true -// } -// }); + const { value } = select; + t.ok(value.value === 'abc'); + t.ok(value.label === 'abc'); -// await wait(0); -// select.$set({ filterText }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + select.$destroy(); +}); -// const { value } = select; -// t.ok(value.value === 'abc'); -// t.ok(value.label === 'abc'); +test('When creator is selected, created item it added to multi selection', async (t) => { + const filterText = 'abc'; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + items, + isCreatable: true, + isFocused: true, + listOpen: true, + isMulti: true + } + }); -// test('When creator is selected, created item it added to multi selection', async (t) => { -// const filterText = 'abc'; + await wait(0); + select.$set({ filterText }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isCreatable: true, -// isFocused: true, -// listOpen: true, -// isMulti: true -// } -// }); + const { value } = select; + t.ok(value[0].value === 'abc'); + t.ok(value[0].label === 'abc'); -// await wait(0); -// select.$set({ filterText }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + select.$destroy(); +}); -// const { value } = select; -// t.ok(value[0].value === 'abc'); -// t.ok(value[0].label === 'abc'); +test('When creator is selected multiple times, items are all added to multi selection', async (t) => { + const filterTextForItem1 = 'abc'; + const filterTextForItem2 = 'def'; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + items, + isCreatable: true, + isFocused: true, + listOpen: true, + isMulti: true + } + }); -// test('When creator is selected multiple times, items are all added to multi selection', async (t) => { -// const filterTextForItem1 = 'abc'; -// const filterTextForItem2 = 'def'; + await wait(0); + select.$set({ filterText: filterTextForItem1 }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + await wait(0); + t.ok(select.value[0].value === 'abc'); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isCreatable: true, -// isFocused: true, -// listOpen: true, -// isMulti: true -// } -// }); + select.$set({ filterText: filterTextForItem2 }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + await wait(0); + t.ok(select.value[1].value === 'def'); -// await wait(0); -// select.$set({ filterText: filterTextForItem1 }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// await wait(0); -// t.ok(select.value[0].value === 'abc'); + select.$destroy(); +}); -// select.$set({ filterText: filterTextForItem2 }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// await wait(0); -// t.ok(select.value[1].value === 'def'); +test('When isMulti and an items remove icon is clicked then item should be removed from value', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + items, + isCreatable: true, + value: [ + {value: 'pizza', label: 'Pizza'}, + {value: 'cake', label: 'Cake'}, + ], + isMulti: true + } + }); -// select.$destroy(); -// }); + await querySelectorClick('.multiSelectItem_clear'); + t.ok(select.value[0].value === 'cake') + await querySelectorClick('.multiSelectItem_clear'); + t.ok(!select.value); -// test('When isMulti and an items remove icon is clicked then item should be removed from value', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isCreatable: true, -// value: [ -// {value: 'pizza', label: 'Pizza'}, -// {value: 'cake', label: 'Cake'}, -// ], -// isMulti: true -// } -// }); + select.$destroy(); +}); -// await querySelectorClick('.multiSelectItem_clear'); -// t.ok(select.value[0].value === 'cake') -// await querySelectorClick('.multiSelectItem_clear'); -// t.ok(!select.value); +test('When isCreatable with non-default item structure, item creator displays getCreatorLabel label for isCreator', async (t) => { + const _items = [ + {country: 'Italy', food: 'Pizza'}, + {country: 'Australia', food: 'Meat Pie'}, + {country: 'China', food: 'Fried Rice'} + ]; -// select.$destroy(); -// }); + const filterText = 'Fried Chicken Roll'; -// test('When isCreatable with non-default item structure, item creator displays getCreatorLabel label for isCreator', async (t) => { -// const _items = [ -// {country: 'Italy', food: 'Pizza'}, -// {country: 'Australia', food: 'Meat Pie'}, -// {country: 'China', food: 'Fried Rice'} -// ]; + function creatorLabel(filterText) { + return `Do you want to create ${ filterText } as an added food?`; + } -// const filterText = 'Fried Chicken Roll'; + function itemDisplay(item, filterText) { + return item.isCreator ? creatorLabel(filterText) : `${item.food} (${item.country})`; + } -// function creatorLabel(filterText) { -// return `Do you want to create ${ filterText } as an added food?`; -// } + const select = new Select({ + target, + props: { + config, + optionIdentifier: 'food', + getOptionLabel: itemDisplay, + getSelectionLabel: itemDisplay, + items: _items, + isCreatable: true, + createItem(filterText) { + return { + food: filterText, + country: 'Added' + }; + } + } + }); -// function itemDisplay(item, filterText) { -// return item.isCreator ? creatorLabel(filterText) : `${item.food} (${item.country})`; -// } + await wait(0); + select.$set({ filterText }); + await wait(0); + const listItems = document.querySelectorAll('.list > .list-item'); + t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, creatorLabel(filterText)); -// const select = new Select({ -// target, -// props: { -// config, -// optionIdentifier: 'food', -// getOptionLabel: itemDisplay, -// getSelectionLabel: itemDisplay, -// items: _items, -// isCreatable: true, -// createItem(filterText) { -// return { -// food: filterText, -// country: 'Added' -// }; -// } -// } -// }); + select.$destroy(); +}); -// await wait(0); -// select.$set({ filterText }); -// await wait(0); -// const listItems = document.querySelectorAll('.list > .list-item'); -// t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, creatorLabel(filterText)); +test('When isCreatable and isMulti and optionIdentifier is supplied creator displays getCreatorLabel label', async (t) => { + const filterText = 'abc'; + const _items = [ + {foo: 'chocolate', label: 'Chocolate'}, + {foo: 'pizza', label: 'Pizza'} + ]; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config: {...config, Multi}, + optionIdentifier: 'foo', + isMulti: true, + items: _items, + isCreatable: true + } + }); -// test('When isCreatable and isMulti and optionIdentifier is supplied creator displays getCreatorLabel label', async (t) => { -// const filterText = 'abc'; -// const _items = [ -// {foo: 'chocolate', label: 'Chocolate'}, -// {foo: 'pizza', label: 'Pizza'} -// ]; + await wait(0); + select.$set({ filterText }); + await wait(0); + const listItems = document.querySelectorAll('.list > .list-item'); + t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, `Create \"${ filterText }\"`); -// const select = new Select({ -// target, -// props: { -// config, -// optionIdentifier: 'foo', -// isMulti: true, -// items: _items, -// isCreatable: true -// } -// }); + select.$destroy(); +}); -// await wait(0); -// select.$set({ filterText }); -// await wait(0); -// const listItems = document.querySelectorAll('.list > .list-item'); -// t.equal(listItems[listItems.length - 1].querySelector('.item').innerHTML, `Create \"${ filterText }\"`); +test('When isCreatable and isMulti and optionIdentifier is supplied multiple creatable items can be added', async (t) => { + const filterText = 'foo'; + const filterText2 = 'bar'; -// select.$destroy(); -// }); + const _items = [ + {id: 1, tag_name: 'Banana'}, + {id: 5, tag_name: 'Orange'}, + {id: 4, tag_name: 'Tree'}, + {id: 3, tag_name: 'Guns'}, + {id: 2, tag_name: 'Cars'}, + ]; -// test('When isCreatable and isMulti and optionIdentifier is supplied multiple creatable items can be added', async (t) => { -// const filterText = 'foo'; -// const filterText2 = 'bar'; + const optionIdentifier = 'tag_name'; + const getOptionLabel = (option) => option.tag_name; + const getSelectionLabel = (option) => option.tag_name; + const createItem = (filterText) => ({id:undefined, tag_name:filterText}); -// const _items = [ -// {id: 1, tag_name: 'Banana'}, -// {id: 5, tag_name: 'Orange'}, -// {id: 4, tag_name: 'Tree'}, -// {id: 3, tag_name: 'Guns'}, -// {id: 2, tag_name: 'Cars'}, -// ]; + const select = new Select({ + target, + props: { + config: {...config, Multi}, + optionIdentifier, + isMulti: true, + items: _items, + isCreatable: true, + getOptionLabel, + getSelectionLabel, + createItem, + } + }); -// const optionIdentifier = 'tag_name'; -// const getOptionLabel = (option) => option.tag_name; -// const getSelectionLabel = (option) => option.tag_name; -// const createItem = (filterText) => ({id:undefined, tag_name:filterText}); + await wait(0); + select.$set({ filterText }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + await wait(0); + select.$set({ filterText: filterText2 }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + await wait(0); -// const select = new Select({ -// target, -// props: { -// config, -// optionIdentifier, -// isMulti: true, -// items: _items, -// isCreatable: true, -// getOptionLabel, -// getSelectionLabel, -// createItem, -// } -// }); + t.ok(select.value.length === 2); + t.ok(select.value[0].tag_name); -// await wait(0); -// select.$set({ filterText }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// await wait(0); -// select.$set({ filterText: filterText2 }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// await wait(0); + select.$destroy(); +}); -// t.ok(select.value.length === 2); -// t.ok(select.value[0].tag_name); +test('When isCreatable and item is created then createItem method should only run once', async (t) => { + let createItemRun = 0; + const createItem = (filterText) => { + createItemRun += 1; + return { + value: filterText, + label: filterText + }; + }; -// select.$destroy(); -// }); + const select = new Select({ + target, + props: { + config, + isCreatable: true, + items, + createItem + } + }); -// test('When isCreatable and item is created then createItem method should only run once', async (t) => { -// let createItemRun = 0; -// const createItem = (filterText) => { -// createItemRun += 1; -// return { -// value: filterText, -// label: filterText -// }; -// }; + await wait(0); + select.$set({ filterText: 'foo' }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// const select = new Select({ -// target, -// props: { -// config, -// isCreatable: true, -// items, -// createItem -// } -// }); + t.ok(createItemRun === 2); -// await wait(0); -// select.$set({ filterText: 'foo' }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + select.$destroy(); +}); -// t.ok(createItemRun === 2); +test('When items are collection and value a string then lookup item using optionIdentifier and update value to match', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + value: 'cake' + } + }); -// select.$destroy(); -// }); + await wait(0); + t.ok(select.value.value === 'cake'); + select.$set({ value: 'pizza' }); + await wait(0); + t.ok(select.value.value === 'pizza'); + select.$destroy(); +}); -// test('When items are collection and value a string then lookup item using optionIdentifier and update value to match', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: 'cake' -// } -// }); +test('When listAutoWidth is set to false list container should have style of width:100%', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + listAutoWidth: false, + listOpen: true + } + }); -// await wait(0); -// t.ok(select.value.value === 'cake'); -// select.$set({ value: 'pizza' }); -// await wait(0); -// t.ok(select.value.value === 'pizza'); -// select.$destroy(); -// }); + await wait(0); + const listWidth = document.querySelectorAll('.list')[0].style.width; + t.ok(listWidth === '100%'); + select.$destroy(); +}); -// test('When listAutoWidth is set to false list container should have style of width:100%', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// listAutoWidth: false, -// listOpen: true -// } -// }); -// await wait(0); -// const listWidth = document.querySelectorAll('.list')[0].style.width; -// t.ok(listWidth === '100%'); -// select.$destroy(); -// }); +test('When item is already active and is selected from list then close list', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + listOpen: true, + value: 'pizza' + } + }); + await wait(0); + await querySelectorClick('.list > .list-item > .item.active'); + await wait(0); + t.ok(select.value.value === 'pizza'); + select.$destroy(); +}); -// test('When item is already active and is selected from list then close list', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// listOpen: true, -// value: 'pizza' -// } -// }); -// await wait(0); -// await querySelectorClick('.list > .list-item > .item.active'); -// await wait(0); -// t.ok(select.value.value === 'pizza'); -// select.$destroy(); -// }); +test('When Icon prop is supplied then render on Select', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + Icon: TestIcon + } + }); + t.ok(document.querySelectorAll('#testIcon')[0]); -// test('When Icon prop is supplied then render on Select', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// Icon: TestIcon -// } -// }); + select.$destroy(); +}); -// t.ok(document.querySelectorAll('#testIcon')[0]); +test('When showChevron prop is true only show chevron when there is no value on Select', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + value: {value: 'chocolate', label: 'Chocolate'}, + showChevron: true + } + }); -// select.$destroy(); -// }); + t.ok(document.querySelectorAll('.indicator').length === 0); -// test('When showChevron prop is true only show chevron when there is no value on Select', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: {value: 'chocolate', label: 'Chocolate'}, -// showChevron: true -// } -// }); + select.$destroy(); +}); -// t.ok(document.querySelectorAll('.indicator').length === 0); +test('When showChevron prop is true and no value show chevron on Select', async (t) => { + const select = new Select({ + target, + props: { + config, + ChevronIcon, + items, + showChevron: true + } + }); -// select.$destroy(); -// }); + t.ok(document.querySelectorAll('.chevron')[0]); -// test('When showChevron prop is true and no value show chevron on Select', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// ChevronIcon, -// items, -// showChevron: true -// } -// }); + select.$destroy(); +}); -// t.ok(document.querySelectorAll('.chevron')[0]); +test('When showChevron and isClearable is true always show chevron on Select', async (t) => { + const select = new Select({ + target, + props: { + config, + ChevronIcon, + items, + value: {value: 'chocolate', label: 'Chocolate'}, + showChevron: true, + isClearable: false + } + }); -// select.$destroy(); -// }); + t.ok(document.querySelectorAll('.chevron')[0]); -// test('When showChevron and isClearable is true always show chevron on Select', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// ChevronIcon, -// items, -// value: {value: 'chocolate', label: 'Chocolate'}, -// showChevron: true, -// isClearable: false -// } -// }); + select.$destroy(); +}); -// t.ok(document.querySelectorAll('.chevron')[0]); +test('When items and loadItems then listOpen should be false', async (t) => { + const select = new Select({ + target, + props: { + config, + getSelectionLabel: (option) => option.name, + getOptionLabel: (option) => option.name, + loadOptions: getPosts, + optionIdentifier: 'id', + items: [{ + id: 1, + name: 'Initial Items #1' + }] -// select.$destroy(); -// }); + } + }); -// test('When items and loadItems then listOpen should be false', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// getSelectionLabel: (option) => option.name, -// getOptionLabel: (option) => option.name, -// loadOptions: getPosts, -// optionIdentifier: 'id', -// items: [{ -// id: 1, -// name: 'Initial Items #1' -// }] + t.ok(select.listOpen === false); -// } -// }); + select.$destroy(); +}); -// t.ok(select.listOpen === false); +test('Select container classes can be injected', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + value: {value: 'cake', label: 'Cake'}, + class: 'select-container testclass', + }, + }); -// select.$destroy(); -// }); + t.ok( + document.querySelector('.select-container').classList.contains('testclass') + ); + select.$destroy(); +}); -// test('Select container classes can be injected', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: {value: 'cake', label: 'Cake'}, -// class: 'select-container testclass', -// }, -// }); -// t.ok( -// document.querySelector('.select-container').classList.contains('testclass') -// ); -// select.$destroy(); -// }); +test('When noOptionsMessage is changed after List component has been created then propagate update', async (t) => { + const select = new Select({ + target, + props: { + config, + getOptionLabel: (option) => option.name, + loadOptions: getPosts, + optionIdentifier: 'id', + Item: CustomItem, + Selection: CustomItem, + noOptionsMessage: 'FIRST' + }, + }); + await wait(0); + select.$set({listOpen: true}); + await wait(0); + t.ok(document.querySelector('.empty').innerHTML === 'FIRST'); + select.$set({noOptionsMessage: 'SECOND'}); + await wait(0); + t.ok(document.querySelector('.empty').innerHTML === 'SECOND'); + select.$set({filterText: 'sdfsf ssdfsdfs fs'}); + select.$set({noOptionsMessage: 'THIRD'}); + await wait(0); + t.ok(document.querySelector('.empty').innerHTML === 'THIRD'); -// test('When noOptionsMessage is changed after List component has been created then propagate update', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// getOptionLabel: (option) => option.name, -// loadOptions: getPosts, -// optionIdentifier: 'id', -// Item: CustomItem, -// Selection: CustomItem, -// noOptionsMessage: 'FIRST' -// }, -// }); + select.$destroy(); +}); -// await wait(0); -// select.$set({listOpen: true}); -// await wait(0); -// t.ok(document.querySelector('.empty').innerHTML === 'FIRST'); -// select.$set({noOptionsMessage: 'SECOND'}); -// await wait(0); -// t.ok(document.querySelector('.empty').innerHTML === 'SECOND'); -// select.$set({filterText: 'sdfsf ssdfsdfs fs'}); -// select.$set({noOptionsMessage: 'THIRD'}); -// await wait(0); -// t.ok(document.querySelector('.empty').innerHTML === 'THIRD'); - -// select.$destroy(); -// }); +test('When loadOptions promise is resolved then dispatch loaded', async (t) => { + const select = new Select({ + target, + props: { + config, + loadOptions: resolvePromise, + }, + }); -// test('When loadOptions promise is resolved then dispatch loaded', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// loadOptions: resolvePromise, -// }, -// }); + let loadedEventData = undefined; + const loadedOff = select.$on('loaded', event => { + loadedEventData = event; + }); + let errorEventData = undefined; + const errorOff = select.$on('error', event => { + errorEventData = event; + }) -// let loadedEventData = undefined; -// const loadedOff = select.$on('loaded', event => { -// loadedEventData = event; -// }); -// let errorEventData = undefined; -// const errorOff = select.$on('error', event => { -// errorEventData = event; -// }) - -// await wait(0); -// select.$set({listOpen: true}); -// await wait(0); -// select.$set({filterText: 'test'}); -// await wait(500); + await wait(0); + select.$set({listOpen: true}); + await wait(0); + select.$set({filterText: 'test'}); + await wait(500); -// t.equal(loadedEventData.detail.items[0].value, 'a'); -// t.equal(errorEventData, undefined); + t.equal(loadedEventData.detail.items[0].value, 'a'); + t.equal(errorEventData, undefined); -// loadedOff(); -// errorOff(); -// select.$destroy(); -// }); + loadedOff(); + errorOff(); + select.$destroy(); +}); -// test('When loadOptions promise is rejected then dispatch error', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// loadOptions: rejectPromise, -// }, -// }); +test('When loadOptions promise is rejected then dispatch error', async (t) => { + const select = new Select({ + target, + props: { + config, + loadOptions: rejectPromise, + }, + }); -// let loadedEventData = undefined; -// const loadedOff = select.$on('loaded', event => { -// loadedEventData = event; -// }); -// let errorEventData = undefined; -// const errorOff = select.$on('error', event => { -// errorEventData = event; -// }); + let loadedEventData = undefined; + const loadedOff = select.$on('loaded', event => { + loadedEventData = event; + }); + let errorEventData = undefined; + const errorOff = select.$on('error', event => { + errorEventData = event; + }); -// await wait(0); -// select.$set({listOpen: true}); -// await wait(0); -// select.$set({filterText: 'test'}); -// await wait(500); -// t.equal(loadedEventData, undefined); -// t.equal(errorEventData.detail.type, 'loadOptions'); -// t.equal(errorEventData.detail.details, 'error 123'); - -// loadedOff(); -// errorOff(); -// select.$destroy(); -// }); + await wait(0); + select.$set({listOpen: true}); + await wait(0); + select.$set({filterText: 'test'}); + await wait(500); + t.equal(loadedEventData, undefined); + t.equal(errorEventData.detail.type, 'loadOptions'); + t.equal(errorEventData.detail.details, 'error 123'); -// test('When items change then value should also update', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: {value: 'chips', label: 'Chips'}, -// }, -// }); + loadedOff(); + errorOff(); + select.$destroy(); +}); + +test('When items change then value should also update', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + value: {value: 'chips', label: 'Chips'}, + }, + }); -// await wait(0); + await wait(0); -// select.$set({items: [ -// {value: 'chocolate', label: 'Chocolate'}, -// {value: 'pizza', label: 'Pizza'}, -// {value: 'cake', label: 'Cake'}, -// {value: 'chips', label: 'Loaded Fries'}, -// {value: 'ice-cream', label: 'Ice Cream'}, -// ]}); + select.$set({items: [ + {value: 'chocolate', label: 'Chocolate'}, + {value: 'pizza', label: 'Pizza'}, + {value: 'cake', label: 'Cake'}, + {value: 'chips', label: 'Loaded Fries'}, + {value: 'ice-cream', label: 'Ice Cream'}, + ]}); -// await wait(0); + await wait(0); -// t.ok(select.value.label === 'Loaded Fries'); -// t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Loaded Fries'); + t.ok(select.value.label === 'Loaded Fries'); + t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Loaded Fries'); -// select.$destroy(); + select.$destroy(); -// await wait(0); + await wait(0); -// const multiSelect = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], -// }, -// }); + const multiSelect = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], + }, + }); -// await wait(0); + await wait(0); -// multiSelect.$set({items: [ -// {value: 'chocolate', label: 'Chocolate'}, -// {value: 'pizza', label: 'Cheese Pizza'}, -// {value: 'cake', label: 'Cake'}, -// {value: 'chips', label: 'Loaded Fries'}, -// {value: 'ice-cream', label: 'Ice Cream'}, -// ]}); + multiSelect.$set({items: [ + {value: 'chocolate', label: 'Chocolate'}, + {value: 'pizza', label: 'Cheese Pizza'}, + {value: 'cake', label: 'Cake'}, + {value: 'chips', label: 'Loaded Fries'}, + {value: 'ice-cream', label: 'Ice Cream'}, + ]}); -// await wait(0); + await wait(0); -// t.ok(multiSelect.value[0].label === 'Loaded Fries'); -// t.ok(multiSelect.value[1].label === 'Cheese Pizza'); + t.ok(multiSelect.value[0].label === 'Loaded Fries'); + t.ok(multiSelect.value[1].label === 'Cheese Pizza'); -// multiSelect.$destroy(); -// }); + multiSelect.$destroy(); +}); -// test('When items change then value should also update but only if found in items', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: {value: 'chips', label: 'Chips'}, -// }, -// }); +test('When items change then value should also update but only if found in items', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + value: {value: 'chips', label: 'Chips'}, + }, + }); -// await wait(0); + await wait(0); -// select.$set({items: [ -// {value: 'chocolate', label: 'Chocolate'}, -// {value: 'pizza', label: 'Pizza'}, -// {value: 'cake', label: 'Cake'}, -// {value: 'loaded-fries', label: 'Loaded Fries'}, -// {value: 'ice-cream', label: 'Ice Cream'}, -// ]}); + select.$set({items: [ + {value: 'chocolate', label: 'Chocolate'}, + {value: 'pizza', label: 'Pizza'}, + {value: 'cake', label: 'Cake'}, + {value: 'loaded-fries', label: 'Loaded Fries'}, + {value: 'ice-cream', label: 'Ice Cream'}, + ]}); -// await wait(0); + await wait(0); -// t.ok(select.value.label === 'Chips'); -// t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); + t.ok(select.value.label === 'Chips'); + t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When isMulti and multiFullItemClearable then clicking anywhere on the item will remove item', async (t) => { -// const multiSelect = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// multiFullItemClearable: true, -// value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], -// }, -// }); +test('When isMulti and multiFullItemClearable then clicking anywhere on the item will remove item', async (t) => { + const multiSelect = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + multiFullItemClearable: true, + value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], + }, + }); -// await wait(0); -// await querySelectorClick('.multiSelectItem'); -// await wait(0); -// t.ok(multiSelect.value[0].label === 'Pizza'); + await wait(0); + await querySelectorClick('.multiSelectItem'); + await wait(0); + t.ok(multiSelect.value[0].label === 'Pizza'); -// multiSelect.$destroy(); -// }); + multiSelect.$destroy(); +}); -// test('When isMulti and filterText then items should filter out already selected items', async (t) => { -// const multiSelect = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items, -// value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], -// }, -// }); +test('When isMulti and filterText then items should filter out already selected items', async (t) => { + const multiSelect = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items, + value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], + }, + }); -// t.ok(multiSelect.getFilteredItems().length === 3); + t.ok(multiSelect.getFilteredItems().length === 3); -// multiSelect.$destroy(); -// }); - -// test('when loadOptions and items is supplied then list should close on blur', async (t) => { -// const div = document.createElement('div'); -// document.body.appendChild(div); -// let items=[{value:1, label:1}, {value:2, label:2}]; -// let loadOptions = async(filterText) => { -// const res = await fetch(`https://api.punkapi.com/v2/beers?beer_name=${filterText}`) -// const data = await res.json(); -// return data.map((beer)=> ({value: beer.id, label: beer.name})); -// } + multiSelect.$destroy(); +}); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// loadOptions, -// } -// }); +test('when loadOptions and items is supplied then list should close on blur', async (t) => { + const div = document.createElement('div'); + document.body.appendChild(div); + let items=[{value:1, label:1}, {value:2, label:2}]; + let loadOptions = async(filterText) => { + const res = await fetch(`https://api.punkapi.com/v2/beers?beer_name=${filterText}`) + const data = await res.json(); + return data.map((beer)=> ({value: beer.id, label: beer.name})); + } -// select.$set({isFocused: true}); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); -// await wait(0); -// select.$set(({ filterText: 's'})) -// await wait(600); -// div.click(); -// div.remove(); + const select = new Select({ + target, + props: { + config, + items, + loadOptions, + } + }); -// select.$destroy(); -// }); + select.$set({isFocused: true}); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + await wait(0); + select.$set(({ filterText: 's'})) + await wait(600); + div.click(); + div.remove(); -// test('when isCreatable and item created then event "itemCreated" should dispatch', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isCreatable: true, -// isFocused: true, -// listOpen: true, -// isMulti: true -// } -// }); + select.$destroy(); +}); + +test('when isCreatable and item created then event "itemCreated" should dispatch', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + isCreatable: true, + isFocused: true, + listOpen: true, + isMulti: true + } + }); -// let eventDetail; -// select.$on('itemCreated', (event) => { -// eventDetail = event.detail; -// }); + let eventDetail; + select.$on('itemCreated', (event) => { + eventDetail = event.detail; + }); -// select.$set({ filterText: 'TestCreate' }); -// await wait(0); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); -// await wait(0); -// t.ok(eventDetail === 'TestCreate'); + select.$set({ filterText: 'TestCreate' }); + await wait(0); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + await wait(0); + t.ok(eventDetail === 'TestCreate'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// async function getCancelledRes() { -// Promise.resolve({cancelled: true}); -// } +async function getCancelledRes() { + Promise.resolve({cancelled: true}); +} -// test('when loadOptions response returns cancelled true then dont end loading state', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// loadOptions: getCancelledRes, -// } -// }); +test('when loadOptions response returns cancelled true then dont end loading state', async (t) => { + const select = new Select({ + target, + props: { + config, + loadOptions: getCancelledRes, + } + }); -// select.$set({filterText: 'Juniper'}); -// await wait(0); + select.$set({filterText: 'Juniper'}); + await wait(0); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when ClearItem replace clear icon', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// ClearIcon: TestClearIcon, -// value: {value: 'chips', label: 'Chips'} -// } -// }); +test('when ClearItem replace clear icon', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + ClearIcon: TestClearIcon, + value: {value: 'chips', label: 'Chips'} + } + }); -// t.ok(target.querySelector('.testClearIcon')); + t.ok(target.querySelector('.testClearIcon')); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('clicking outside the Select should close and blur it', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// } -// }); +test('clicking outside the Select should close and blur it', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + } + }); -// await querySelectorClick('.select-container'); -// t.ok(select.listOpen); -// await querySelectorClick('#extra'); -// t.ok(!select.listOpen); + await querySelectorClick('.select-container'); + t.ok(select.listOpen); + await querySelectorClick('#extra'); + t.ok(!select.listOpen); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('clicking on an external textarea should close and blur it', async (t) => { -// const textarea = document.createElement('textarea'); -// document.body.appendChild(textarea); -// const select = new Select({ -// target, -// props: { -// config, -// items, -// } -// }); +test('clicking on an external textarea should close and blur it', async (t) => { + const textarea = document.createElement('textarea'); + document.body.appendChild(textarea); + const select = new Select({ + target, + props: { + config, + items, + } + }); -// await querySelectorClick('.select-container'); -// t.ok(select.listOpen); -// await querySelectorClick('textarea'); -// t.ok(!select.listOpen); + await querySelectorClick('.select-container'); + t.ok(select.listOpen); + await querySelectorClick('textarea'); + t.ok(!select.listOpen); -// textarea.remove(); -// select.$destroy(); -// }); + textarea.remove(); + select.$destroy(); +}); -// test('when switching between isMulti true/false ensure Select continues working', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// listOpen: true, -// value: {value: 'chips', label: 'Chips'} -// } -// }); +test('when switching between isMulti true/false ensure Select continues working', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + listOpen: true, + value: {value: 'chips', label: 'Chips'} + } + }); -// select.isMulti = true; -// select.loadOptions = itemsPromise; + select.isMulti = true; + select.loadOptions = itemsPromise; -// t.ok(JSON.stringify(select.value) === JSON.stringify([{value: 'chips', label: 'Chips'}])); -// t.ok(Array.isArray(select.value)); + t.ok(JSON.stringify(select.value) === JSON.stringify([{value: 'chips', label: 'Chips'}])); + t.ok(Array.isArray(select.value)); -// select.isMulti = false; -// select.loadOptions = null; -// select.items = [...items]; + select.isMulti = false; + select.loadOptions = null; + select.items = [...items]; -// t.ok(!select.value); + t.ok(!select.value); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when isSearchable is false then input should be readonly', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isSearchable: false -// } -// }); +test('when isSearchable is false then input should be readonly', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + isSearchable: false + } + }); -// let elem = target.querySelector('.select-container input'); -// t.ok(elem.hasAttribute('readonly')); + let elem = target.querySelector('.select-container input'); + t.ok(elem.hasAttribute('readonly')); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when esc key pressed should close list', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// listOpen: true -// } -// }); +test('when esc key pressed should close list', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + listOpen: true + } + }); -// await wait(0); -// t.ok(select.listOpen === true); -// window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Escape'})); -// t.ok(select.listOpen === false); + await wait(0); + t.ok(select.listOpen === true); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Escape'})); + t.ok(select.listOpen === false); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when isMulti and placeholderAlwaysShow then always show placeholder text', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// value: [{value: 'chocolate', label: 'Chocolate'}, -// {value: 'pizza', label: 'Pizza'},], -// isMulti: true, -// placeholderAlwaysShow: true, -// placeholder: 'foo bar' -// } -// }); +test('when isMulti and placeholderAlwaysShow then always show placeholder text', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + items, + value: [{value: 'chocolate', label: 'Chocolate'}, + {value: 'pizza', label: 'Pizza'},], + isMulti: true, + placeholderAlwaysShow: true, + placeholder: 'foo bar' + } + }); -// await wait(0); -// let elem = target.querySelector('.select-container input[type="text"]'); -// t.ok(elem.placeholder === 'foo bar'); + await wait(0); + let elem = target.querySelector('.select-container input[type="text"]'); + t.ok(elem.placeholder === 'foo bar'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when loadOptions and value then items should show on promise resolve',async (t) => { -// const loadOptionsFn = async () => { -// return Promise.resolve([ -// {value: 'chocolate', label: 'Chocolate'}, -// {value: 'ice-cream', label: 'Ice-cream'}, -// {value: 'pizza', label: 'pizza'}, -// ]); -// } +test('when loadOptions and value then items should show on promise resolve',async (t) => { + const loadOptionsFn = async () => { + return Promise.resolve([ + {value: 'chocolate', label: 'Chocolate'}, + {value: 'ice-cream', label: 'Ice-cream'}, + {value: 'pizza', label: 'pizza'}, + ]); + } -// const select = new Select({ -// target, -// props: { -// config, -// value: { -// value: 'chocolate', label: 'Chocolate' -// }, -// listOpen: true, -// filterText: 'a', -// loadOptions: loadOptionsFn -// } -// }); + const select = new Select({ + target, + props: { + config, + value: { + value: 'chocolate', label: 'Chocolate' + }, + listOpen: true, + filterText: 'a', + loadOptions: loadOptionsFn + } + }); -// await wait(300); -// t.ok(select.getFilteredItems().length === 3); + await wait(300); + t.ok(select.getFilteredItems().length === 3); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('when loadOptions, isMulti and value then filterText should remain on promise resolve',async (t) => { -// const loadOptionsFn = async () => { -// return Promise.resolve([ -// {value: 'chocolate', label: 'Chocolate'}, -// {value: 'ice-cream', label: 'Ice-cream'}, -// {value: 'pizza', label: 'pizza'}, -// ]); -// } +test('when loadOptions, isMulti and value then filterText should remain on promise resolve',async (t) => { + const loadOptionsFn = async () => { + return Promise.resolve([ + {value: 'chocolate', label: 'Chocolate'}, + {value: 'ice-cream', label: 'Ice-cream'}, + {value: 'pizza', label: 'pizza'}, + ]); + } -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// value: { -// value: 'chocolate', label: 'Chocolate' -// }, -// listOpen: true, -// filterText: 'test', -// loadOptions: loadOptionsFn -// } -// }); + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + value: { + value: 'chocolate', label: 'Chocolate' + }, + listOpen: true, + filterText: 'test', + loadOptions: loadOptionsFn + } + }); -// await wait(300); -// t.ok(select.filterText === 'test'); + await wait(300); + t.ok(select.filterText === 'test'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When listOffset is set list position offset changes', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// listOffset: 0, -// listOpen: true -// }, -// }); +test('When listOffset is set list position offset changes', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + listOffset: 0, + listOpen: true + }, + }); -// let elem = target.querySelector('.list'); -// t.ok(elem.style.top === '42px'); + let elem = target.querySelector('.list'); + t.ok(elem.style.top === '42px'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When items are updated post onMount ensure filtering still works', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: null -// }, -// }); +test('When items are updated post onMount ensure filtering still works', async (t) => { + const select = new Select({ + target, + props: { + config, + items: null + }, + }); -// await wait(0); + await wait(0); -// select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item })); -// select.filterText = 'Two'; -// select.listOpen = true; + select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item })); + select.filterText = 'Two'; + select.listOpen = true; -// t.ok(select.getFilteredItems().length === 1); -// t.ok(select.getFilteredItems()[0].value === 'Two'); + t.ok(select.getFilteredItems().length === 1); + t.ok(select.getFilteredItems()[0].value === 'Two'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When grouped items are updated post onMount ensure filtering still works', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// groupBy: item => item.group -// }, -// }); +test('When grouped items are updated post onMount ensure filtering still works', async (t) => { + const select = new Select({ + target, + props: { + config, + groupBy: item => item.group + }, + }); -// await wait(0); + await wait(0); -// select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item, group: item.includes('T') ? '2nd Group' : '1st Group' })); -// select.filterText = 'Tw'; -// select.listOpen = true; + select.items = ['One', 'Two', 'Three'].map(item => ({ value: item, label: item, group: item.includes('T') ? '2nd Group' : '1st Group' })); + select.filterText = 'Tw'; + select.listOpen = true; -// t.ok(select.getFilteredItems().length === 2); -// t.ok(select.getFilteredItems()[0].label === '2nd Group'); -// t.ok(select.getFilteredItems()[1].label === 'Two'); + t.ok(select.getFilteredItems().length === 2); + t.ok(select.getFilteredItems()[0].label === '2nd Group'); + t.ok(select.getFilteredItems()[1].label === 'Two'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When groupBy and value selected ensure filtering still works', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: itemsWithGroup, -// groupBy: (item) => item.group, +test('When groupBy and value selected ensure filtering still works', async (t) => { + const select = new Select({ + target, + props: { + config, + items: itemsWithGroup, + groupBy: (item) => item.group, -// }, -// }); + }, + }); -// select.filterText = 'Cake'; -// document.querySelector('.list-item .item').click(); -// await wait(0); -// t.ok(select.getFilteredItems().length === 7); + select.filterText = 'Cake'; + document.querySelector('.list-item .item').click(); + await wait(0); + t.ok(select.getFilteredItems().length === 7); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When value selected and filterText then ensure selecting the active value still clears filterText', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// }, -// }); +test('When value selected and filterText then ensure selecting the active value still clears filterText', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + }, + }); -// select.filterText = 'Cake'; -// document.querySelector('.list-item .item').click(); -// await wait(0); -// select.listOpen = true; -// select.filterText = 'Cake'; -// document.querySelector('.list-item .item').click(); + select.filterText = 'Cake'; + document.querySelector('.list-item .item').click(); + await wait(0); + select.listOpen = true; + select.filterText = 'Cake'; + document.querySelector('.list-item .item').click(); -// t.ok(select.filterText.length === 0); + t.ok(select.filterText.length === 0); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When groupBy, optionIdentifier and labelIdentifier then ensure list displays correctly', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: itemsWithGroupIds, -// optionIdentifier: '_id', -// labelIdentifier: 'name', -// groupBy: (item) => item.groupie, -// listOpen: true, -// }, -// }); +test('When groupBy, optionIdentifier and labelIdentifier then ensure list displays correctly', async (t) => { + const select = new Select({ + target, + props: { + config, + items: itemsWithGroupIds, + optionIdentifier: '_id', + labelIdentifier: 'name', + groupBy: (item) => item.groupie, + listOpen: true, + }, + }); -// let titles = document.querySelectorAll('.list-group-title'); -// let items = document.querySelectorAll('.list-item .item'); -// t.equal(titles[0].innerHTML, 'Sweet'); -// t.equal(titles[1].innerHTML, 'Savory'); -// t.equal(items[0].innerHTML, 'Chocolate'); -// t.equal(items[4].innerHTML, 'Chips'); + let titles = document.querySelectorAll('.list-group-title'); + let items = document.querySelectorAll('.list-item .item'); + t.equal(titles[0].innerHTML, 'Sweet'); + t.equal(titles[1].innerHTML, 'Savory'); + t.equal(items[0].innerHTML, 'Chocolate'); + t.equal(items[4].innerHTML, 'Chips'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When groupBy, optionIdentifier, labelIdentifier and createGroupHeaderItem then ensure list displays correctly', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: itemsWithGroupIds, -// optionIdentifier: '_id', -// labelIdentifier: 'name', -// groupBy: (item) => item.groupie, -// listOpen: true, -// createGroupHeaderItem: (groupValue, item) => { -// return { -// name: `XXX ${groupValue} XXX ${item.name}` -// }; -// } -// }, -// }); +test('When groupBy, optionIdentifier, labelIdentifier and createGroupHeaderItem then ensure list displays correctly', async (t) => { + const select = new Select({ + target, + props: { + config, + items: itemsWithGroupIds, + optionIdentifier: '_id', + labelIdentifier: 'name', + groupBy: (item) => item.groupie, + listOpen: true, + createGroupHeaderItem: (groupValue, item) => { + return { + name: `XXX ${groupValue} XXX ${item.name}` + }; + } + }, + }); -// let titles = document.querySelectorAll('.list-group-title'); -// let items = document.querySelectorAll('.list-item .item'); -// t.equal(titles[0].innerHTML, 'XXX Sweet XXX Chocolate'); -// t.equal(titles[1].innerHTML, 'XXX Savory XXX Pizza'); -// t.equal(items[0].innerHTML, 'Chocolate'); -// t.equal(items[4].innerHTML, 'Chips'); + let titles = document.querySelectorAll('.list-group-title'); + let items = document.querySelectorAll('.list-item .item'); + t.equal(titles[0].innerHTML, 'XXX Sweet XXX Chocolate'); + t.equal(titles[1].innerHTML, 'XXX Savory XXX Pizza'); + t.equal(items[0].innerHTML, 'Chocolate'); + t.equal(items[4].innerHTML, 'Chips'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When isMulti on:select events should fire on each item removal (including the last item)', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items, -// isMulti: true, -// value: ['Cake', 'Chips'] -// }, -// }); +test('When isMulti on:select events should fire on each item removal (including the last item)', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + items, + isMulti: true, + value: ['Cake', 'Chips'] + }, + }); -// let events = []; + let events = []; -// select.$on('select', (e) => { -// events.push('event fired'); -// }); + select.$on('select', (e) => { + events.push('event fired'); + }); -// document.querySelector('.multiSelectItem_clear').click(); -// await wait(0); -// document.querySelector('.multiSelectItem_clear').click(); -// await wait(0); -// t.ok(events.length === 2); + document.querySelector('.multiSelectItem_clear').click(); + await wait(0); + document.querySelector('.multiSelectItem_clear').click(); + await wait(0); + t.ok(events.length === 2); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When loadOptions and isCreatable then create new item is active when promise resolves with no items', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// loadOptions: itemsPromiseEmpty, -// isCreatable: true, -// }, -// }); +test('When loadOptions and isCreatable then create new item is active when promise resolves with no items', async (t) => { + const select = new Select({ + target, + props: { + config, + loadOptions: itemsPromiseEmpty, + isCreatable: true, + }, + }); -// select.filterText = 'Cake'; -// await wait(400); -// let createText = document.querySelector('.list-item .item').innerHTML; -// t.equal(createText, 'Create "Cake"'); + select.filterText = 'Cake'; + await wait(400); + let createText = document.querySelector('.list-item .item').innerHTML; + t.equal(createText, 'Create "Cake"'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When loadOptions and isCreatable then create new item show at bottom of results when promise resolves', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// loadOptions: itemsPromise, -// isCreatable: true, -// }, -// }); +test('When loadOptions and isCreatable then create new item show at bottom of results when promise resolves', async (t) => { + const select = new Select({ + target, + props: { + config, + loadOptions: itemsPromise, + isCreatable: true, + }, + }); -// select.filterText = 'Cake'; -// await wait(400); -// let createText = document.querySelector('.list-item:last-child .item').innerHTML; -// t.equal(createText, 'Create "Cake"'); + select.filterText = 'Cake'; + await wait(400); + let createText = document.querySelector('.list-item:last-child .item').innerHTML; + t.equal(createText, 'Create "Cake"'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When inputAttributes.name supplied, add to hidden input', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// inputAttributes: { name: 'Foods' }, -// items: items, -// showChevron: true, -// }, -// }); +test('When inputAttributes.name supplied, add to hidden input', async (t) => { + const select = new Select({ + target, + props: { + config, + inputAttributes: { name: 'Foods' }, + items: items, + showChevron: true, + }, + }); -// let hidden = document.querySelector('input[type="hidden"]').name; -// t.equal(hidden, 'Foods'); + let hidden = document.querySelector('input[type="hidden"]').name; + t.equal(hidden, 'Foods'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When no value then hidden field should also have no value', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// inputAttributes: { name: 'Foods' }, -// items: items, +test('When no value then hidden field should also have no value', async (t) => { + const select = new Select({ + target, + props: { + config, + inputAttributes: { name: 'Foods' }, + items: items, -// }, -// }); + }, + }); -// let hidden = document.querySelector('input[type="hidden"]').value; -// t.ok(!hidden); + let hidden = document.querySelector('input[type="hidden"]').value; + t.ok(!hidden); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When value then hidden field should have value.label', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: items, -// value: {value: 'cake', label: 'Cake'}, -// }, -// }); +test('When value then hidden field should have value.label', async (t) => { + const select = new Select({ + target, + props: { + config, + items: items, + value: {value: 'cake', label: 'Cake'}, + }, + }); -// let hidden = document.querySelector('input[type="hidden"]').value; -// t.equal(hidden, 'Cake'); + let hidden = document.querySelector('input[type="hidden"]').value; + t.equal(hidden, 'Cake'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When isMulti and no value then hidden field should no value', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items: items, -// }, -// }); +test('When isMulti and no value then hidden field should no value', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items: items, + }, + }); -// let hidden = document.querySelector('input[type="hidden"]').value; -// t.ok(!hidden); + let hidden = document.querySelector('input[type="hidden"]').value; + t.ok(!hidden); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When isMulti and value then hidden fields should list value items', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items: items, -// value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},] -// }, -// }); +test('When isMulti and value then hidden fields should list value items', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items: items, + value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},] + }, + }); -// let hidden = document.querySelectorAll('input[type="hidden"]'); -// t.equal(hidden[0].value, 'Cake'); -// t.equal(hidden[1].value, 'Pizza'); + let hidden = document.querySelectorAll('input[type="hidden"]'); + t.equal(hidden[0].value, 'Cake'); + t.equal(hidden[1].value, 'Pizza'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When listOpen then aria-context describes highlighted item', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: items, -// listOpen: true -// }, -// }); +test('When listOpen then aria-context describes highlighted item', async (t) => { + const select = new Select({ + target, + props: { + config, + items: items, + listOpen: true + }, + }); -// let aria = document.querySelector('#aria-context'); -// t.ok(aria.innerHTML.includes('Chocolate')); -// await handleKeyboard('ArrowDown'); -// t.ok(aria.innerHTML.includes('Pizza')); + let aria = document.querySelector('#aria-context'); + t.ok(aria.innerHTML.includes('Chocolate')); + await handleKeyboard('ArrowDown'); + t.ok(aria.innerHTML.includes('Pizza')); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When listOpen and value then aria-selection describes value', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: items, -// value: {value: 'cake', label: 'Cake'}, -// isFocused: true -// }, -// }); +test('When listOpen and value then aria-selection describes value', async (t) => { + const select = new Select({ + target, + props: { + config, + items: items, + value: {value: 'cake', label: 'Cake'}, + isFocused: true + }, + }); -// let aria = document.querySelector('#aria-selection'); -// t.ok(aria.innerHTML.includes('Cake')); + let aria = document.querySelector('#aria-selection'); + t.ok(aria.innerHTML.includes('Cake')); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When listOpen, value and isMulti then aria-selection describes value', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// isMulti: true, -// items: items, -// value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},], -// isFocused: true -// }, -// }); +test('When listOpen, value and isMulti then aria-selection describes value', async (t) => { + const select = new Select({ + target, + props: { + config: {...config, Multi}, + isMulti: true, + items: items, + value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},], + isFocused: true + }, + }); -// let aria = document.querySelector('#aria-selection'); -// t.ok(aria.innerHTML.includes('Cake')); -// t.ok(aria.innerHTML.includes('Pizza')); + let aria = document.querySelector('#aria-selection'); + t.ok(aria.innerHTML.includes('Cake')); + t.ok(aria.innerHTML.includes('Pizza')); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When ariaValues and value supplied, then aria-selection uses default updated', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: items, -// value: {value: 'pizza', label: 'Pizza'}, -// isFocused: true, -// ariaValues: (val) => `Yummy ${val} in my tummy!` -// }, -// }); +test('When ariaValues and value supplied, then aria-selection uses default updated', async (t) => { + const select = new Select({ + target, + props: { + config, + items: items, + value: {value: 'pizza', label: 'Pizza'}, + isFocused: true, + ariaValues: (val) => `Yummy ${val} in my tummy!` + }, + }); -// let aria = document.querySelector('#aria-selection'); -// t.equal(aria.innerHTML, 'Yummy Pizza in my tummy!'); + let aria = document.querySelector('#aria-selection'); + t.equal(aria.innerHTML, 'Yummy Pizza in my tummy!'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When ariaListOpen, listOpen, then aria-context uses default updated', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: items, -// listOpen: true, -// ariaListOpen: (label, count) => `label: ${label}, count: ${count}` -// }, -// }); +test('When ariaListOpen, listOpen, then aria-context uses default updated', async (t) => { + const select = new Select({ + target, + props: { + config, + items: items, + listOpen: true, + ariaListOpen: (label, count) => `label: ${label}, count: ${count}` + }, + }); -// let aria = document.querySelector('#aria-context'); -// t.equal(aria.innerHTML, 'label: Chocolate, count: 5'); + let aria = document.querySelector('#aria-context'); + t.equal(aria.innerHTML, 'label: Chocolate, count: 5'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When ariaFocused, focused value supplied, then aria-context uses default updated', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// items: items, -// isFocused: true, -// ariaFocused: () => `nothing to see here.` -// }, -// }); +test('When ariaFocused, focused value supplied, then aria-context uses default updated', async (t) => { + const select = new Select({ + target, + props: { + config, + items: items, + isFocused: true, + ariaFocused: () => `nothing to see here.` + }, + }); -// let aria = document.querySelector('#aria-context'); -// t.equal(aria.innerHTML, 'nothing to see here.'); + let aria = document.querySelector('#aria-context'); + t.equal(aria.innerHTML, 'nothing to see here.'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('When id supplied then add to input', async (t) => { -// const select = new Select({ -// target, -// props: { -// config, -// id: 'foods', -// items: items, -// }, -// }); +test('When id supplied then add to input', async (t) => { + const select = new Select({ + target, + props: { + config, + id: 'foods', + items: items, + }, + }); -// let aria = document.querySelector('input[type="text"]'); -// t.equal(aria.id, 'foods'); + let aria = document.querySelector('input[type="text"]'); + t.equal(aria.id, 'foods'); -// select.$destroy(); -// }); + select.$destroy(); +}); -// test('allows the user to select an item by clicking with a focusable ancestor', async (t) => { -// const ancestor = document.createElement("div"); -// ancestor.setAttribute("tabindex", "-1"); -// target.appendChild(ancestor); +test('allows the user to select an item by clicking with a focusable ancestor', async (t) => { + const ancestor = document.createElement("div"); + ancestor.setAttribute("tabindex", "-1"); + target.appendChild(ancestor); -// const select = new Select({ -// target: ancestor, -// props: { -// config, -// items, -// }, -// }); + const select = new Select({ + target: ancestor, + props: { + config, + items, + }, + }); -// await querySelectorClick('.select-container'); -// await querySelectorClick('.list-item'); -// t.equal(select.value.label, 'Chocolate'); + await querySelectorClick('.select-container'); + await querySelectorClick('.list-item'); + t.equal(select.value.label, 'Chocolate'); -// select.$destroy(); -// }); + select.$destroy(); +}); diff --git a/test/utils/nameGen.js b/test/utils/nameGen.js new file mode 100644 index 00000000..afdf14f5 --- /dev/null +++ b/test/utils/nameGen.js @@ -0,0 +1,2284 @@ +// https://github.com/Rich-Harris/namey-mcnameface + +const animals = [ + 'aardvark', + 'aardwolf', + 'albatross', + 'alligator', + 'alpaca', + 'amphibian', + 'anaconda', + 'angelfish', + 'anglerfish', + 'ant', + 'anteater', + 'antelope', + 'antlion', + 'ape', + 'aphid', + 'armadillo', + 'asp', + 'baboon', + 'badger', + 'bandicoot', + 'barnacle', + 'barracuda', + 'basilisk', + 'bass', + 'bat', + 'bear', + 'beaver', + 'bedbug', + 'bee', + 'beetle', + 'bird', + 'bison', + 'blackbird', + 'boa', + 'boar', + 'bobcat', + 'bobolink', + 'bonobo', + 'booby', + 'bovid', + 'bug', + 'butterfly', + 'buzzard', + 'camel', + 'canid', + 'capybara', + 'cardinal', + 'caribou', + 'carp', + 'cat', + 'catshark', + 'caterpillar', + 'catfish', + 'cattle', + 'centipede', + 'cephalopod', + 'chameleon', + 'cheetah', + 'chickadee', + 'chicken', + 'chimpanzee', + 'chinchilla', + 'chipmunk', + 'clam', + 'clownfish', + 'cobra', + 'cockroach', + 'cod', + 'condor', + 'constrictor', + 'coral', + 'cougar', + 'cow', + 'coyote', + 'crab', + 'crane', + 'crawdad', + 'crayfish', + 'cricket', + 'crocodile', + 'crow', + 'cuckoo', + 'cicada', + 'damselfly', + 'deer', + 'dingo', + 'dinosaur', + 'dog', + 'dolphin', + 'donkey', + 'dormouse', + 'dove', + 'dragonfly', + 'dragon', + 'duck', + 'eagle', + 'earthworm', + 'earwig', + 'echidna', + 'eel', + 'egret', + 'elephant', + 'elk', + 'emu', + 'ermine', + 'falcon', + 'ferret', + 'finch', + 'firefly', + 'fish', + 'flamingo', + 'flea', + 'fly', + 'flyingfish', + 'fowl', + 'fox', + 'frog', + 'gamefowl', + 'galliform', + 'gazelle', + 'gecko', + 'gerbil', + 'gibbon', + 'giraffe', + 'goat', + 'goldfish', + 'goose', + 'gopher', + 'gorilla', + 'grasshopper', + 'grouse', + 'guan', + 'guanaco', + 'guineafowl', + 'gull', + 'guppy', + 'haddock', + 'halibut', + 'hamster', + 'hare', + 'harrier', + 'hawk', + 'hedgehog', + 'heron', + 'herring', + 'hippopotamus', + 'hookworm', + 'hornet', + 'horse', + 'hoverfly', + 'hummingbird', + 'hyena', + 'iguana', + 'impala', + 'jackal', + 'jaguar', + 'jay', + 'jellyfish', + 'junglefowl', + 'kangaroo', + 'kingfisher', + 'kite', + 'kiwi', + 'koala', + 'koi', + 'krill', + 'ladybug', + 'lamprey', + 'landfowl', + 'lark', + 'leech', + 'lemming', + 'lemur', + 'leopard', + 'leopon', + 'limpet', + 'lion', + 'lizard', + 'llama', + 'lobster', + 'locust', + 'loon', + 'louse', + 'lungfish', + 'lynx', + 'macaw', + 'mackerel', + 'magpie', + 'mammal', + 'manatee', + 'mandrill', + 'marlin', + 'marmoset', + 'marmot', + 'marsupial', + 'marten', + 'mastodon', + 'meadowlark', + 'meerkat', + 'mink', + 'minnow', + 'mite', + 'mockingbird', + 'mole', + 'mollusk', + 'mongoose', + 'monkey', + 'moose', + 'mosquito', + 'moth', + 'mouse', + 'mule', + 'muskox', + 'narwhal', + 'newt', + 'nightingale', + 'ocelot', + 'octopus', + 'opossum', + 'orangutan', + 'orca', + 'ostrich', + 'otter', + 'owl', + 'ox', + 'panda', + 'panther', + 'parakeet', + 'parrot', + 'parrotfish', + 'partridge', + 'peacock', + 'peafowl', + 'pelican', + 'penguin', + 'perch', + 'pheasant', + 'pig', + 'pigeon', + 'pike', + 'pinniped', + 'piranha', + 'planarian', + 'platypus', + 'pony', + 'porcupine', + 'porpoise', + 'possum', + 'prawn', + 'primate', + 'ptarmigan', + 'puffin', + 'puma', + 'python', + 'quail', + 'quelea', + 'quokka', + 'rabbit', + 'raccoon', + 'rat', + 'rattlesnake', + 'raven', + 'reindeer', + 'reptile', + 'rhinoceros', + 'roadrunner', + 'rodent', + 'rook', + 'rooster', + 'roundworm', + 'sailfish', + 'salamander', + 'salmon', + 'sawfish', + 'scallop', + 'scorpion', + 'seahorse', + 'shark', + 'sheep', + 'shrew', + 'shrimp', + 'silkworm', + 'silverfish', + 'skink', + 'skunk', + 'sloth', + 'slug', + 'smelt', + 'snail', + 'snake', + 'snipe', + 'sole', + 'sparrow', + 'spider', + 'spoonbill', + 'squid', + 'squirrel', + 'starfish', + 'stingray', + 'stoat', + 'stork', + 'sturgeon', + 'swallow', + 'swan', + 'swift', + 'swordfish', + 'swordtail', + 'tahr', + 'takin', + 'tapir', + 'tarantula', + 'tarsier', + 'termite', + 'tern', + 'thrush', + 'tick', + 'tiger', + 'tiglon', + 'toad', + 'tortoise', + 'toucan', + 'trout', + 'tuna', + 'turkey', + 'turtle', + 'urial', + 'vicuna', + 'viper', + 'vole', + 'vulture', + 'wallaby', + 'walrus', + 'wasp', + 'warbler', + 'weasel', + 'whale', + 'whippet', + 'whitefish', + 'wildcat', + 'wildebeest', + 'wildfowl', + 'wolf', + 'wolverine', + 'wombat', + 'woodpecker', + 'worm', + 'wren', + 'xerinae', + 'yak', + 'zebra', + 'alpaca', + 'cat', + 'cattle', + 'chicken', + 'dog', + 'donkey', + 'ferret', + 'gayal', + 'goldfish', + 'guppy', + 'horse', + 'koi', + 'llama', + 'sheep', + 'yak', +]; +var adjectives = [ + 'aback', + 'abaft', + 'abandoned', + 'abashed', + 'aberrant', + 'abhorrent', + 'abiding', + 'abject', + 'ablaze', + 'able', + 'abnormal', + 'aboard', + 'aboriginal', + 'abortive', + 'abounding', + 'abrasive', + 'abrupt', + 'absent', + 'absolute', + 'absorbed', + 'absorbing', + 'abstracted', + 'absurd', + 'abundant', + 'abusive', + 'academic', + 'acceptable', + 'accessible', + 'accidental', + 'acclaimed', + 'accomplished', + 'accurate', + 'aching', + 'acid', + 'acidic', + 'acoustic', + 'acrid', + 'acrobatic', + 'active', + 'actual', + 'actually', + 'ad hoc', + 'adamant', + 'adaptable', + 'addicted', + 'adept', + 'adhesive', + 'adjoining', + 'admirable', + 'admired', + 'adolescent', + 'adorable', + 'adored', + 'advanced', + 'adventurous', + 'affectionate', + 'afraid', + 'aged', + 'aggravating', + 'aggressive', + 'agile', + 'agitated', + 'agonizing', + 'agreeable', + 'ahead', + 'ajar', + 'alarmed', + 'alarming', + 'alcoholic', + 'alert', + 'alienated', + 'alike', + 'alive', + 'all', + 'alleged', + 'alluring', + 'aloof', + 'altruistic', + 'amazing', + 'ambiguous', + 'ambitious', + 'amiable', + 'ample', + 'amuck', + 'amused', + 'amusing', + 'anchored', + 'ancient', + 'ancient', + 'angelic', + 'angry', + 'angry', + 'anguished', + 'animated', + 'annoyed', + 'annoying', + 'annual', + 'another', + 'antique', + 'antsy', + 'anxious', + 'any', + 'apathetic', + 'appetizing', + 'apprehensive', + 'appropriate', + 'apt', + 'aquatic', + 'arctic', + 'arid', + 'aromatic', + 'arrogant', + 'artistic', + 'ashamed', + 'aspiring', + 'assorted', + 'assured', + 'astonishing', + 'athletic', + 'attached', + 'attentive', + 'attractive', + 'auspicious', + 'austere', + 'authentic', + 'authorized', + 'automatic', + 'available', + 'avaricious', + 'average', + 'awake', + 'aware', + 'awesome', + 'awful', + 'awkward', + 'axiomatic', + 'babyish', + 'back', + 'bad', + 'baggy', + 'barbarous', + 'bare', + 'barren', + 'bashful', + 'basic', + 'batty', + 'bawdy', + 'beautiful', + 'beefy', + 'befitting', + 'belated', + 'belligerent', + 'beloved', + 'beneficial', + 'bent', + 'berserk', + 'best', + 'better', + 'bewildered', + 'bewitched', + 'big', + 'big-hearted', + 'billowy', + 'biodegradable', + 'bite-sized', + 'biting', + 'bitter', + 'bizarre', + 'black', + 'black-and-white', + 'bland', + 'blank', + 'blaring', + 'bleak', + 'blind', + 'blissful', + 'blond', + 'bloody', + 'blue', + 'blue-eyed', + 'blushing', + 'bogus', + 'boiling', + 'bold', + 'bony', + 'boorish', + 'bored', + 'boring', + 'bossy', + 'both', + 'bouncy', + 'boundless', + 'bountiful', + 'bowed', + 'brainy', + 'brash', + 'brave', + 'brawny', + 'breakable', + 'breezy', + 'brief', + 'bright', + 'brilliant', + 'brisk', + 'broad', + 'broken', + 'bronze', + 'brown', + 'bruised', + 'bubbly', + 'bulky', + 'bumpy', + 'buoyant', + 'burdensome', + 'burly', + 'bustling', + 'busy', + 'buttery', + 'buzzing', + 'cagey', + 'calculating', + 'callous', + 'calm', + 'candid', + 'canine', + 'capable', + 'capital', + 'capricious', + 'carefree', + 'careful', + 'careless', + 'caring', + 'cautious', + 'cavernous', + 'ceaseless', + 'celebrated', + 'certain', + 'changeable', + 'charming', + 'cheap', + 'cheeky', + 'cheerful', + 'cheery', + 'chemical', + 'chief', + 'childlike', + 'chilly', + 'chivalrous', + 'chubby', + 'chunky', + 'circular', + 'clammy', + 'classic', + 'classy', + 'clean', + 'clear', + 'clear-cut', + 'clever', + 'cloistered', + 'close', + 'closed', + 'cloudy', + 'clueless', + 'clumsy', + 'cluttered', + 'coarse', + 'coherent', + 'cold', + 'colorful', + 'colorless', + 'colossal', + 'colossal', + 'combative', + 'comfortable', + 'common', + 'compassionate', + 'competent', + 'complete', + 'complex', + 'complicated', + 'composed', + 'concerned', + 'concrete', + 'condemned', + 'condescending', + 'confused', + 'conscious', + 'considerate', + 'constant', + 'contemplative', + 'content', + 'conventional', + 'convincing', + 'convoluted', + 'cooing', + 'cooked', + 'cool', + 'cooperative', + 'coordinated', + 'corny', + 'corrupt', + 'costly', + 'courageous', + 'courteous', + 'cowardly', + 'crabby', + 'crafty', + 'craven', + 'crazy', + 'creamy', + 'creative', + 'creepy', + 'criminal', + 'crisp', + 'critical', + 'crooked', + 'crowded', + 'cruel', + 'crushing', + 'cuddly', + 'cultivated', + 'cultured', + 'cumbersome', + 'curious', + 'curly', + 'curved', + 'curvy', + 'cut', + 'cute', + 'cylindrical', + 'cynical', + 'daffy', + 'daily', + 'damaged', + 'damaging', + 'damp', + 'dangerous', + 'dapper', + 'dapper', + 'daring', + 'dark', + 'darling', + 'dashing', + 'dazzling', + 'dead', + 'deadly', + 'deadpan', + 'deafening', + 'dear', + 'dearest', + 'debonair', + 'decayed', + 'deceitful', + 'decent', + 'decimal', + 'decisive', + 'decorous', + 'deep', + 'deeply', + 'defeated', + 'defective', + 'defenseless', + 'defensive', + 'defiant', + 'deficient', + 'definite', + 'delayed', + 'delectable', + 'delicate', + 'delicious', + 'delightful', + 'delirious', + 'demanding', + 'demonic', + 'dense', + 'dental', + 'dependable', + 'dependent', + 'depraved', + 'depressed', + 'deranged', + 'descriptive', + 'deserted', + 'despicable', + 'detailed', + 'determined', + 'devilish', + 'devoted', + 'didactic', + 'different', + 'difficult', + 'digital', + 'dilapidated', + 'diligent', + 'dim', + 'diminutive', + 'dimpled', + 'dimwitted', + 'direct', + 'direful', + 'dirty', + 'disagreeable', + 'disastrous', + 'discreet', + 'discrete', + 'disfigured', + 'disguised', + 'disgusted', + 'disgusting', + 'dishonest', + 'disillusioned', + 'disloyal', + 'dismal', + 'dispensable', + 'distant', + 'distinct', + 'distorted', + 'distraught', + 'distressed', + 'disturbed', + 'divergent', + 'dizzy', + 'domineering', + 'dopey', + 'doting', + 'double', + 'doubtful', + 'downright', + 'drab', + 'draconian', + 'drafty', + 'drained', + 'dramatic', + 'dreary', + 'droopy', + 'drunk', + 'dry', + 'dual', + 'dull', + 'dull', + 'dusty', + 'dutiful', + 'dynamic', + 'dysfunctional', + 'each', + 'eager', + 'early', + 'earnest', + 'earsplitting', + 'earthy', + 'easy', + 'easy-going', + 'eatable', + 'economic', + 'ecstatic', + 'edible', + 'educated', + 'efficacious', + 'efficient', + 'eight', + 'elaborate', + 'elastic', + 'elated', + 'elderly', + 'electric', + 'elegant', + 'elementary', + 'elfin', + 'elite', + 'elliptical', + 'emaciated', + 'embarrassed', + 'embellished', + 'eminent', + 'emotional', + 'empty', + 'enchanted', + 'enchanting', + 'encouraging', + 'endurable', + 'energetic', + 'enlightened', + 'enormous', + 'enraged', + 'entertaining', + 'enthusiastic', + 'entire', + 'envious', + 'envious', + 'equable', + 'equal', + 'equatorial', + 'erect', + 'erratic', + 'essential', + 'esteemed', + 'ethereal', + 'ethical', + 'euphoric', + 'evanescent', + 'evasive', + 'even', + 'evergreen', + 'everlasting', + 'every', + 'evil', + 'exalted', + 'exasperated', + 'excellent', + 'excitable', + 'excited', + 'exciting', + 'exclusive', + 'exemplary', + 'exhausted', + 'exhilarated', + 'exotic', + 'expensive', + 'experienced', + 'expert', + 'extensive', + 'extra-large', + 'extraneous', + 'extra-small', + 'extroverted', + 'exuberant', + 'exultant', + 'fabulous', + 'faded', + 'failing', + 'faint', + 'fair', + 'faithful', + 'fake', + 'fallacious', + 'false', + 'familiar', + 'famous', + 'fanatical', + 'fancy', + 'fantastic', + 'far', + 'faraway', + 'far-flung', + 'far-off', + 'fascinated', + 'fast', + 'fat', + 'fatal', + 'fatherly', + 'faulty', + 'favorable', + 'favorite', + 'fearful', + 'fearless', + 'feeble', + 'feigned', + 'feisty', + 'feline', + 'female', + 'feminine', + 'fertile', + 'festive', + 'few', + 'fickle', + 'fierce', + 'filthy', + 'fine', + 'finicky', + 'finished', + 'firm', + 'first', + 'firsthand', + 'fitting', + 'five', + 'fixed', + 'flagrant', + 'flaky', + 'flamboyant', + 'flashy', + 'flat', + 'flawed', + 'flawless', + 'flickering', + 'flimsy', + 'flippant', + 'floppy', + 'flowery', + 'flufy', + 'fluid', + 'flustered', + 'fluttering', + 'foamy', + 'focused', + 'fond', + 'foolhardy', + 'foolish', + 'forceful', + 'foregoing', + 'forgetful', + 'forked', + 'formal', + 'forsaken', + 'forthright', + 'fortunate', + 'four', + 'fragile', + 'fragrant', + 'frail', + 'frank', + 'frantic', + 'frayed', + 'free', + 'freezing', + 'french', + 'frequent', + 'fresh', + 'fretful', + 'friendly', + 'frightened', + 'frightening', + 'frigid', + 'frilly', + 'frivolous', + 'frizzy', + 'front', + 'frosty', + 'frothy', + 'frozen', + 'frugal', + 'fruitful', + 'frustrating', + 'full', + 'fumbling', + 'fumbling', + 'functional', + 'funny', + 'furry', + 'furtive', + 'fussy', + 'future', + 'futuristic', + 'fuzzy', + 'gabby', + 'gainful', + 'gamy', + 'gaping', + 'gargantuan', + 'garrulous', + 'gaseous', + 'gaudy', + 'general', + 'general', + 'generous', + 'gentle', + 'genuine', + 'ghastly', + 'giant', + 'giddy', + 'gifted', + 'gigantic', + 'giving', + 'glamorous', + 'glaring', + 'glass', + 'gleaming', + 'gleeful', + 'glib', + 'glistening', + 'glittering', + 'gloomy', + 'glorious', + 'glossy', + 'glum', + 'godly', + 'golden', + 'good', + 'good-natured', + 'goofy', + 'gorgeous', + 'graceful', + 'gracious', + 'grand', + 'grandiose', + 'grandiose', + 'granular', + 'grateful', + 'gratis', + 'grave', + 'gray', + 'greasy', + 'great', + 'greedy', + 'green', + 'gregarious', + 'grey', + 'grieving', + 'grim', + 'grimy', + 'gripping', + 'grizzled', + 'groovy', + 'gross', + 'grotesque', + 'grouchy', + 'grounded', + 'growing', + 'growling', + 'grown', + 'grubby', + 'gruesome', + 'grumpy', + 'guarded', + 'guiltless', + 'guilty', + 'gullible', + 'gummy', + 'gusty', + 'guttural', + 'habitual', + 'hairy', + 'half', + 'half', + 'hallowed', + 'halting', + 'handmade', + 'handsome', + 'handsomely', + 'handy', + 'hanging', + 'hapless', + 'happy', + 'happy-go-lucky', + 'hard', + 'hard-to-find', + 'harebrained', + 'harmful', + 'harmless', + 'harmonious', + 'harsh', + 'hasty', + 'hateful', + 'haunting', + 'heady', + 'healthy', + 'heartbreaking', + 'heartfelt', + 'hearty', + 'heavenly', + 'heavy', + 'hefty', + 'hellish', + 'helpful', + 'helpless', + 'hesitant', + 'hidden', + 'hideous', + 'high', + 'highfalutin', + 'high-level', + 'high-pitched', + 'hilarious', + 'hissing', + 'historical', + 'hoarse', + 'holistic', + 'hollow', + 'homeless', + 'homely', + 'honest', + 'honorable', + 'honored', + 'hopeful', + 'horrible', + 'horrific', + 'hospitable', + 'hot', + 'huge', + 'hulking', + 'humble', + 'humdrum', + 'humiliating', + 'humming', + 'humongous', + 'humorous', + 'hungry', + 'hurried', + 'hurt', + 'hurtful', + 'hushed', + 'husky', + 'hypnotic', + 'hysterical', + 'icky', + 'icy', + 'ideal', + 'ideal', + 'idealistic', + 'identical', + 'idiotic', + 'idle', + 'idolized', + 'ignorant', + 'ill', + 'illegal', + 'ill-fated', + 'ill-informed', + 'illiterate', + 'illustrious', + 'imaginary', + 'imaginative', + 'immaculate', + 'immaterial', + 'immediate', + 'immense', + 'imminent', + 'impartial', + 'impassioned', + 'impeccable', + 'imperfect', + 'imperturbable', + 'impish', + 'impolite', + 'important', + 'imported', + 'impossible', + 'impractical', + 'impressionable', + 'impressive', + 'improbable', + 'impure', + 'inborn', + 'incandescent', + 'incomparable', + 'incompatible', + 'incompetent', + 'incomplete', + 'inconclusive', + 'inconsequential', + 'incredible', + 'indelible', + 'indolent', + 'industrious', + 'inexpensive', + 'inexperienced', + 'infamous', + 'infantile', + 'infatuated', + 'inferior', + 'infinite', + 'informal', + 'innate', + 'innocent', + 'inquisitive', + 'insecure', + 'insidious', + 'insignificant', + 'insistent', + 'instinctive', + 'instructive', + 'insubstantial', + 'intelligent', + 'intent', + 'intentional', + 'interesting', + 'internal', + 'international', + 'intrepid', + 'intrigued', + 'invincible', + 'irate', + 'ironclad', + 'irresponsible', + 'irritable', + 'irritating', + 'itchy', + 'jaded', + 'jagged', + 'jam-packed', + 'jaunty', + 'jazzy', + 'jealous', + 'jittery', + 'jobless', + 'joint', + 'jolly', + 'jovial', + 'joyful', + 'joyous', + 'jubilant', + 'judicious', + 'juicy', + 'jumbled', + 'jumbo', + 'jumpy', + 'jumpy', + 'junior', + 'juvenile', + 'kaleidoscopic', + 'kaput', + 'keen', + 'key', + 'kind', + 'kindhearted', + 'kindly', + 'klutzy', + 'knobby', + 'knotty', + 'knowing', + 'knowledgeable', + 'known', + 'kooky', + 'kosher', + 'labored', + 'lackadaisical', + 'lacking', + 'lame', + 'lame', + 'lamentable', + 'languid', + 'lanky', + 'large', + 'last', + 'lasting', + 'late', + 'laughable', + 'lavish', + 'lawful', + 'lazy', + 'leading', + 'leafy', + 'lean', + 'learned', + 'left', + 'legal', + 'legitimate', + 'lethal', + 'level', + 'lewd', + 'light', + 'lighthearted', + 'likable', + 'like', + 'likeable', + 'likely', + 'limited', + 'limp', + 'limping', + 'linear', + 'lined', + 'liquid', + 'literate', + 'little', + 'live', + 'lively', + 'livid', + 'living', + 'loathsome', + 'lone', + 'lonely', + 'long', + 'longing', + 'long-term', + 'loose', + 'lopsided', + 'lost', + 'loud', + 'loutish', + 'lovable', + 'lovely', + 'loving', + 'low', + 'lowly', + 'loyal', + 'lucky', + 'ludicrous', + 'lumbering', + 'luminous', + 'lumpy', + 'lush', + 'lustrous', + 'luxuriant', + 'luxurious', + 'lying', + 'lyrical', + 'macabre', + 'macho', + 'mad', + 'maddening', + 'made-up', + 'madly', + 'magenta', + 'magical', + 'magnificent', + 'majestic', + 'major', + 'makeshift', + 'male', + 'malicious', + 'mammoth', + 'maniacal', + 'many', + 'marked', + 'married', + 'marvelous', + 'masculine', + 'massive', + 'material', + 'materialistic', + 'mature', + 'meager', + 'mealy', + 'mean', + 'measly', + 'meaty', + 'medical', + 'mediocre', + 'medium', + 'meek', + 'melancholy', + 'mellow', + 'melodic', + 'melted', + 'memorable', + 'menacing', + 'merciful', + 'mere', + 'merry', + 'messy', + 'metallic', + 'mighty', + 'mild', + 'military', + 'milky', + 'mindless', + 'miniature', + 'minor', + 'minty', + 'minute', + 'miscreant', + 'miserable', + 'miserly', + 'misguided', + 'mistaken', + 'misty', + 'mixed', + 'moaning', + 'modern', + 'modest', + 'moist', + 'moldy', + 'momentous', + 'monstrous', + 'monthly', + 'monumental', + 'moody', + 'moral', + 'mortified', + 'motherly', + 'motionless', + 'mountainous', + 'muddled', + 'muddy', + 'muffled', + 'multicolored', + 'mundane', + 'mundane', + 'murky', + 'mushy', + 'musty', + 'mute', + 'muted', + 'mysterious', + 'naive', + 'nappy', + 'narrow', + 'nasty', + 'natural', + 'naughty', + 'nauseating', + 'nautical', + 'near', + 'neat', + 'nebulous', + 'necessary', + 'needless', + 'needy', + 'negative', + 'neglected', + 'negligible', + 'neighboring', + 'neighborly', + 'nervous', + 'nervous', + 'new', + 'next', + 'nice', + 'nice', + 'nifty', + 'nimble', + 'nine', + 'nippy', + 'nocturnal', + 'noiseless', + 'noisy', + 'nonchalant', + 'nondescript', + 'nonsensical', + 'nonstop', + 'normal', + 'nostalgic', + 'nosy', + 'notable', + 'noted', + 'noteworthy', + 'novel', + 'noxious', + 'null', + 'numb', + 'numberless', + 'numerous', + 'nutritious', + 'nutty', + 'oafish', + 'obedient', + 'obeisant', + 'obese', + 'oblivious', + 'oblong', + 'obnoxious', + 'obscene', + 'obsequious', + 'observant', + 'obsolete', + 'obtainable', + 'obvious', + 'occasional', + 'oceanic', + 'odd', + 'oddball', + 'offbeat', + 'offensive', + 'official', + 'oily', + 'old', + 'old-fashioned', + 'omniscient', + 'one', + 'onerous', + 'only', + 'open', + 'opposite', + 'optimal', + 'optimistic', + 'opulent', + 'orange', + 'orderly', + 'ordinary', + 'organic', + 'original', + 'ornate', + 'ornery', + 'ossified', + 'other', + 'our', + 'outgoing', + 'outlandish', + 'outlying', + 'outrageous', + 'outstanding', + 'oval', + 'overconfident', + 'overcooked', + 'overdue', + 'overjoyed', + 'overlooked', + 'overrated', + 'overt', + 'overwrought', + 'painful', + 'painstaking', + 'palatable', + 'pale', + 'paltry', + 'panicky', + 'panoramic', + 'parallel', + 'parched', + 'parsimonious', + 'partial', + 'passionate', + 'past', + 'pastel', + 'pastoral', + 'pathetic', + 'peaceful', + 'penitent', + 'peppery', + 'perfect', + 'perfumed', + 'periodic', + 'perky', + 'permissible', + 'perpetual', + 'perplexed', + 'personal', + 'pertinent', + 'pesky', + 'pessimistic', + 'petite', + 'petty', + 'petty', + 'phobic', + 'phony', + 'physical', + 'picayune', + 'piercing', + 'pink', + 'piquant', + 'pitiful', + 'placid', + 'plain', + 'plaintive', + 'plant', + 'plastic', + 'plausible', + 'playful', + 'pleasant', + 'pleased', + 'pleasing', + 'plucky', + 'plump', + 'plush', + 'pointed', + 'pointless', + 'poised', + 'polished', + 'polite', + 'political', + 'pompous', + 'poor', + 'popular', + 'portly', + 'posh', + 'positive', + 'possessive', + 'possible', + 'potable', + 'powerful', + 'powerless', + 'practical', + 'precious', + 'premium', + 'present', + 'present', + 'prestigious', + 'pretty', + 'previous', + 'pricey', + 'prickly', + 'primary', + 'prime', + 'pristine', + 'private', + 'prize', + 'probable', + 'productive', + 'profitable', + 'profuse', + 'proper', + 'protective', + 'proud', + 'prudent', + 'psychedelic', + 'psychotic', + 'public', + 'puffy', + 'pumped', + 'punctual', + 'pungent', + 'puny', + 'pure', + 'purple', + 'purring', + 'pushy', + 'pushy', + 'putrid', + 'puzzled', + 'puzzling', + 'quack', + 'quaint', + 'quaint', + 'qualified', + 'quarrelsome', + 'quarterly', + 'queasy', + 'querulous', + 'questionable', + 'quick', + 'quickest', + 'quick-witted', + 'quiet', + 'quintessential', + 'quirky', + 'quixotic', + 'quixotic', + 'quizzical', + 'rabid', + 'racial', + 'radiant', + 'ragged', + 'rainy', + 'rambunctious', + 'rampant', + 'rapid', + 'rare', + 'rash', + 'raspy', + 'ratty', + 'raw', + 'ready', + 'real', + 'realistic', + 'reasonable', + 'rebel', + 'recent', + 'receptive', + 'reckless', + 'recondite', + 'rectangular', + 'red', + 'redundant', + 'reflecting', + 'reflective', + 'regal', + 'regular', + 'reliable', + 'relieved', + 'remarkable', + 'reminiscent', + 'remorseful', + 'remote', + 'repentant', + 'repulsive', + 'required', + 'resolute', + 'resonant', + 'respectful', + 'responsible', + 'responsive', + 'revolving', + 'rewarding', + 'rhetorical', + 'rich', + 'right', + 'righteous', + 'rightful', + 'rigid', + 'ringed', + 'ripe', + 'ritzy', + 'roasted', + 'robust', + 'romantic', + 'roomy', + 'rosy', + 'rotating', + 'rotten', + 'rotund', + 'rough', + 'round', + 'rowdy', + 'royal', + 'rubbery', + 'ruddy', + 'rude', + 'rundown', + 'runny', + 'rural', + 'rustic rusty', + 'ruthless', + 'sable', + 'sad', + 'safe', + 'salty', + 'same', + 'sandy', + 'sane', + 'sarcastic', + 'sardonic', + 'sassy', + 'satisfied', + 'satisfying', + 'savory', + 'scaly', + 'scandalous', + 'scant', + 'scarce', + 'scared', + 'scary', + 'scattered', + 'scented', + 'scholarly', + 'scientific', + 'scintillating', + 'scornful', + 'scratchy', + 'scrawny', + 'screeching', + 'second', + 'secondary', + 'second-hand', + 'secret', + 'secretive', + 'sedate', + 'seemly', + 'selective', + 'self-assured', + 'selfish', + 'self-reliant', + 'sentimental', + 'separate', + 'serene', + 'serious', + 'serpentine', + 'several', + 'severe', + 'shabby', + 'shadowy', + 'shady', + 'shaggy', + 'shaky', + 'shallow', + 'shameful', + 'shameless', + 'sharp', + 'shimmering', + 'shiny', + 'shivering', + 'shocked', + 'shocking', + 'shoddy', + 'short', + 'short-term', + 'showy', + 'shrill', + 'shut', + 'shy', + 'sick', + 'silent', + 'silky', + 'silly', + 'silver', + 'similar', + 'simple', + 'simplistic', + 'sincere', + 'sinful', + 'single', + 'six', + 'sizzling', + 'skeletal', + 'skillful', + 'skinny', + 'sleepy', + 'slight', + 'slim', + 'slimy', + 'slippery', + 'sloppy', + 'slow', + 'slushy', + 'small', + 'smarmy', + 'smart', + 'smelly', + 'smiling', + 'smoggy', + 'smooth', + 'smug', + 'snappy', + 'snarling', + 'sneaky', + 'sniveling', + 'snobbish', + 'snoopy', + 'snotty', + 'sociable', + 'soft', + 'soggy', + 'solid', + 'somber', + 'some', + 'sophisticated', + 'sordid', + 'sore', + 'sorrowful', + 'soulful', + 'soupy', + 'sour', + 'sour', + 'spanish', + 'sparkling', + 'sparse', + 'special', + 'specific', + 'spectacular', + 'speedy', + 'spherical', + 'spicy', + 'spiffy', + 'spiky', + 'spirited', + 'spiritual', + 'spiteful', + 'splendid', + 'spooky', + 'spotless', + 'spotted', + 'spotty', + 'spry', + 'spurious', + 'squalid', + 'square', + 'squeaky', + 'squealing', + 'squeamish', + 'squiggly', + 'stable', + 'staid', + 'stained', + 'staking', + 'stale', + 'standard', + 'standing', + 'starchy', + 'stark', + 'starry', + 'statuesque', + 'steadfast', + 'steady', + 'steel', + 'steep', + 'stereotyped', + 'sticky', + 'stiff', + 'stimulating', + 'stingy', + 'stormy', + 'stout', + 'straight', + 'strange', + 'strict', + 'strident', + 'striking', + 'striped', + 'strong', + 'studious', + 'stunning', + 'stunning', + 'stupendous', + 'stupid', + 'sturdy', + 'stylish', + 'subdued', + 'submissive', + 'subsequent', + 'substantial', + 'subtle', + 'suburban', + 'successful', + 'succinct', + 'succulent', + 'sudden', + 'sugary', + 'sulky', + 'sunny', + 'super', + 'superb', + 'superficial', + 'superior', + 'supportive', + 'supreme', + 'sure-footed', + 'surprised', + 'suspicious', + 'svelte', + 'swanky', + 'sweaty', + 'sweet', + 'sweltering', + 'swift', + 'sympathetic', + 'symptomatic', + 'synonymous', + 'taboo', + 'tacit', + 'tacky', + 'talented', + 'talkative', + 'tall', + 'tame', + 'tan', + 'tangible', + 'tangy', + 'tart', + 'tasteful', + 'tasteless', + 'tasty', + 'tattered', + 'taut', + 'tawdry', + 'tearful', + 'tedious', + 'teeming', + 'teeny', + 'teeny-tiny', + 'telling', + 'temporary', + 'tempting', + 'ten', + 'tender', + 'tense', + 'tenuous', + 'tepid', + 'terrible', + 'terrific', + 'tested', + 'testy', + 'thankful', + 'that', + 'therapeutic', + 'these', + 'thick', + 'thin', + 'thinkable', + 'third', + 'thirsty', + 'this', + 'thorny', + 'thorough', + 'those', + 'thoughtful', + 'thoughtless', + 'threadbare', + 'threatening', + 'three', + 'thrifty', + 'thundering', + 'thunderous', + 'tidy', + 'tight', + 'tightfisted', + 'timely', + 'tinted', + 'tiny', + 'tired', + 'tiresome', + 'toothsome', + 'torn', + 'torpid', + 'total', + 'tough', + 'towering', + 'tragic', + 'trained', + 'tranquil', + 'trashy', + 'traumatic', + 'treasured', + 'tremendous', + 'triangular', + 'tricky', + 'trifling', + 'trim', + 'trite', + 'trivial', + 'troubled', + 'truculent', + 'true', + 'trusting', + 'trustworthy', + 'trusty', + 'truthful', + 'tubby', + 'turbulent', + 'twin', + 'two', + 'typical', + 'ubiquitous', + 'ugliest', + 'ugly', + 'ultimate', + 'ultra', + 'unable', + 'unaccountable', + 'unarmed', + 'unaware', + 'unbecoming', + 'unbiased', + 'uncomfortable', + 'uncommon', + 'unconscious', + 'uncovered', + 'understated', + 'understood', + 'undesirable', + 'unequal', + 'unequaled', + 'uneven', + 'unfinished', + 'unfit', + 'unfolded', + 'unfortunate', + 'unhappy', + 'unhealthy', + 'uniform', + 'unimportant', + 'uninterested', + 'unique', + 'united', + 'unkempt', + 'unknown', + 'unlawful', + 'unlined', + 'unlucky', + 'unnatural', + 'unpleasant', + 'unrealistic', + 'unripe', + 'unruly', + 'unselfish', + 'unsightly', + 'unsteady', + 'unsuitable', + 'unsung', + 'untidy', + 'untimely', + 'untried', + 'untrue', + 'unused', + 'unusual', + 'unwelcome', + 'unwieldy', + 'unwitting', + 'unwritten', + 'upbeat', + 'uppity', + 'upright', + 'upset', + 'uptight', + 'urban', + 'usable', + 'used', + 'used', + 'useful', + 'useless', + 'utilized', + 'utopian', + 'utter', + 'uttermost', + 'vacant', + 'vacuous', + 'vagabond', + 'vague', + 'vain', + 'valid', + 'valuable', + 'vapid', + 'variable', + 'various', + 'vast', + 'velvety', + 'venerated', + 'vengeful', + 'venomous', + 'verdant', + 'verifiable', + 'versed', + 'vexed', + 'vibrant', + 'vicious', + 'victorious', + 'vigilant', + 'vigorous', + 'villainous', + 'violent', + 'violet', + 'virtual', + 'virtuous', + 'visible', + 'vital', + 'vivacious', + 'vivid', + 'voiceless', + 'volatile', + 'voluminous', + 'voracious', + 'vulgar', + 'wacky', + 'waggish', + 'waiting', + 'wakeful', + 'wan', + 'wandering', + 'wanting', + 'warlike', + 'warm', + 'warmhearted', + 'warped', + 'wary', + 'wasteful', + 'watchful', + 'waterlogged', + 'watery', + 'wavy', + 'weak', + 'wealthy', + 'weary', + 'webbed', + 'wee', + 'weekly', + 'weepy', + 'weighty', + 'weird', + 'welcome', + 'well-documented', + 'well-groomed', + 'well-informed', + 'well-lit', + 'well-made', + 'well-off', + 'well-to-do', + 'well-worn', + 'wet', + 'which', + 'whimsical', + 'whirlwind', + 'whispered', + 'whispering', + 'white', + 'whole', + 'wholesale', + 'whopping', + 'wicked', + 'wide', + 'wide-eyed', + 'wiggly', + 'wild', + 'willing', + 'wilted', + 'winding', + 'windy', + 'winged', + 'wiry', + 'wise', + 'wistful', + 'witty', + 'wobbly', + 'woebegone', + 'woeful', + 'womanly', + 'wonderful', + 'wooden', + 'woozy', + 'wordy', + 'workable', + 'worldly', + 'worn', + 'worried', + 'worrisome', + 'worse', + 'worst', + 'worthless', + 'worthwhile', + 'worthy', + 'wrathful', + 'wretched', + 'writhing', + 'wrong', + 'wry', + 'xenophobic', + 'yawning', + 'yearly', + 'yellow', + 'yellowish', + 'yielding', + 'young', + 'youthful', + 'yummy', + 'zany', + 'zealous', + 'zesty', + 'zigzag', + 'zippy', + 'zonked', +]; + +function pickRandom(array) { + return array[~~(Math.random() * array.length)]; +} + +function nameyMcNameface(mcMode) { + if (mcMode === void 0) mcMode = false; + + var animal = pickRandom(animals); + if (mcMode) { + animal = 'mc' + animal.substr(0, 1).toUpperCase() + animal.substr(1); + } + + return pickRandom(adjectives) + '-' + animal; +} + +export default nameyMcNameface; From 3f7c9b78802c42911166f7deb5229d8c74968595 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 9 Nov 2021 14:44:14 +1100 Subject: [PATCH 297/635] modular, filter, logo --- .prettierrc | 2 +- CHANGELOG.md | 1 + README.md | 13 ++----- src/lib/Select.svelte | 76 ++++++++++++++++++------------------- src/lib/filter.js | 45 ++++++++++++++++++++++ src/lib/presets/vanilla.js | 4 +- svelte-select.png | Bin 24605 -> 6259 bytes 7 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 src/lib/filter.js diff --git a/.prettierrc b/.prettierrc index efd6fd81..14bbceee 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,7 +2,7 @@ "useTabs": false, "singleQuote": true, "tabWidth": 4, - "printWidth": 200, + "printWidth": 120, "bracketSameLine": true, "overrides": [ { diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bf0773d..13487598 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## unreleased +* filterMethod changed to filter and added via config * added support for svelte-tiny-virtual-list * removed virtual-list class and css props * moved VirtualList to config diff --git a/README.md b/README.md index 0068bf86..362dbccd 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@
- Svelte Select + Svelte Select +

Svelte Select

-
- - -
- -# svelte-select - -A select/autocomplete component for Svelte apps. With support for grouping, filtering, async and more. +
A select/autocomplete/typeahead Svelte component.
+ Lightweight, feature-rich and modular by design.
## Demos diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 817704e6..15623d60 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -3,7 +3,7 @@ export let config = {}; - const { Item, List, Selection, Multi, VirtualList, debounce } = config; + const { Item, List, Selection, Multi, VirtualList, debounce, filter } = config; const dispatch = createEventDispatcher(); @@ -83,37 +83,6 @@ export let listClass = 'list'; export let itemClass = 'item'; - function filterMethod(args) { - if (args.loadOptions && args.filterText.length > 0) return; - if (!args.items) return []; - - if (args.items && args.items.length > 0 && typeof args.items[0] !== 'object') { - args.items = convertStringItemsToObjects(args.items); - } - - let filterResults = args.items.filter((item) => { - let matchesFilter = itemFilter(getOptionLabel(item, args.filterText), args.filterText, item); - - if (matchesFilter && args.isMulti && args.value && Array.isArray(args.value)) { - matchesFilter = !args.value.some((x) => { - return x[args.optionIdentifier] === item[args.optionIdentifier]; - }); - } - - return matchesFilter; - }); - - if (args.groupBy) { - filterResults = filterGroupedItems(filterResults); - } - - if (args.isCreatable) { - filterResults = addCreatableItem(filterResults, args.filterText); - } - - return filterResults; - } - function addCreatableItem(_items, _filterText) { if (_filterText.length === 0) return _items; const itemToCreate = createItem(_filterText); @@ -122,15 +91,20 @@ return [..._items, itemToCreate]; } - $: filteredItems = filterMethod({ + $: filteredItems = filter({ loadOptions, filterText, items, - value, isMulti, + value, optionIdentifier, groupBy, isCreatable, + itemFilter, + convertStringItemsToObjects, + filterGroupedItems, + addCreatableItem, + getOptionLabel }); let containerClasses = 'select-container'; @@ -392,7 +366,11 @@ function updateValueDisplay(items) { if (!items || items.length === 0 || items.some((item) => typeof item !== 'object')) return; - if (!value || (isMulti ? value.some((selection) => !selection || !selection[optionIdentifier]) : !value[optionIdentifier])) return; + if ( + !value || + (isMulti ? value.some((selection) => !selection || !selection[optionIdentifier]) : !value[optionIdentifier]) + ) + return; if (Array.isArray(value)) { value = value.map((selection) => findItem(selection) || selection); @@ -602,7 +580,15 @@ $: ariaContext = handleAriaContent(filteredItems, hoverItemIndex, isFocused, listOpen); -
+
{#if isFocused} {ariaSelection} @@ -617,7 +603,15 @@ {/if} {#if showMultiSelect} - + {/if} {#if listOpen} - + {/if} {#if !isMulti || (isMulti && !showMultiSelect)} diff --git a/src/lib/filter.js b/src/lib/filter.js new file mode 100644 index 00000000..5f82bbc9 --- /dev/null +++ b/src/lib/filter.js @@ -0,0 +1,45 @@ +export default function filter({ + loadOptions, + filterText, + items, + isMulti, + value, + optionIdentifier, + groupBy, + isCreatable, + itemFilter, + convertStringItemsToObjects, + filterGroupedItems, + addCreatableItem, + getOptionLabel +}) { + if (loadOptions && filterText.length > 0) return; + if (!items) return []; + + if (items && items.length > 0 && typeof items[0] !== 'object') { + items = convertStringItemsToObjects(items); + } + + + let filterResults = items.filter((item) => { + let matchesFilter = itemFilter(getOptionLabel(item, filterText), filterText, item); + + if (matchesFilter && isMulti && value && Array.isArray(value)) { + matchesFilter = !value.some((x) => { + return x[optionIdentifier] === item[optionIdentifier]; + }); + } + + return matchesFilter; + }); + + if (groupBy) { + filterResults = filterGroupedItems(filterResults); + } + + if (isCreatable) { + filterResults = addCreatableItem(filterResults, filterText); + } + + return filterResults; +} diff --git a/src/lib/presets/vanilla.js b/src/lib/presets/vanilla.js index d5c8378c..997d5faf 100644 --- a/src/lib/presets/vanilla.js +++ b/src/lib/presets/vanilla.js @@ -3,11 +3,13 @@ import List from '../List.svelte'; import Item from '../Item.svelte'; import Selection from '../Selection.svelte'; import debounce from '../debounce'; +import filter from '../filter'; export default { theme: defaultStyles, List, Item, Selection, - debounce + debounce, + filter } \ No newline at end of file diff --git a/svelte-select.png b/svelte-select.png index bd0a00e03e5b28bbbda5803b6855431f68a97f3b..0640d7627d14c82c3ec6c8261349e9292d719ddc 100644 GIT binary patch literal 6259 zcmZ{IXH*ki)GmrBNLA?pK~zwbfYOm7Dhg7iND^x35K0h3m8ul!ih_m`x|9Hc5I|ah z2q-Pm1_({5VrWvNlN;}Q*InPA@61_y&fd>1&+IdEe#~nlgGcOV1Rn{!{;d zi0c21H5a7?8PTF`X(>pW*In9UE*d73MkdlW*J$)HPNvmjXir6Hwb?W~8QS7BEzpRT z;zjekOT&cGN|R|M9L-*aMyjBVf2Wlu(V}c<(Ki2zM%mKdB57G+w36h1WNNaXaF0gP zpF-`qv4IJLsF7_Lrh+)VMoUKCvAerjtJBNCQNq2frevxk8C;sD{csy^~@=H%mp`cVif-7)5U&~r04O#!fR|Qb?oqNb7^68x?7%M z$+FW$QF6)J?`+EGTVK=k6!b{N{a;fqor#-9Plw$6-=zQEM7mry3~W{gQ8Y@LE>eEw zJ{WzVKl+^6LA6Q4s{d5NIH5&JNe=Vabr(S5j)x8M(HM$|ED!mcHZr1c3v}9NG zOYBkk*u?C)3EHNBlbXOI1+rtqkU+_=IRhEfa|HW#DDr6rlXLr?0_=;^HTPr_^ZQWc zuF`&^A$`vR_jQ`>0&dh_;)%PPer2(Idm+G`4l{9gJF@6I9gXSPmFy$xov~^EW6cg> zV|wx3_T5msNGuM_=Wk;N{Jdn zl7Xhn3J9%Kp`5}pUtsZwh(ACF=as$r!1!(LfY#LWqWtc8MqA#HCcQzk`krU1yg#-L zEul{&kNfLkf%OuJP3w(Dhvp?+NYdXmU#n@P{d|-=ilYKNQN9@=QdZ(k`uoc_(=|ja znA&?51j_e2)QdbERF82tm1$@-VDR-{Of34ys@L}_Xf_rda5bonOTQQenvyo#IsBlM zC^C=U!7lGT5E@*M*Z~*RG=+`+)Guf&Bed`YLJiakUxSUz)AD9W$VlDSi@ zOmP49a2{eCCyxwdakk#xaXH(^Q$AL7HvPI?rg6hF1>GG$aNJ1%1Xv&r1DhO3zneYZ zwgt9FP3{Z}0u~U`ex)%)cbgYzRqu{OC}H93R4W+(*L)8D5J$hHBM2RgpK($0SojfF zygXLd2ca6yj?i`H;llP`;YU1}f?kGPb{kXSM?eq|k|5yma{Jen2#V&_4PZg4(C6z% zJ{HKh%WW0iHm->6v?%^b&$9O!^8M|Or|$UyH(e82Cq1a>n|zqa2qr{soYTsc*aeN) z^APfUS(ythq_b7rU=^8fzGU&kDMJ2)Yxpmn*AoeaKK|hZZ)B+6f{9Nn)+CaI*td%e>q`9

3okyOv0bp;n9w^6ox^DHTl z6(J^=*{Z^g$Yl+mCs@>!^)di*ur{G!e?BET;cl;5qJT zhi94}I*5FGxqv&qcNC5(-f##!O?7fxd-(Tb@^4&TU+u+V1lwpuxW_d}; z&F-CH-@U~8L0643MF5Lv4=V7Xd{Qmtrey_U7Bo5C!wnmL)toV|J<#ThrRkfYzA`q* z0@v5lyV&z-tMj~3N;4RHDPB9>iu)}?V4CTdDmsLfzV%H zYP)*kuPQSYbx>g8YA`9kJSvM|EaCyZH)+t?mpCuIgh9D=);r`4q*~l55nnR6Pv{%N zT8&@mxvHbcGOS{c2Tm(e7d#m=GWGAko9ytW)ZPI70evlXR#C4edlH3+Sjl>oe#$MF z6g6DN=Sh!ROW!WJ54aN5Srk{&w`=YLX#K|rLFb}Ty${WCe zSHq8x8D4b@Bi(Y78u+0@3%Z6Iz!NxlZ`9;~tYd-7s*mGl z2y{)w-U<(2@)?*&Hd}!bv0e_?bayOlaqY8my5Ttv_~Z#{g72RPZIO-gSdBX>l()&SPNe=Bs0Cz%GNxQu9K4XSTF9;~Q8%us}F#t=dBx8s zdcF|^C%kWBnY4}!PYr5*D`xkF-rGtZ1Uq6=lO5qzmY3!r3n}e`(L(RRVWsv^AM>(` zn3Dt`9QsK5IvWClNh)TX=f%Q3kfprXsO|nT>DO(zsBIo5J9g?N)MbcQl6&SCZu+^G zlJ-yD(b5+H)vCSSF8Ks34B@5%ZKdu>d9hPJoUDx6PPRQ7g-)I!Vx?Jtq^y;v7a@v9 zr26XhfqnhxGQ*-EsYvWz^AR!E*U=+HT@`J#^SA(u@;qk3aKJdzi#tzIr(uh|L+X$u zW+17FTaNZs9cuHI48(F4cm2{GiL}FD$=?tNbs4kN0w*U60CfhNSE&Ish$CKmrl%%v z02Re~9%CJMDim%Sr3^lv3cPy}T3T58@bFWdGU;E@(3uD(P z0XdKfm0YkNDY{_rF#Y+rfu`xgr4r*8MmI`YmjHUjgrVMow_s+6YIPvz__6ba6t1&vjhLje`eKisuGa(9jQ2YeGlYZ70j|w5GkJCRqy~UZ%G7kMctzDe|cpS9f+_-g|;9AEM|>fv8(ntZ;88z4)~Ig>2etU&EiF##@_4bOj+ z?+rx8Y+*a94Y~uJGEGh&x;bTPARae-MD<~XLvNh!p#1v2QUkz<<2G_juItSkcD?HN zKFI*$ssTzh4cbX>cHS@Xb70!gBaWvsHvNM^I~jb#wqOZE?}3y(Tvz^u5xJlVH0{MX8VNFEL+Tuqr~(9P9FT} zG;XT%!&CM(!JT&e@q24qMi{2AKKLFAkHtveIU2j?=w|H{)D=(LFiT1!*BaC|A^<+}KA*zM<)7ao zH?~~%hjshWsebJHGf*O9Nx`m4BzhLQc6sFNMUHuijdpwp261kOeyB8zzL98=b``Tx zMTq)Ul%^D^yhZUf@GbsGlS`1!k~any2srvQs}c^l4bx+7M1n`5R6me}5;x^!vo`RR zU0wYs3s8OhN3Yd1L0e2otI6^up0* zin9gwknU(B5<>qy*AAC0s|VDE0bwf!)*~0$F3rq^;X}7`mYPR&V?3BW;B=^D%U%0a zLu{{jRsX8`PKQ+)SNe)q!_VMwZ1^{5SJNqcg8k%!h6dAM`$%x?RG(z^cBAyW?UCo1 z{^}4(y!r*}cH~HqsaLA&Rl}UQnnvl^?KCX_2jU^s^Q?HF>wR1Kk{ko8&b=~=`kuPY zRCzqp*$A(&hnRoYVU-qs&qHyW;_DRLwf$rrP$mXRGjho0ZUe*+6C;`2Eoi!V^8C~{ zZ16qcXUuN~!5!462-~CP?4bg-RLU)gd0VB+($9t-=u5v!;q#|;SNQGylcR225`MkI zgg-uQpDF46RKh{3;?0bryy*fq+{}FcL)ZJ3dbR$F*JI)Cd6!YTQ+!=$=9EI40J9_P zh-o|cst9IT83g;&d>3dD1zS#?`ZhjmpP!rRT_EgR`RzJ-M+<*k#XvA5QTFN$&vvP@ zsreXuzL)khxE~w-(SKh}dSrSfXW4tRi}mos%zSqdU!!!^_ISj*@=o*Y!n@W6NeV&U zJZ%SU5aJoTnZbodLGhfrGl?r;L6ZjYU2}_ddR?32P8e80 z6#bpW1E#C~arqLP%`(8oGFukr&jw?}3++y8c=LIDh&j$}V{J4wp&LRvn1Oaz%C2IZ zhbk49_dWjUo84e_fmcL>hHGy`>Ic{8wB#$7PySUrVReG_K2n`&cLs{r{By@Dp5p+0 zcGnVqiK&H;j9weu$xqUIFjz_T^gz1&jnRQ*_l*>D@aJDWo}EcsAc1pW0cmH_~nX zXstwNjZVdo{L4g=;j&q#Q+p&IveXzfFmeh@+~siguu@Ct(IOnK5IgrQ1h$ef11mF! zG~8dWMMoEi%>|rOo^uPBS#&ldPdvupSZa!oEGXQ*m)wO}&NM?$$*^fvEJlBMmfh1c z(aiIghy&-)TcH2EkGGFxc9VGvS;nhTmD#d=8@=bJDHefv?>5!gX{I-V_T?X|OU+Mw zBTP%`r~@85eDbz>7^hM9<7By+Ycy)1MO~D*3P7Evfv^k*y+@e#u9Sj+$0f zZMt(=&_XXFp9$53ec*d?q-n}j-A<|qVO8hB{+|)Xj1~e6{k4Pe^fcc<9a#SO%@q-3*~ivMxpI_)nrH$d zv*NkK?0(d7mLpw_qi2VTfkx23BJ#b9!ZRlOUdWWrZyNlC{qI zVV0@y4|Ho}b-93L3t_dNX)F^#Pa}!-5=Zv#FYr89`&D5Zd|`x@n(k^@YU-<5RR@HF zzaCrqoMRn<1sLnh)+4{%PC)buRqD;cr1XQM5bPcA9)~u+LR!&t)4kn)Qe`bQk~uq9 zX-we~H3=yh{4N383*Ou#-Cy_ceJ`p#C7JR4AuE!o;(EP2KdOG{YCsQg;gkf!R+>)cG!``*!)4RfpLJ4-N zQzl*cU^edAKk60ILy^bgcW z7d4pqWAJw@r&lTcwaA;N^>wzgA*3Yj8<`PG0*1rwPP)NYzJ2rWPBQ-8Sar1V>5RtX zVp(JF#o=&~f+1xl??w4=A{4U7{e`^V`FI==l0TD~e}eYa5r54hnovDf9v)pj_VX^;c6PDZ|8@p3hRv<5=P-NNEMF>T>}^T8NAomP-Z+_@%V=C9 ze;Jv0m6;ZOzxyPjP#|DW$g2R*BWfLn3$3&Q#5yjEOTcEi&iMJtLx#41c? zI{#fw_kPJw(zJ$;s|Le&BIU+E^eDYt$8Ch@ z{#(`w2b?+uwuE;y;m>Cye?~Y=jQnL}fFig`I@fHEwPYgc(mgs>|K1 zqA)5g%WosuN_&Y|N7np(g#*T7i`PR*3|qaZaD{O<;>oyAQOuzydfhsCuPyYP`WQRB zV1aCs9gIt;hJGG;;Vk~aX*{Kqfh+T4J8zLxG7R&PWpF^6MY-I@Ef`8296%XpSrf8T z3GL-Tp_)lSGsW%Z-?Ueqb+NYZz9XUTqJGj_TP&6}f^kQ|=H=j3@LeO|US(3Yrp<(` z=rx2lM(Rq>lX>D9y4kLh^U~GpeH+Ioo+oZO_L4i6;?u1|P15$VKenIV=#F?S@#5}x zi#X-+=&TweR41GI{#QLb@>*TP_T$+SD7(a?qL=X1E1zncu}o<-Su$YbsiSu|{)1lh zDCLnB+nys?YUy)(T9G}s4aG)iQ994s{Rw~Z%InBonoS^bonbCq8_^&xOO)wx(!Zaw z?7C&mWV#w3$6u|`%8qqOo?CSoP{6&!=R#+e@|hkEsEfyGX*V4CJ<9K0I1IzHT3--sIC`|RwOTDwsaw0E0Zhd{yJAU8P zhY;a*St-fQ9_gNkwg(LhjTdz&lxSrnsWN$SrB?4<3JzOw=0Soq>=aJb5SX{%LFayv z{$@CE){J$jR0)Gj)p+)pkk@Y$KP!89hmeX^mZu+Wf_?)JhoA;6=!Zi>6CPUZdmVWb zn0Ubn{aHZryVe9b`YxY0Svt{cCTlHM#kM{L#EUxV^>MxwH3*$zs=I1eFH+SHB80il z){ix@?&zubjtJwb9lwlxXT ze5+vL)*hGX2>%XCXWegZUJZ_69iO}2w94@{4Z|wx%w%HQJNo~31|2Pf2j%x{BmNK2 Ca@$(~ literal 24605 zcmX6^2RN1Q`+v`|j(w0>W*ONeI}Q#iU*nWLk0P>XHb>UUOhWcSvPbqFA$uicmmMLF zk^O)D{#}==>pbuKtb0Ar{kcEy8yzimN-`EQ001Z-Jw!eM00QLoAB-4mdCR;j4E{&z z^3cc~00cFz{~&n}k_y2_i2DM)^G3!p^cKJ5&(RTBR{t!0sxE3M@S`IZ^-t= zgJ{#k6RAs!s3){x&g%TcZ@!oKaU~6J2#eD4aogt+P4B#Z;w>~!b2VK1uVzfxnvnKW zJ-saTmzHGNByru*?y=;BEBBMZpL@RSYro{PrZiYyI8uB#{4?y6we_ot4iG(F=}Rz( z%r{t5OdnJ%xf8)xVy+tgH<0z|*Z)uU@@?0Pb>- zcC-*t`XhOE7xT2McikiE4s6D!b_^q5zAx=9pZlEb4n@Kbr2(cp!7yBYWW~KV;&Xq# zR*mADyv5FSVvOX;A1h}5+xu^o6qiNFg^5iy@Zv!cXZjBp4GU-}e)5Z5HVXUQlgG|p zEDrHVKoE}R+*2M|dOne1>BADeHli3>K{!eZr9lv^b=XL0Q7cryG??GNz{e4BV~Al$ zfL<20*QZXL)uOX)d2c}JCCh43^GiU7IT(gk;Vn{dR%7<(fgBFJl@MTC46~zc*9X@? z4^uqAyd|uF1jBybPz8)bv+7j-Ww*ty$K`Vt!XEZO+T97c&<9CHicx>7q^C&2Ux+2V zhrDDddI&&iL>2IW2X|%|ZXUBI%l!5QM3f6`^yY<*`ek2G4p-S$o$(OfK@)-_xU4~J zoiE`SwA=vw$3g}X)*yW;58L4|BtnE9VoPg%bB>G9=ru4j zU^gbwf7DobB#Vn9ES4pW`5$*7`8o+b>lFta4crn*f{(x#8yN%7^e+3nS)JQ zMs{H)p&V$YPpI%*zb`bS+)$d)#=J1tSvEb@SM->%mu_h8GGH5zAgq4&l5Hb*l#JxL zWK^Z^L0H3W93}WN6DO>`T`=@E&Js$aBfts!F)G;a;$dLIs>2%$E12^aQzph;h|&={ zI5Vs&hs!aD1A25=%;P}=tKEog7eq^?v4>R2J~2NR9CFh{mY1(s$qzDG^71`iO&wCf z84NQ_Yv8~=--rM3vt%Z?R)Aq&GmD2%KS%XVU>?*_ow5dN1y?XkdJ1g5SKS4plnh)Ws6z#OZFg30FFs4GIz51u} zt*HC2UFopsk82aS?stS3F*&lEo9JpnE+(3Yd}z8o!)p2%3drSzcff3;2n+`V1uZdS za4fpLx*OuKUEn<@^m@z{2)P6A0Hzs8bQ)g%&?341g%BJfu~xOE1-@G{tVN@B2)Q<7 z@Jc}Ghp?J?Q5clw;5`RuuyIj6EfpAuuLj5K%)75g@AShDP%ve{%zapayJ$s513)c)-C2#VM*rLb7ByeJIU$+g6#K3h)1*z@!v; z2h5Heu0&ZfN{o9pzT`ULPouk=2kn24cc)DdVww3S=gBv@K`MIZnhu<4S6`vnrhfJ z=YbXz6eq&dy__v6TmJz;X!D`2=c38m{{}Fseb&8v>3^Hwg-poZMS1Vj=bNi6+bsa* z*M~4ikH1iQt`BK-J=SnvrY~@y^WGb`oAW~_!Apn&c*j$G9%%%s)d*-G9r}`8_V+!a zt6*sNtu?%n77$fXM-k^5wLg5B^1M1Ji3g?vL{9`7Hn#T`!o_6qhq*@dGvomJ7oTnv z6DK{FnzcE7r33^puV!DJR-GbHLxy2dI`mLX&3{ondJ|k<5nB&SOii;P)JLfEQ$`m75}fZ<1c7Hwsq{VKx_7nT7!}kEr75X zR3>MAfKx{1(_3yB8>Rz5fW%$4E8&HKauSaZWHcEPB2_j~bAe#Hm#)0ijftEd2mz9U-}$@zs!~u{1V@f1 zK16?)K2C}NV2U!b&CVqNWm3dNVfJPpr)LQRzFO0+DwP>Pjqkw6QkQO`YkODs2}$Z8 z?b4c&JyUplsBKu142x72BN&(%0U*yIs|}p|6Dd-{PC>*f>K5RVYV<)M$I^Js_CK0% zg-ADZFdzUTsW;*x)*@}+A&|G%S~}D%&0&D_;`pSmyQ+lhz^$6p5%PIqwlfG&k(n;g z*jQDCm&WlxX==no2mxI*!&+oPe3FbEDl~f@bSliYW{!NhtrU(JN|PwiYH3D3KnGwp z|I0D0b$Nh$1~#TrBNj-(rukZj;Gz`H9NHva@M==&5Zn(#Iykna%a!tNSxCM+VNsfM|xrZ#t`=^$WwlWtC0U9@l!GAFrdQxObm$4&&Q!iP4VGX5W zOpVBXX;@4N9Q3&Ec`p*n3Uk3-h3#t~7`C*qnmJPh$I^eGw}}E(@JQ(hA@}qmm`c;H zXiflk#e*taU7(Z>Bcl=d!0vS9Dg7Jy2>M+;Zu?Mxd6aamb;YNlM;FUm}9B%q;J>@3ZVZvjg$wpQ_!@9XNQ1qB!^^V zWSDdmkRosMQb2&)yfapo++ef3Iv>m3VB1j8cQ8*$Rd3&c$AEgK zipswLB#-feOJlBGB5_f1LDBzS>Ia@5^i=In2?qM78t{%Nww*sd+1rikDK1Y`418Ya zPmFu%6{+KKn~5^m78%NE_>?%6LLn{?`)|ti#FaR+>b2GcLkAywQ180bKpdoC7DW?T zMx4t5j|mke6zHvRmyhxOXLizDaO5$xW6m6X`7iS^Eg~Q^CmxPfLomI*C&-Uj45Hin zY3@ZZsw&QLvG;iIyq1g>Q4^X&1IH4V!Bpy^^0y%G#R;wdovbsCtYO0M*u;x-w49+% zDB5d7bAsux#DkJDA53&#Q#n)KBh29L95Yc}-RQI*VUPwYNN3lH|KnicvxF@f$;}yf zeWiOnykBis&F*@V3!rZ+k0D5r1a~OJd>i1L#Y!iGc-DEYR;_I_a3MA~bbc3*H>8Z0rA>Dha6Sb&d#$($tNZHy2`P?Wc-Jz%vdP_b7 zHCCeNU~AH$K2eXuc70h))HY-GMij1&Fo#Xxiw@hPD^c`DCAZTUn|jp(U+d8Mw*3Sb z2H)~DH0R~01{9?|)H!;wwD-9Et+n5rjlmFUjnM3dTPqARzLKUJp0kYe0te#%0v_n1 z5~NH;6bR-}arhXe5qG1XMGfqy2Xmw_eYP#bLBEDlIZP#5c^G!_+taeZ-tCR*Wy3Aw zB0`tQKQj%AZTh+Dx>#Ru|9=O`4kPI20UPl6z58uzo(^2Y4NJaVS@38`gQ&cph-hnN z-+OrG>1>-#Ag$4w(sKL8VMtQLr8I>lHoJeaUeSU!{Pe|`^6|tx@KdJYeDl>PITS^G zV| zl+*hVOHkh18T%=gw2^>Tf(FAUrF9sRRl=hDLbN~NNc7g1QE!+kz$;Tas{+jmHviYCj0CLAUCyaG)RVmt-sM5|;>$@SL8h zXfOboGC!uL8|Wn-hZTV0?w^<;fv8kU+ruW~%hN{6h=Dd)zA}16G8S(5eOm=lFD6k5 znLEyJplQ9_ssAV5FnGcFQt>1?$m<9do_mYqXL+bPJ z0?zIz*(v+2yUz^wxsJ5UNgN!#%H^x+F=4;KP%fvmt&3$5waDS15R;$s&-%pGP-M1s ztG%-2Z+=HBTo0`vb+C)c?k}}~ z(l~mbBx1p&*`F9~lr*|HJv}W$Rhy$+&F!v2k+}(Xe8LTtj`GQggdt}KGX5rDvc=_) zvxDF~*0jUCGpUH`Fs}IB2z)q`_ylJoN9SmWGZgc5^#r;0qmBdaXsaM~C;py8&p1Zw z-#Q9#`6P$8e<}$+5MIBQ?kBU@vR)Tq96>twI+iLV28O)JM_b>(87^Y-zS5eiQF-=O zyU$Uiz3w`lBZ9;D>7MeeP$m^LTq}y!ETR0-06j3AfJgdu7!&5)ADm(dWEJ%=V)k_r z!95kHc;Gfi+)hMQx?~=QsLqtj){7MrEmkrJI8y~&${rb>*DwUzs^aNq^;yKJEM#E` zv8R`rwKA9}>#ey&@M=CrR`TP8Zl#%)39VV4BNbXNLf^Gqjl+0I$u{x1pu>L7R`n31 zCM;gOclN03W)qFbNL#>)yLp!g+m&oB6WRnkP=Cym1H#p| z8GgLdi3pEypW-?5_7C#s!av&cT9%g1xA&m|GO!F@MuL^wHnr85QV~TPc2jadf4|z( z$;M_~>+kD~pG5e|rA{5zXAYMKzSELD-QoxShNf?WTmotUkIWK=Ri*j{!Joe*43z?h zuNH%#m_%#)FL_)yhF*iwE}suNc5&TT9A?e24 zQ9J=!Z=4JMGDEK8Nf=#qznJk_#BehGn_{WkmwUUXUv&Cwo0>xra{?55hD&WGP~t^$l=Q!($3C0Q`AVRlQJvzB$omS4wC?w>Ina7 zWo^NC)NnM1LyE*^s@|wEV$)>^c?+l#6O$C2oCb_?l36)_-KWq=L1k)6d?g!GDxm7P zw^OFxJh41^Z-5?L{iYQYi`mv(0TdPQ?bVs0^0(RI@@DSw*R(N{fXfzx?v5{j-VFQf zH1c^d-18hmW83j#x6Ee1i0$i)!L%d^Fu|giXe$w1@UU_C*6Z=;2k?vR9!tJM*CSF) z*(~e$>o62y&Iwl-%4rBgUI(?|4X`EC#9*3Y&BXHO>zWer^_oI} zdTbsUP!Va5xBt_@Y!|k{0qAqWA?^Ica<0RT9vkYZX& ze)y09bcd)y)?^L9Ol(t@K9;B^i@!fxAsh??3`cOXmBe(|TVFuzHRi*Osf7@u&Iee; z3S1xkymk=M&f`S2S}~ced;NyP+Ug?F1K#h@YD>|Gnj;1H(3Hb239x(z4yj(9ffpfF z3gE1vn{WV-aD?mSn3HftR45ZUq!0j-UXFp93nl^Oa8|+!R&d@Qrn|{$hm!C@DhPn! z{d3&#`1?AjZ@^&yp#bP+*MYr>xh6Pq;!qkum$Mk@H>MI$3U&s7QSO!!+C$;%o`2JK zcU9&2*c3;g82#fj2Zetn`K0W>(h4?5-=t7kkJ0w)3cJl8i3c!iC6w)4A7k*I!5N4H+-^YQM zn&R$dH_GFmZl7L$?zKvUpKX3DK^HxPUL-F5mp|qzH|C1p9Bm^gFgFL*GWNvIb{-v= z*9I2S>IroA=0|Lm?hGr2%()!n<7gCz`q|fStBlqLDKJMeK<;J*S;#MVSDm|-u`s4$ zc61o;cQkzc_h3bjl zxk_f|LG4>Yk4M9_W-(M-9$^nXVRoOCKPq?GDb$-Qh39IoH0%&iXX-6DFZhn z2XN*CBomj17g&;GD2_Ozl-5%mPM=kBvGkG_(Gqy#44m_K>V)S|s8baY6(w5QD#{iV z)90i?zV9Yq5w??8+8s={zLLe+W&8oQOgWygLNT$1)#IxrASR_ya+9Rd;fd+iu4<3R zXXOJFAn^-yas3LIT2Sl9M5-V9>#`lP^w`L*dK39=B4G5vK&i)Tnu?T`GQBsA`kb48 zWEB9k6HWBK;BCBW`>E`GjqfQ42}P`4(=FgYHPiaNqld*jCFZ{A?{8!~!g^RLsO{v4 zB5}LE+t`=&sex|tBGvXy*>UE{JjB5(0J!jw*As$Hj-`Yc%h6yAzTJaZ@Vy%@zNsPvTvG8$fLb`A&ScO0qC|nno!(J5RByQ)G1q^R3=F;r4y(R zqT8OO2GAcW!*=qGy4V*485>r5?h=f<5&dqq`&OK=FXQ}7knP01ZD@U}KaP5227T@LI4eHNaj>tdjh|tfS=`jxqlBDs1C1usya& zO)-?ayubHzp(@KH^rND=55qf*a3B2~$=JJE0#v?MA<;&jg>h3M@r8@{9c$^Cc>(A* zztt)-+G?SD9ZJ<7YY4C+k3J`)ad*|qxwVf=`$tp^& z*-t-LdQe{LNd@`@;4zU?Djb4h6K^WufOs~t3E2w3TUbE|?X4xB3RnklZiC?@O9f5s z<>B;s6{a;0NO1v*Lr@I8^@Q!17B7<$Yo@RPHoOMKIYSL#T4|$kT2i@|FA_Hf9cZgw@O<=-s~Z6{}_~f`BzkjIe>NEd0JXlmM{pGVtoR ziZFhHML0^cS9+L>0E)rwRrVg$zC@({#Z zla1crF^7J)K?(IwbD_=H@7I`S$0KylNB%Hs$2dg+z(#1gP=6k|lX8cwxSYfjZo8su z0|%n@!m|}EBE4NiFp2lyaoSNM@l_E=P@KJafDpifA6UkMDYUD%047nwjR!?XpVI;! zJ02eBGMIiH`+a+^YnKEv`xTkTa_oCqGYGAcONphmW1y$C}~)`AJ11g^G`U{I{{RHu^WB^R$Emov_J!AXRn(Cp6|LGSf+MCwX3-JE5U)vxH1z*Ckm&_BN za!3tN%af4rs&?~JBB`De0R>7gUOG*N$3~X71+CCbc|kBN^Pg{x%5T zznWd0g+`>(+QW1g0R{si&yyY9Nl@__1rJe;sW-H*sBrB2(NXrhT?GNhcYH-UJG0E= zw0hwO9W`9A?QZ@3nv-otnk#v-pEpkKzd8%XGtDS6T^W^+f#jlU>A-nH*#j%ty3mIIUY;ed5*(>_!SXP9v3WT9I z#3|-8)JzxRCjDJnD69~V60xquR-K-D!M%-+nCt=3@5rb*Rq?llH%k)P_tgfNMyRRiKz2vvAo zT-4j6^5x4xo%6saWj979J5}pV&3ED%t55!&^w>m9tX;92-m#Es2=`lDqEWkB)hkh} zqk65v18r9OoCrRVAMPni2CMR8St6eJ9q-n!mlZcb&<|Tz=5Ulca8*v>Pu=?F-(@C0 zU~{&wlm$Fwz#laHm?t!j-InkkWr~N&#{Vk6t~P;+xy!mYbG1c{Z}LZn$l+$ z_qngV93Qc~bZ7p=ur9Wm6_L1?{sP7QdM{=0Ufxc401u5)P3#u=hKtCu77>h|SjMJ9(w zYWnX+zc%*Z#5F6XO4nG|nJ6KLo7h2WC5wywMa(^G&jM|FtYk5=!Go()XFRL?eAk+< z(e7;~w?(ast$4L_@qd-B9FSi!^-YEr1R^dZsc<$hGYTI2PZA zUwqDA&W^elnEKYy&CEnSvn{Jt@2EgsAL{`TRk&%B5CcV_-t~K>w*VUgHyej1J@WD% zYlb%XZ&%OrcqM7?cso9=e4Vy8oo4gC#?knH65|yR3|KHdQX^1bUgZiY>sM@(FNO&k zpwo|@5rFs9k@M_z8^_(rxuFbqS+nwXD_p=pAyaO$kb9DVsDj_;U`>Mf6V45}i`DeC zm`su!+0Mt8O-+(g9!c``^lbigqT)9X{mWUgnesm3cQbu2V@YAi^rBrnucxqHy)V3F zY)Ug&cPmRBa{J!2Rjh3SS-dErsIDWclX0G`ve~8FS#8G%J9i#zN^hVSDN26sp0tv5sHoz8)WQDbzEF za@o_nPEsQ6c13Rp3#0D`P`_aoZTu#ln9VET#Ee<+b#Bq`Qr$8TChZ-1dG(FBR$RzE zdc-)zdKDqD+dVE$(q2#Tt74{B1naJ0A^gd(jIdPTs-a|3i2s%12v@9=5lcm6_o<`M z`{*907s+68B5~)k?4HUU3P`8rz^&qqGo_l}bwaI^_h9oa?5^v9hxYCGku{MBnyY_a zT}@{lL~IvuQE>sAWKSpbRce+ASlV)`jI{+~!2|olKsTA>keG0arEoJ{g&oHX zInIaKL%e>)ti|H;?2pSA)vXX6f@-1JWw&5u#sFWYz4hmd0*wA_Oj+r-Wg9mbOIffB z6gcxJcP_TTV?jb6d{LZ`yG~3o$^86IlEpf6WLXPc=<$uOw$6zb9+n(#90K3(EPmMU zIxIQ0g72$Mlq3f+wkPeMXAQ8c<_l4|5A9YxKNh)%j2^a1BrrB8gp;c1gsqZ|)~VNC z02g(O3Ee~u=wCAuY9ldHU+-289yD8Uz?CvUoajuo>-c!h9ia@TAD9-mRnd<)b%Pi2 zkKJRAyoDa9*QLcCK@I2KVEbzt^MNPYI=2~PZMHN#ZIu$iQ$|dIaYxyZ8{Wdu-YtIa ze--me8vRdr`*1f0yfQRcS^inf3c3_STOA3X60H++k<ESr+@XQ z8PwZIkrgQpiCbF~k86iwGBn+z$Mu83Af^P{D8DML=lUDLwkR;fVG|4cx-r*H#z+Lt z&Q#|=KFIOD)D;NOJ?y@^`M{a2Pv^k4i{w37Nc8xEPtenWTj^h;;qAXq*|3#g?yn&T zmpyi#h20}S?NM(NMWbrFt@R#e-EWUFzcf3T`7!cSOtH@!EWH+bsSFpxPa-W%#eslV z6Q>Rs{J{eq7@?@X(So@g9PFy99~w*bn#L7HxcvQ?Y^v5nQPkY#=q!^FJ3Rjt2zfh! zDzgQ_KU@?gk zqghY}y*TJMN?S9RU1kSSybqTrs$E$kq$;AilPgo&9MIFP@6os6Vr*H9*nd~sP3YI0 z_(RI}X{{k?n<2O+G+Y_13IjG)=~d8pN_UFRTy_w}?q-n5%wHt|zS_FYXxpVcuXi)w zn8_6FiX!9!m~x*+DTwG|9X>pVmwYD%e)=SgOAck|b3S3sS#Yn>Zqkkb zaEYJNy6k!>gOrW}=S zX$xTK88BQFzz^b!6X-#BApU~-+m+xISiYS<#+Rhu zd|gz}!PKfvU3cc*>RXkr{yKXPd?Rf@QB(z4XU)`qIJ4sd-Rc!}KfZjy7{nZYL=6R* z0)kgRrw|7q{p}HA%0DodLKWERr*sVps`t&~?HuQ=3**Gl7!E768J(UyLL{%yhNZJY zQ}0#3N~KT%gKR^_{;UWWo0i4-{Wg)nq18C>R4B`Uq2&WF!mrZC18I$qH%K&Y;3!on z36qZp)N2=o**DXJ`$|SP{mU@FdQsW=&MKxfQQJFvA#KEHsv(zBvy za=GLagrc+D88@Io&jT@gTk5tJUNHW4$Iam6YCpV1Hsm0J?8>x74dko{D!{QDN%;Yn z>W~uK|Lb<^A?$aQe0d~v za<)uQ&xL--6Gg3y-JmLUt4JxPCroKZONuI*vM(;|j7X{IUCIIB&ny3d6pEYG{T*wS z%GH{D{p8jY*_Hzcd|kPe#h1O`+3ge*LwF5(@DlJ$lV-c`e!cN3TF&Rg1`nRqC*JS4 zHELeW@EAAq9>Q&$*Gy-V_S_wTaZ3&y?z!RSrvpJxM> zC*B^W=6}{y(U<I4kLa0!Gzm7f@%pY0HS1ok0wh`AzB5MT<*+y>rSU=(#5yhD$oJWz-44thr zLP~uPYXCsa`CSkV)>eO*GKCdPsBa7E;f#tvm-6VmbG82j@zl+!x8eF{R|2oLxliH0 zfjc--$pHwW$vlJbZ@NLHvQ;4V#fR&z&k4CwEhj(>b^hLoCW21zX+h6G_eHegpClo; z^NkUatFrTkIJsIsCK~G zo?)wxqdKVSO|}gQD+E9^;k1)K9w`B z9VJx-+Fkyu9=slJILVT4cIDI?VHBU&JrvsjU|9(D^gd7#P1ei4h}YFtXm~0dvq1pD)_g5oa8yggINGVV)Qxx5 z|NW3VfM{#Zv5wtrI5Y1@iyr7VB$QBK|IW-`wM#OH;0Y?ciQIP&a3c$*YL?!&vk6X10Rf&poa1xW~9-H0+m4TiLJ@V$rNdkp+Yu;7yZ zwhEawM+IQYXs`v7+Eq+74wM5m{+92=z`wL_NypTAO1)}v zNO|_7xfNhwE54Q{NzN_A3pw^h;bPV2NsI+DPZJs6Y7WT#%i3;AQ?xR-07huAxW@}W zi{tUg=NUGAGO^833rF@ZU8NT7eGS2J%-;rY^ngZaHp&mc zA&2+bK}}w~S_$T34Pw+?*$-?e^V+D4DSYD-tKp~GD<~X!wYQ7i&3qr%rYK0=(^AlQ zHg!DTw<}OCf^oOzsAP!Rl?O&x$A0#6*T_{{Hv*x-Ha)6!<#Zf$HwKB402vg zyZ!r`R(y3zk-1)T_l3#$SSfC~xm9|gxSZ(kbsQ90wABE?Eq*ZgsEp}Y2|S(ORyvU} zSslK3bTX3e#qj-CuuohW{uF9B@n0C$t`MH+7TYU`I^5schf9vEhS|~GY%62y`g-ZD ziEYUK>)55m`n<`Wzfk}{6mH$pFWB=Nh~lQrdth; z4KNw^lg0(_b(@{z*OVj^Z+=r~3-sMEJ5N!pH&9r&J8C`|ec{^cAUiT)%NigD8_izfjL1O|MVBDizB>S?@4i!l4jYqms?zGe^~%cdsRPf1vFHXAWEP(QCR}l7{6MY4c@TYgqv| z?+I_U?zqXcH|oXln@{<;noX?Rr1f_f6`fz`k1?!)lfTLLdI&n0dRfw{k5OXp(T7$? z)vc(K|JLMD2E_@AS4^e7Q)a_OC2qWmyK@$^CT*{eTv$ws-Mm}hxah3z)#{4vKd1S3$FcV?~M}i&DyNqGs0-wBWRV+Ls`E_OS2iw9Gu$4btet`sTLF zwT4E@ixJ;hvYuUDRN?0UN1uSw;bXI(Dfwn@QHYf$f{AhKH;?(~qmR zui8K>;whQ`1R1_Z!bkdl)0@nUnNl?8~dV@bD3kWSN)aF*pFl~0c#4_#4E_r7oA7@y;q%In zK1=c1frl8_1xa$)2{zv{X4MXr^6n~6-Mcgy^F2J<{Df~oQTNz72^ zU@m*VsII!4Jsa9g@9iGA;GQ5xcH5L(<{%HAu^G2MW!9~Lm*7$hEJ*ZNznHEUT{idq zUDw!hbRPr~l{QD34u_8Pe9Y589mu|jq6P&V-Hf;Adlevah3@;}Lh(7Ex}U6PY0)70 z-1yW%aY?&8*}`O6tFAdy?kez7y12@S=2Y?O>B!)yGBKXtg3jEcQP*`hHuGpF^eS9K>TDuc}`BQfi4(-QVJ;Mh>f|6=kOE zUvI);ufr{DLmH>0=kSE(wgyA^>gEtrbo03B;gqNO_qqnQmPcpzn;F1kPycW$L+Tz< zf_K-HC3ZfVo4ix(V|hq12`Y-ZjIxa@wIeTfk{cAP9w^vz7VQ7N)AGFeZGPa>>bo#? zvW5`R(DIO?b&Dixrqh*I6#9WX3I(6Zz}VoDz4{0L?M<5$dBM|#28q!InTT4dPWaB! zRKT%3#MloRLlJcYWT^I0GCBH4!XutrFb@uP(6aqCD{ zZk50H(E1LSW=ktZ%x`CB|2oev2&12y?W25>BzRz<|M=|3%=@<8i}1k3lf~27DKVy# zE4-^pnj{$EhVPkN1}Dj+N_`S~;wdA`H=>ih=ob6Y+3QQy{;1WgeQhA6WhS4ZO@l() zBQOZqoVcElKxwv_IvENZWvV@y6z=j9JO5D=vFgr_nSS3~v5U{as503tD=%)5|CCrC zh8tO`-V1M4Eh23&?RXb5%DRC_#(oqyI`g-}O-EUI7uzkkps;b% zC`;|XmhV28jZbboJVDM4nGN;~+wDOzn+xe5rx+2wzh3{YMyv>OrCKN1`mMbQ=idEL zH@$SwBVg^BJ0K;n?~YIIbaLb#z#PQ|d0lY@4VH^U*q5+sv zo|eE?WfTL9>;sa-T3Yw7cD2iU3asI^qgYqJAdq0Uu&%@Fw)xHe^v%0vb z&T-w`BJ#^_q6?Eb##ZXqyVRm({I^!u1!r3rIBl_dvDs~{gy1(}Tnl%hV;(2G zTI9$R)=Nc*W3S8ylH=Dxo&iI`vjatT3rOk9GSh;1MqkAtt*aUz*V9>pe)93=w?WH8 zu0(6+rmO24E9;xhDNT#o{UfvEBL;gv0-CN8ah?>1hum;dBz#Yiw{CDd{irxnN7uim z>kjVa2~WDSeiDI$h{!|n8)CvIHC5+_35>;S_lI9qst&Gi`3D3AkRqWp&yxk}uGUwy zFV~_i($m&>AetuWMP;5&em-8u_?xx=Vq(Zo59>uuegBQ$0{O!jG1)4Doo0jt`9`E^cj;hTOSgQydnSN!J^5AA z=4#F%u8#Bq>t|NkEHc_2-U1+`VdXoy2!c^@6d-N=nV*dI0Z2awnBLr*eGUd(5g*&F z{0Jo?D(XQx2#{L=)@UDW?Y4kZzrSn8FnT}vxOBNpd6>q`uScE+5cODp)tX_z`B-vj zO!JIH8AV^IyyDLVpnn9)?>d{`zz))knJJ_0w>}WpCIl#^51QNV!pEFJs(sK6hr1)Z zzAFQ)0Mo}(<26&xv4E^OR~LKw^y@dr*MfVW5&3eC@VL2b9l2$0R274e1xFA5Kle{j z{K&p%M2*g_YVjc^b@-o|p!m=a1DiJ(OK7pxLu1s_lE;19Xbo_`@|2j4F$Rj~5-l5y z;1^dKnW%$bhiHvy+4V0FCYHr1bhPjw$N}rbyP~*f=E-Z{;z7tB0^k;FsgVo!J_g%GqK3eH+hKj99hAYSfq-WtSj_kY2>{viWeXIw@A1fK zWfEXiM1bB?pAxx--N>gdGpVc)S_egXp=%aqYh%NEWvyQ|s@-74S*+>+Qf3v}Xu$k^ z&pXpnxY{m^uaI`kV(m@s@kGY{PkjKhV!8xe_B1G2%k zETc9)lJVT+vwbR*8KCey7Cj~`3an#Yrxmf@TaPQk)O$cfIqg01kJdN@tGg;Opm*Ntcru#KpQDr8U_H6U ztKSA(&WAF5)D$K1)sFZrD#v+qeeC~46j7qrWh4L}^4og>QTZG+o?Uu9LHQ0bfFM~p zA9ctGLeG<-PI=ILgLHb!e{pjPppeRHL>@|#BFlW4lIEn7)7F2?E%|fdkpQA;Qh33E z7PKHSd2o9^Iom7pV>Si^08aJL;JVe2eK8g!4%hzup8?>6>_@2cH2=4Q&Xw!Mo*;Y1 zL7?D=n$0JtYwf65Wfri2njh5%a7N=lFbG0k>)CV_le%kJ+Ac^)R-iaiM`$z&!tJiw z<;Q9(9fz|^0mQve_~^=7O#$S~T($=rG4ffx@?)=JsX*_T&rW0vcUX3))Z|DdrZ8fg zw9B;h^HGS8f`c@%@gJjKgA4c`X-4tpi;6q^ze$o)IT8Vzhu)c*l9ifad@s|U{{u;F zY;*l!2{ert3T#&D@k~p?H3`19pCD(?He*#xAQ;)X|JA)~PvcaaSL9K`M!hzYUfyVM z(FHRSwH12T7s?cR?JA6z_wy;RTfa<>{q6^Fv?4e8kvlhMYn9)(k}^f5^ERHNDu}Kl z(8RQFz7l=#!`WNQ`+cl<82oM>XDc?9PIec6I4Uxm-0p@Z+og zRxM*u0i4^>Jz7H_J4oj!VzLfGMz-NMeJHfK)d4+vP{PkanmUL$)q-oo$+Xd9nbIGt zc@>d?4#1Ruk+ymyBMEXwvKB#myRVrGO(e_#OQz|Zsl?GS_%}uI5w(FJYaJ-DZQO3$ z4lDYfCYM210^z0F_Zke>;i$M!&`*~c^l>rs7lUK7Do!qWbKM zlG@ea7ZU&`iq&93IJu|<&JBLynFgAV47d?#3-0TUP$9=LVgo)o6sitA*F#Ll<|rqE ztf@zzK`GA8-_zC&Yio7xg90w!N_ubgpt6eukl>ZM7wnY%uNo=RvkoK zrVUl8qv6z`;z;3HY`|-#gDuUfxObpCH5rZa&)h#2tsETkb(H# ztat(}z(8XxFA4F{kxHvqZw?F*2_WJ?)BfqwAPnYPlJu%U*WlW)Lc;v%+!V%+z(fuF z2Bv~W$Q|-PGA8x=weUJBL5hV!1FJ*dJ0h@_HM4MTPmZK|8TRxVY$_G#NTQ+!RXZtl zB!euSJup~}_$*vprTiZ3_z3(MVqs}iUxNYTX;=gV9BO_q*g<&QXvZ_)k-iOe&-85w)UAw1VVSE$DORpEe zC;>vXCZJFa!(Pd3&m8D&JMU`}=HvoebwT4db?FsEUax}W*x@_ymlL1LKcT8-z>$~w zcM;=&`Fm$AuU)@{qAxZEHC=!W{-VQ=GC-oV$xQe@iW4l1b{JisNjcj>NrLs{6zOa0 z?9ac4a-J5(Q;g|y^s5+~<+U3L@22qRmbDUYW1Ds{y^Q1qYosn3JK9iFifjr`%#crg%lqeWOto+Ai zs8T!ZLok~;$GfIg22#u5+*?^_`srOqF!o7~bkrBZ8#>goZmD*% zfK)rk-3x(=NYl=3FyODOHGqLyRQakBt;&(Z>z1OtoK`ps8mIwxMGbCzqqqEQ*J^=~D%$xrXI57k%hWDrLD9I0aTJ5K*})`S$9B+#A; z9^X3w>koA~MWV~VZ{Ru%rQ-%E@1Oo(3uhh(<@W#a#~2J|n2~*pQIY*3Thw4s+-tj* zj6K^ZS;tz+I!$9q5*4Nyu9A@Kv%;4XJqqX@BHhp5 zJn%qyf0VWH-RMKJ5}JSiq(pcZkfwC-1iRY}W^PZ`KGL+Q-t4+AQIX>JFvF^m->VO) z#RI*A0RE?9;^w^63xm7M{~pG>0|D4;KevB@>{|Tg7aE*2xpJvru+&)vzrMgX1Fxq2 z%d@|sSw;bs-OXxEXAP-aewV42AUjN`MZV<=`G9ZecdfB2GAdzDj4m1^8S2OM^<3Je zZ|cpA0?mDMyH4V!L0vroY``Wa%kSjhnE*M&$zU26VI+;u{+%vQK?Lz)eS}P7q&0m% z;%YZaz&e)QVk6x#1l%ve&S4z^pchnjwpE&9HVU48dIvVX*=5cymo!%Ja`!b{G+D?3 zFrOoU(izTvMO)ws_ZVVRsvIdf3w+g?jaBDlJdQFDyZuQOi`PNDb-kqnaI8ub0~SZi zdY&|bq0%3$W$1b}Vp<=-NscQ|8uFtao8~&+@OHcQV>~BKSF8KKM!x!AOUigC};P7tkpnA7%l!^zaB?&pJfYB;@w(CIJ7`9;_dZ5mujC(tr! zDFlXOp6alI3LeO$(*#=Hz;bia_(-;jPs|?QPU<$Pv;!V{32K>T12ZAoiC>1))@V7t zAR0X*z`i@+IT2HDnj68@_~n9KT5!RS`DnY_FA&-;@YPz6s@z($@zQ_tUOfB~ywgyd zbmk61IpD47OD!ZYhN_X6c|RqG)m=bx1HUx6^3J3}F{=3>igYXRG#YN~wLa_!mYC-> zF?jcI@nyq=#_FLYqUTYEeX=s>JgqORi_}On(Vxq>#MMW}0{aA6YL*^V0;NUlCPiD? z@6<=vcpq;+z2YH=_Xxe0zN5&zl)rxm zm<`;(`!BEC=JU2{oyIqkUK!>Z9;Pg2!OHT$3D3efmT!A`HUD$#otq2H@Gr5@D=!gv z^O{0Y+aaj@j`lZ*YA?Xq92ih28$zzrOGB>(xwiVZoip6k~cK zsl={g!bas7LjTWceLI9X71&Ri=q{rV+EZZ$FAX)8T0e`G>sAHD#lxG<@1?2bD-;Rp=+se(cMX{#xkLxs_QLdM(@>Jdr}ikVO$O!{1I)$a zjk(V&sYUX;a1!7AN?Nr@$c`C{ywpO)B;@G1r83r=-?3+@B5#U4Y&h8s4>ZZs#$^BeG&1%(dvnv9yT(Up%G?mH%wYS3Ht%m$NcgGE}Aw=P-^-P-|vpE=>NyWU#3}f8Cm~ zy!uRM%M{dW9EVu>XyHhfq#U$l*f|xQuC~g(W8$o1GpC&c@4;3j-J_IHmmatOxqe#d zdcEmwQJ%(@i(|H3Lu<)8hXdM)Ihu8{y~4!7N_jFvr<>1Sxg75*({sbj2}^Vs5L)QW zY{o<+PKaa`)Te<|DlJ2t+*C1m*+vQi_| z0e6x+60s7*?IusCCQA`&h;8S^*9JDu51es3G9g4BePoEg%pLXrXK0nBl+g9oW_SKf zX-&B$Rs~X;A|-=WE!qB&wk{VZteSO4jlhN0f0T^OX!UxrCwaa87qSui38+R;Q{#KP@%+j7xRClOQX!)AhY>D7>M= zt+RB*q?+SNLr@n$#3-OqXE4;YGfNX3b!JME*DLs5{kXNB5qs=F^wnCZ;-@WezEnmJ z=(H3qymgY4L>Nkf7pG8kfE{ev#Ud=U zJ0jhk=CeuEdGD}kFH_AA zeb`DC0lELZSKy5;7%|`O@0vorp3NzV9QG@uX|v4)ck=~*CoruVk-x87ZqC>HMw${a zG1&o)=U3{+#q6}bOng-1kb5ag*>WmZPg4uAkRx3F{U7`A$k$EUnU@oSDxg~j7uE#A4*xTStRP#eUjizAw zoNDO515Yf!xGqcySBCe4Sj5#Ty$`;*l^HXfq-0QlFzj~6Jn4Dq`XnJt-qeTLV>!@FO1RXpLzB+wfC zJ%(rcNRT5=G`ez^H4T5NH?GA}rFw>Y6_GAKs5nd%e+m^FjaSPp$n}3<*yAwEb7p z{%+f5BKIHZnj1D>rIXmggeAJA^gQ2&{XoT3I1-!rPC160pDfnrr9>8{3$A@G&pSl7 zt#KfRP!^|z$To`TBA;nD0~Gy-7IGnp>=Me2TUz+8tQSrk9iC*4)%6vbtw?X!g$(y> zPA;k@s@FJWEe73rp2){C0Fe<~{d|WAZ z4{%>16LoVJ>}3r3)Q_Mm8KCnwiVp$AkSQTn;hoTqUTr>#ykwI`v~~{fz`3$e6}=V)LD_55am-Qsf-s1AIct0KB2I?@(K}pEv=o;4Pgh zKkgq=c0Pcj96&=@92=B+%U@#D+I zqksZF{l%s!K9r*k9XZE_q|T%`@MYb##tae%dQZr(-U zPpFvwuZz67_$>C*11~^R(|a(PwT;Ucs*G<%n0-$kN8nLPrYw_hB<;lTUQLptWBRW+ zVO-bCpH>oN^)FyL;tUu;$pl_J>bR->z@b&HL~r<1-h{%w^W;GeB2jcorJec1WEEaa z)~^$ZO#-F2eb}G()+ENY`6JCTF%(I^x3DnfHbl#(cbAnb6X1&+gZ}{K znS)62M1W6;`y;@c@m-g;Yn}@-2>h!k>$h{k*?$7p>_HizGsx%&nm5M{#6;2!U61#K z{dM7Qw8wb*_I4I3g5>I)s?KXR1z0kU80uDWg)oPs?Ffa@z18%D2a})q@m-v&#C`4} zP<}UR61VD@$$k=iqqmfIe2&etQh)Myxn=#8rldEjD!$Z8Zuj-um0WD$R)qq z9>1D(h!TGg3d>IfNT)ODDan3-cW@%~knxnyS z1)}Q~V-AYa_VtCBp33lK^qvlXAZn9}8`c&G;WD(;FXn4_^Bb}jO^&yeTbAc(gcWVF zn~;_gIepU4sKM!%SFBtyLaFRVSA^NiBj`;KjEFoX74vE1#E_l~tdvk{m+{1MtS9#a zr0HSzA<-_o`3gI-d`xou8M)6?* zd!2)+m>!lpSZ>*o*QS_%G$YUjSACYA^Kq8K~Vsb$`r6V$Iiz9P}Z#GwuNdrP9m{}&+j+b+z})y z1E+%n<%YdZe|1XdWY@g}y4p5ND4ENLmC#lH*P*I5-E$O|VbG0|S9PN9uZ{K-^$+9O##R zn5?S_zrNJo9GW$_7GfX18zd^#`*m%?g_dw-T%luNXz6WjAYIu@7`Vp8b&`ljQUP-H zoPf2WnyCPjtDSiUfmgr^b3he%amicx$*jBAd}dI%!_SA&SNCN-!waN?h`{B;tH3NS4i~GHxBBps7&eGa)jXqI962?M9dx z9Yue8f)!riZkYhdw&4G!*K%;I4H!B98@!+n(m{)Jfb69PI2Q7a)EfH&!1Fr3HUX+* zDkBJRJSl(no3Y+^`hvrIc|PnSEErJ=<cW2o1Kv>~SAY2lmJ?PxI!rHSdF)B;S@Q{Tvpty7NbO zP^I9OS7P-bzzGQn@2}B7K2uJj)C2@x5}jmbJ)-Zm_CeE9eKpTQ*q= z0I?2LA4{TS0@jyCPc2pYBOg@Pne-&s98mT~LCgSUuYNrEEfVAAI*!xhhY}a(3732* zmAnAV_bZd_aIO~x>G(c#zARdOG>KxRTDj1WBmk8Ssa>ppoFjo%4&;=9><$&omlfjh zY6qh%2XEr`Q;;MdzD_0 zy+FCra0(zDdlziIxF4qpq<5)sKw&LNT(i+9B{~NTld0tbhYEc~7t@G$0q^j{KKFN< zyDBhHx0ZLsH}X)-ClOqkQed})`C3LlCuXe1b}EX zj5LQdtw6+82=l~(JOhGWDC6?W?XMva#UOfVcGd4DfV$)M!(COQ{{T1ZO z6Yi)*=&cz~SzT(e>Xj~flqLYh2Z@5e9}W?$Vd&$u0Z~Jc+q^P3inY`zL$g%O>w&7X zMWWmsRAliH?cU+&2GP)-3R=6mV| z&`UR>%0xMEQUUhPX%9J!OHJ`l`>&rUa)m?vZmKqSxiAdL*>8A07CQvc<~H(*{b_a@~iV1c{unt9dR%u>!o)c z0f@u^dv5UEbqC!`i5<59b1neFy#!0tPvtRnU2R)%Y+3dW z7P=5E3_yOWiB>=&o)V{Ns49Dz1DYrx8_1WX;ov8flUY{*(E>1VHv5YU58dascz%mL z3K3H{ofu2tNOPQKi-S>>$j!456K;awHkC`}INp9RvgRJ8QML;Vps zfEL44HUoHulNo4o<^IeK{)8S&0Vn2;v<8$_|+Zmf8jd_eLJRI6O`OjWr4+Vq;A%A^i0O-`jI$p+kZ`tG2N|K^#C zGNd6@8W%kX+5qx_jhtl+slAwQ!-JT{8E+*AYrht|F%%A?Wab;yEBa z<2n}uv1-oOG{#r^jy${3+4ku48>4OEoA}_;z?6hi6_4?equJTh5 z3Qd6sb;7x#gQ4mPs;Ve!a)Ij$@hgs3Ai(D3APpb)`KMm#iFNwnA>&#lGaGJc1`nMF zK(=W24{H|ObXgqSiCz8s=HoYWvCf~~c3oQE6-x>fg*E_YThn`8dFV(_cHPf! z7p+e>{`~&NuVLfGw*C`C#g0MW5t+nKLKG-=;Kf=U;%rdFtiem&Yo5QN9_?*cJa8Mq w78dH9oSWNM-`gF#ajom=Y0)s~-1a`_{VJ@?9fj{e1qDH8&28{irryc_2cU#{KmY&$ From 6d6e790df1d1e68fcb6fbb4c114cd15aaf51854f Mon Sep 17 00:00:00 2001 From: Nicola Ferendinos Date: Wed, 10 Nov 2021 11:09:49 +1100 Subject: [PATCH 298/635] fix out of viewport --- src/List.svelte | 4 ++-- test/src/index.js | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/List.svelte b/src/List.svelte index 0427c7dd..39ad6116 100644 --- a/src/List.svelte +++ b/src/List.svelte @@ -214,7 +214,7 @@ let listStyle; function computePlacement() { - const { top, height, width } = parent.getBoundingClientRect(); + const { height, width } = parent.getBoundingClientRect(); listStyle = ''; listStyle += `min-width:${width}px;width:${ @@ -223,7 +223,7 @@ if ( listPlacement === 'top' || - (listPlacement === 'auto' && isOutOfViewport(parent).bottom) + (listPlacement === 'auto' && isOutOfViewport(container).bottom) ) { listStyle += `bottom:${height + listOffset}px;`; } else { diff --git a/test/src/index.js b/test/src/index.js index b4e9dbe4..4e04300c 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -483,6 +483,29 @@ test('when listPosition is set to top list should be above the input', async (t) select.$destroy(); }); +test('when listPosition is set to auto and at the bottom the list should be above the input', async (t) => { + const testTarget = document.createElement('div'); + testTarget.style.position = 'fixed'; + testTarget.style.bottom = '0'; + testTarget.style.width = '100%'; + document.body.appendChild(testTarget); + const select = new Select({ + target: testTarget, + props: { + items, + listOpen: true, + listPlacement: 'auto' + } + }); + + const distanceOfListTopFromViewportTop = document.querySelector('.listContainer').getBoundingClientRect().top; + const distanceOfInputTopFromViewportTop = document.querySelector('.selectContainer').getBoundingClientRect().top; + + t.ok(distanceOfListTopFromViewportTop <= distanceOfInputTopFromViewportTop); + + select.$destroy(); +}); + test('when listPlacement is set to bottom the list should be below the input', async (t) => { const select = new Select({ target, From fc626ebc6a26181a29334fcf43839349c105d026 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 10 Nov 2021 11:14:39 +1100 Subject: [PATCH 299/635] getItems update --- .gitignore | 4 +-- CHANGELOG.md | 2 ++ rollup.config.js | 2 +- src/lib/Select.svelte | 61 ++++++++++++++++----------------- src/lib/debounce.js | 20 ++--------- src/lib/getItems.js | 25 ++++++++++++++ src/lib/presets/vanilla.js | 4 ++- test/public/index.html | 4 +-- test/src/{index.js => tests.js} | 0 9 files changed, 67 insertions(+), 55 deletions(-) create mode 100644 src/lib/getItems.js rename test/src/{index.js => tests.js} (100%) diff --git a/.gitignore b/.gitignore index b380ba41..976bcc99 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ node_modules .idea .nova /dist/ -/test/public/index.js -/test/public/index.css +/test/public/tests.js +/test/public/tests.css /spec/page/public/build /test-results /build diff --git a/CHANGELOG.md b/CHANGELOG.md index 13487598..a4350f4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## unreleased +* new debounce method +* moved getItems into config * filterMethod changed to filter and added via config * added support for svelte-tiny-virtual-list * removed virtual-list class and css props diff --git a/rollup.config.js b/rollup.config.js index a6397b4f..e2899086 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,7 +6,7 @@ import postcss from 'rollup-plugin-postcss' export default [ { - input: 'test/src/index.js', + input: 'test/src/tests.js', output: { dir: './test/public', inlineDynamicImports: true, diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 15623d60..4eeda5c9 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -3,7 +3,7 @@ export let config = {}; - const { Item, List, Selection, Multi, VirtualList, debounce, filter } = config; + const { Item, List, Selection, Multi, VirtualList, debounce, filter, getItems } = config; const dispatch = createEventDispatcher(); @@ -104,7 +104,7 @@ convertStringItemsToObjects, filterGroupedItems, addCreatableItem, - getOptionLabel + getOptionLabel, }); let containerClasses = 'select-container'; @@ -115,35 +115,6 @@ let prev_isMulti; let hoverItemIndex; - const getItems = debounce(async () => { - isWaiting = true; - - let res = await loadOptions(filterText).catch((err) => { - console.warn('svelte-select loadOptions error :>> ', err); - dispatch('error', { type: 'loadOptions', details: err }); - }); - - if (res && !res.cancelled) { - if (res) { - if (res && res.length > 0 && typeof res[0] !== 'object') { - res = convertStringItemsToObjects(res); - } - filteredItems = [...res]; - dispatch('loaded', { items: filteredItems }); - } else { - filteredItems = []; - } - - if (isCreatable) { - filteredItems = addCreatableItem(filteredItems, filterText); - } - - isWaiting = false; - isFocused = true; - listOpen = true; - } - }, debounceWait); - $: updateValueDisplay(items); function setValue() { @@ -315,7 +286,33 @@ listOpen = true; if (loadOptions) { - getItems(); + const load = async function () { + isWaiting = true; + let res = await getItems({ + dispatch, + loadOptions, + convertStringItemsToObjects, + filteredItems, + filterText, + }); + + if (res) { + isWaiting = res.isWaiting; + isFocused = res.isFocused; + listOpen = res.listOpen; + filteredItems = res.filteredItems; + } else { + isWaiting = false; + isFocused = true; + listOpen = true; + } + + if (isCreatable) { + filteredItems = addCreatableItem(filteredItems, filterText); + } + }; + + debounce(load(), debounceWait); } else { listOpen = true; diff --git a/src/lib/debounce.js b/src/lib/debounce.js index 5010f7a5..fc125ad1 100644 --- a/src/lib/debounce.js +++ b/src/lib/debounce.js @@ -1,21 +1,7 @@ -export default function debounce(func, wait, immediate) { +export default function debounce(fn, wait = 1) { let timeout; - - return function executedFunction() { - let context = this; - let args = arguments; - - let later = function () { - timeout = null; - if (!immediate) func.apply(context, args); - }; - - let callNow = immediate && !timeout; - + return function (...args) { clearTimeout(timeout); - - timeout = setTimeout(later, wait); - - if (callNow) func.apply(context, args); + timeout = setTimeout(() => fn.apply(this, ...args), wait); }; } diff --git a/src/lib/getItems.js b/src/lib/getItems.js new file mode 100644 index 00000000..495b65f9 --- /dev/null +++ b/src/lib/getItems.js @@ -0,0 +1,25 @@ +export default async function ({ dispatch, loadOptions, convertStringItemsToObjects, filterText }) { + let res = await loadOptions(filterText).catch((err) => { + console.warn('svelte-select loadOptions error :>> ', err); + dispatch('error', { type: 'loadOptions', details: err }); + }); + + if (res && !res.cancelled) { + if (res) { + if (res && res.length > 0 && typeof res[0] !== 'object') { + res = convertStringItemsToObjects(res); + } + + dispatch('loaded', { items: res }); + } else { + res = []; + } + + return { + filteredItems: res, + isWaiting: false, + isFocused: true, + listOpen: true, + }; + } +} diff --git a/src/lib/presets/vanilla.js b/src/lib/presets/vanilla.js index 997d5faf..973c0b30 100644 --- a/src/lib/presets/vanilla.js +++ b/src/lib/presets/vanilla.js @@ -4,6 +4,7 @@ import Item from '../Item.svelte'; import Selection from '../Selection.svelte'; import debounce from '../debounce'; import filter from '../filter'; +import getItems from '../getItems'; export default { theme: defaultStyles, @@ -11,5 +12,6 @@ export default { Item, Selection, debounce, - filter + filter, + getItems } \ No newline at end of file diff --git a/test/public/index.html b/test/public/index.html index f490f784..af60bad7 100644 --- a/test/public/index.html +++ b/test/public/index.html @@ -3,12 +3,12 @@ svelte-select tests - +

- + diff --git a/test/src/index.js b/test/src/tests.js similarity index 100% rename from test/src/index.js rename to test/src/tests.js From 515181a61172e208ade8016f09bfed9477550255 Mon Sep 17 00:00:00 2001 From: Nicola Ferendinos Date: Thu, 11 Nov 2021 09:31:10 +1100 Subject: [PATCH 300/635] adjust viewport bounding bottom check --- src/utils/isOutOfViewport.js | 2 +- test/src/index.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/isOutOfViewport.js b/src/utils/isOutOfViewport.js index f116d1c7..44c8dc18 100644 --- a/src/utils/isOutOfViewport.js +++ b/src/utils/isOutOfViewport.js @@ -5,7 +5,7 @@ export default function (elem) { out.top = bounding.top < 0; out.left = bounding.left < 0; out.bottom = - bounding.bottom > + bounding.bottom + bounding.height > (window.innerHeight || document.documentElement.clientHeight); out.right = bounding.right > diff --git a/test/src/index.js b/test/src/index.js index 4e04300c..fb9c70a2 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -483,10 +483,10 @@ test('when listPosition is set to top list should be above the input', async (t) select.$destroy(); }); -test('when listPosition is set to auto and at the bottom the list should be above the input', async (t) => { +test('when listPosition is set to auto and container at the bottom, the list should be above the input', async (t) => { const testTarget = document.createElement('div'); testTarget.style.position = 'fixed'; - testTarget.style.bottom = '0'; + testTarget.style.bottom = '100px'; testTarget.style.width = '100%'; document.body.appendChild(testTarget); const select = new Select({ From 49531d16826a7c4728ef02ec42f7fe9f2a3ac4a2 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 11 Nov 2021 10:29:34 +1100 Subject: [PATCH 301/635] 4.4.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9de639b..695e7566 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.4.3", + "version": "4.4.4", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A {/if} @@ -667,3 +658,14 @@ {/each} {/if}
+ +{#if listOpen} + +{/if} diff --git a/src/lib/clickOutside.js b/src/lib/clickOutside.js deleted file mode 100644 index 28ed6a94..00000000 --- a/src/lib/clickOutside.js +++ /dev/null @@ -1,17 +0,0 @@ -export default (node, parent) => { - function detect({ target }) { - if (!node.contains(target) && parent && !parent.contains(target)) { - node.dispatchEvent(new CustomEvent('clickOutside')); - } - } - - document.addEventListener('click', detect, { - passive: true, capture: true - }); - - return { - destroy() { - document.removeEventListener('click', detect); - }, - }; -}; diff --git a/src/lib/isOutOfViewport.js b/src/lib/isOutOfViewport.js deleted file mode 100644 index f116d1c7..00000000 --- a/src/lib/isOutOfViewport.js +++ /dev/null @@ -1,16 +0,0 @@ -export default function (elem) { - const bounding = elem.getBoundingClientRect(); - const out = {}; - - out.top = bounding.top < 0; - out.left = bounding.left < 0; - out.bottom = - bounding.bottom > - (window.innerHeight || document.documentElement.clientHeight); - out.right = - bounding.right > - (window.innerWidth || document.documentElement.clientWidth); - out.any = out.top || out.left || out.bottom || out.right; - - return out; -} diff --git a/src/lib/presets/vanilla.js b/src/lib/presets/vanilla.js index 973c0b30..e6f12da1 100644 --- a/src/lib/presets/vanilla.js +++ b/src/lib/presets/vanilla.js @@ -13,5 +13,5 @@ export default { Selection, debounce, filter, - getItems + getItems, } \ No newline at end of file diff --git a/src/routes/index.svelte b/src/routes/index.svelte index 46a9bf18..179014f6 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -15,9 +15,27 @@ // } // let value = null; -
- +
+ + diff --git a/test/src/tests.js b/test/src/tests.js index 80be9d11..95a278d3 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -3292,7 +3292,7 @@ test('when ClearItem replace clear icon', async (t) => { select.$destroy(); }); -test('clicking outside the Select should close and blur it', async (t) => { +test('losing focus of Select should close list', async (t) => { const select = new Select({ target, props: { @@ -3303,7 +3303,7 @@ test('clicking outside the Select should close and blur it', async (t) => { await querySelectorClick('.select-container'); t.ok(select.listOpen); - await querySelectorClick('#extra'); + document.querySelector('.select-container input').blur(); t.ok(!select.listOpen); select.$destroy(); @@ -3322,7 +3322,7 @@ test('clicking on an external textarea should close and blur it', async (t) => { await querySelectorClick('.select-container'); t.ok(select.listOpen); - await querySelectorClick('textarea'); + document.querySelector('textarea').focus(); t.ok(!select.listOpen); textarea.remove(); @@ -3482,7 +3482,7 @@ test('When listOffset is set list position offset changes', async (t) => { }); let elem = target.querySelector('.list'); - t.ok(elem.style.top === '42px'); + t.ok(elem.style.top === '50px'); select.$destroy(); }); From 730457eca34f93b308277a2d7a05bffc2ff98eaf Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 12 Nov 2021 09:46:59 +1100 Subject: [PATCH 304/635] added suggestions feature --- CHANGELOG.md | 2 +- src/lib/List.svelte | 9 ++- src/lib/Select.svelte | 14 ++++- src/routes/index.svelte | 28 +++++++++- test/src/tests.js | 120 +++++++++++++++++++++++++++++++++------- 5 files changed, 143 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b096a34..3f50b2a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## unreleased - +* Added suggestions feature * computePlacement now computes to fixed list * removed isOutOfViewport and clickOutside * new debounce method diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 68c87f55..971a6d46 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -23,7 +23,6 @@ export let listAutoWidth; export let listOffset; export let list = undefined; - export let hoverItemIndex = 0; export let activeItemIndex = 0; @@ -183,8 +182,8 @@ return (item.isGroupHeader && item.isSelectable) || item.selectable || !item.hasOwnProperty('selectable'); } - $: listStyle = computePlacement(parent, list); + let listStyle; function computePlacement() { if (!parent || !list) return; @@ -211,7 +210,11 @@ } } - return styles; + listStyle = styles; + } + + $: { + if (parent && list) computePlacement(); } diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 7249090a..8195feae 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -74,6 +74,7 @@ export let iconProps = {}; export let showChevron = false; export let listOffset = 5; + export let suggestions = null; export let ChevronIcon = null; export let ClearIcon = null; @@ -94,7 +95,7 @@ $: filteredItems = filter({ loadOptions, filterText, - items, + items: suggestionMode ? suggestions : items, isMulti, value, optionIdentifier, @@ -467,8 +468,10 @@ handleFocus(); } + let mounted; onMount(() => { if (isFocused && input) input.focus(); + mounted = true; }); $: listProps = { @@ -492,7 +495,14 @@ itemClass, }; + $: suggestionMode = suggestions && filterText.length === 0; + function itemSelected(event) { + if (suggestionMode) { + filterText = event.detail.value; + return; + } + const { detail } = event; if (detail) { @@ -659,7 +669,7 @@ {/if}
-{#if listOpen} +{#if mounted && listOpen}
- +
diff --git a/test/src/tests.js b/test/src/tests.js index 95a278d3..83748e93 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -1943,27 +1943,27 @@ test('when a custom Selection component is supplied then use to display selectio select.$destroy(); }); -// test.only('when loadOptions method is supplied, isMulti is true and filterText has length then items should populate via promise resolve', async (t) => { -// const select = new Select({ -// target, -// props: { -// config: { ...config, Item: CustomItem}, -// getOptionLabel: (option) => option.name, -// getSelectionLabel: (option) => option.name, -// loadOptions: getPosts, -// optionIdentifier: 'id', -// isMulti: true -// } -// }); - -// // await wait(0); -// // await handleSet(select, {filterText: 'Juniper'}); -// // await wait(600); -// // await handleKeyboard('ArrowDown', select.input); -// // await handleKeyboard('Enter', select.input); -// // t.ok(document.querySelector('.multiSelectItem_label').innerHTML === 'Juniper Wheat Beer'); -// // select.$destroy(); -// }); +test('when loadOptions method is supplied, isMulti is true and filterText has length then items should populate via promise resolve', async (t) => { + const select = new Select({ + target, + props: { + config: { ...config, Item: CustomItem, Multi}, + getOptionLabel: (option) => option.name, + getSelectionLabel: (option) => option.name, + loadOptions: getPosts, + optionIdentifier: 'id', + isMulti: true + } + }); + + await wait(0); + await handleSet(select, {filterText: 'Juniper'}); + await wait(600); + await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('Enter'); + t.ok(document.querySelector('.multiSelectItem_label').innerHTML === 'Juniper Wheat Beer'); + select.$destroy(); +}); test('when getSelectionLabel contains HTML then render the HTML', async (t) => { const select = new Select({ @@ -3920,3 +3920,81 @@ test('allows the user to select an item by clicking with a focusable ancestor', select.$destroy(); }); + +test('when listOpen true on page load then list should show onMount', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + listOpen: true, + }, + }); + + let list = document.querySelector('.list'); + + t.ok(list); + + select.$destroy(); +}); + +test('when listOpen true on page load then list should show onMount', async (t) => { + const select = new Select({ + target, + props: { + config, + items, + listOpen: true, + }, + }); + + let list = document.querySelector('.list'); + + t.ok(list); + + select.$destroy(); +}); + + +test('when suggestions and no filterText then list should show suggestions', async (t) => { + const select = new Select({ + target, + props: { + config, + loadOptions: () => { + return Promise.resolve(['foo']) + }, + listOpen: true, + suggestions: ['one', 'two', 'three'], + }, + }); + + let item = document.querySelector('.item'); + t.equal(item.innerHTML, 'one'); + + select.$destroy(); +}); + +test('when suggestions items is selected, list should stay open and filterText show become suggestion and loadOptions should run', async (t) => { + const select = new Select({ + target, + props: { + config, + loadOptions: () => { + return Promise.resolve(['foo']) + }, + listOpen: true, + suggestions: ['one', 'two', 'three'], + }, + }); + + let item = document.querySelector('.item'); + t.equal(item.innerHTML, 'one'); + item.click(); + t.equal(select.filterText, 'one'); + await wait(0); + item = document.querySelector('.item'); + t.equal(item.innerHTML, 'foo'); + + select.$destroy(); +}); From 4295bf310b9bf5aa20faf61be1ccec6bf6a038f5 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 12 Nov 2021 10:03:01 +1100 Subject: [PATCH 305/635] #290 fix for VirtualList no options --- src/lib/List.svelte | 97 ++++++++++++++++++++++----------------------- test/src/tests.js | 26 ++++++++++++ 2 files changed, 74 insertions(+), 49 deletions(-) diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 971a6d46..789572e7 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -182,7 +182,6 @@ return (item.isGroupHeader && item.isSelectable) || item.selectable || !item.hasOwnProperty('selectable'); } - let listStyle; function computePlacement() { if (!parent || !list) return; @@ -221,63 +220,63 @@
- {#if VirtualList} - -
handleHover(index)} - on:focus={() => handleHover(index)} - on:click={(event) => handleClick({ item: items[index], i: index, event })} - class="list-item" - tabindex="-1"> - -
-
- {:else} - {#each items as item, i} - {#if item.isGroupHeader && !item.isSelectable} -
{getGroupHeaderLabel(item)}
- {:else} + {#if items.length > 0} + {#if VirtualList} +
handleHover(i)} - on:focus={() => handleHover(i)} - on:click={(event) => handleClick({ item, i, event })} + slot="item" + let:index + let:style + {style} + on:mouseover={() => handleHover(index)} + on:focus={() => handleHover(index)} + on:click={(event) => handleClick({ item: items[index], i: index, event })} class="list-item" tabindex="-1"> + isFirst={isItemFirst(index)} + isActive={isItemActive(items[index], value, optionIdentifier)} + isHover={isItemHover(hoverItemIndex, items[index], index, items)} + isSelectable={isItemSelectable(items[index])} />
- {/if} +
{:else} - {#if !hideEmptyState} -
{noOptionsMessage}
- {/if} - {/each} + {#each items as item, i} + {#if item.isGroupHeader && !item.isSelectable} +
{getGroupHeaderLabel(item)}
+ {:else} +
handleHover(i)} + on:focus={() => handleHover(i)} + on:click={(event) => handleClick({ item, i, event })} + class="list-item" + tabindex="-1"> + +
+ {/if} + {/each} + {/if} + {:else if !hideEmptyState} +
{noOptionsMessage}
{/if}
diff --git a/test/src/tests.js b/test/src/tests.js index 83748e93..17762441 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -3998,3 +3998,29 @@ test('when suggestions items is selected, list should stay open and filterText s select.$destroy(); }); + +test('when VirtualList and no results then show noOptionsMessage', async (t) => { + function fill(len, fn) { + return Array(len).fill().map((_, i) => fn(i)); + } + + const items = fill(10000, (i) => { + const name = getName(); + return name + }); + + const select = new Select({ + target, + props: { + config: { ...config, VirtualList }, + items, + listOpen: true, + filterText: 'zzzzz' + } + }); + + await wait(0); + t.ok(document.querySelector('.empty')); + + select.$destroy(); +}); From 2c12ee10fe352a48d523b68d13df77363c41b04d Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 12 Nov 2021 10:41:03 +1100 Subject: [PATCH 306/635] #319 setting just value fix for showing correct label --- src/lib/Select.svelte | 3 ++- test/src/tests.js | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 8195feae..4567519e 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -121,7 +121,8 @@ function setValue() { if (typeof value === 'string') { - value = { + let item = items.find((item) => item[optionIdentifier] === value); + value = item || { [optionIdentifier]: value, label: value, }; diff --git a/test/src/tests.js b/test/src/tests.js index 17762441..aac686d4 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -4024,3 +4024,20 @@ test('when VirtualList and no results then show noOptionsMessage', async (t) => select.$destroy(); }); + + +test('when value is set check from item and show correct label', async (t) => { + const select = new Select({ + target, + props: { + config: { ...config }, + items, + listOpen: true, + + } + }); + + select.value = 'cake'; + t.equal(select.value.label, 'Cake'); + select.$destroy(); +}); \ No newline at end of file From 3ed3c205b77b66919e29f30c90730f3b6304beb2 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 12 Nov 2021 11:00:30 +1100 Subject: [PATCH 307/635] #325 config renamed to imports & ChevronIcon moved to imports --- CHANGELOG.md | 2 + src/lib/Select.svelte | 5 +- src/routes/index.svelte | 4 +- test/src/Select/ParentContainer.svelte | 4 +- test/src/tests.js | 399 +++++++++++++------------ 5 files changed, 216 insertions(+), 198 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f50b2a1..bfbe716b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## unreleased +* renamed 'config' to 'imports' +* ChevronIcon moved to config, * Added suggestions feature * computePlacement now computes to fixed list * removed isOutOfViewport and clickOutside diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 4567519e..059e4edc 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -1,9 +1,9 @@
-
diff --git a/test/src/Select/ParentContainer.svelte b/test/src/Select/ParentContainer.svelte index 77fa5863..35f47216 100644 --- a/test/src/Select/ParentContainer.svelte +++ b/test/src/Select/ParentContainer.svelte @@ -3,11 +3,11 @@ export let value; export let items; - export let config; + export let imports;
- +

{value.label}

diff --git a/test/src/tests.js b/test/src/tests.js index aac686d4..e4365edd 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -12,7 +12,7 @@ import {assert, test} from 'tape-modern'; import VirtualList from 'svelte-tiny-virtual-list'; import getName from '../utils/nameGen'; -import config from '../../src/lib/presets/vanilla'; +import imports from '../../src/lib/presets/vanilla'; import "../../src/lib/default.css"; // import "../../src/lib/tailwind.css"; @@ -167,7 +167,7 @@ test('with no data creates default elements', async (t) => { const select = new Select({ target, props: { - config + imports } }); @@ -181,7 +181,7 @@ test('when isFocused true container adds focused class', async (t) => { const select = new Select({ target, props: { - config, + imports, isFocused: true } }); @@ -195,7 +195,7 @@ test('when isFocused changes to true input should focus', async (t) => { const select = new Select({ target, props: { - config, + imports, isFocused: false } }); @@ -213,7 +213,7 @@ test('default empty list', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true } }); @@ -227,7 +227,7 @@ test('default list with five items', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithIndex } @@ -242,7 +242,7 @@ test('should highlight active list item', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithIndex, value: {value: 'pizza', label: 'Pizza', index: 1} @@ -264,7 +264,7 @@ test('list scrolls to active item', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithIndex.concat(extras), value: {value: 'sunday-roast', label: 'Sunday Roast'}, @@ -292,7 +292,7 @@ test('list scrolls to hovered item when navigating with keys', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithIndex.concat(extras) } @@ -323,7 +323,7 @@ test('hover item updates on keyUp or keyDown', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: items } @@ -339,7 +339,7 @@ test('on enter active item fires a itemSelected event', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithIndex } @@ -363,7 +363,7 @@ test('on tab active item fires a itemSelected event', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithIndex } @@ -386,7 +386,7 @@ test('on selected of current active item does not fire a itemSelected event', as const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithIndex, value: { value: 'chocolate', label: 'Chocolate', index: 0 } @@ -409,7 +409,7 @@ test('selected item\'s default view', async (t) => { const select = new Select({ target, props: { - config, + imports, value: {value: 'chips', label: 'Chips'}, } }); @@ -422,7 +422,7 @@ test('select view updates with value updates', async (t) => { const select = new Select({ target, props: { - config + imports } }); @@ -436,7 +436,7 @@ test('clear wipes value and updates view', async (t) => { const select = new Select({ target, props: { - config, + imports, value: {value: 'chips', label: 'Chips'}, } }); @@ -452,7 +452,7 @@ test('clicking on Select opens List', async (t) => { const select = new Select({ target, props: { - config, + imports, } }); @@ -467,7 +467,7 @@ test('Select opens List populated with items', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -482,7 +482,7 @@ test('List starts with first item in hover state', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -497,7 +497,7 @@ test('select item from list', async (t) => { const select = new Select({ target, props: { - config, + imports, items, } }); @@ -515,7 +515,7 @@ test('when listPosition is set to top list should be above the input', async (t) const select = new Select({ target, props: { - config, + imports, items, listOpen: true, listPlacement: 'top' @@ -534,7 +534,7 @@ test('when listPlacement is set to bottom the list should be below the input', a const select = new Select({ target, props: { - config, + imports, items, listOpen: true, listPlacement: 'bottom' @@ -557,7 +557,7 @@ test('blur should close list and remove focus from select', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -574,7 +574,7 @@ test('selecting item should close list but keep focus on select', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -592,7 +592,7 @@ test('clicking Select with selected item should open list with item listed as ac const select = new Select({ target, props: { - config, + imports, items } }); @@ -613,7 +613,7 @@ test('focus on Select input updates focus state', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -628,7 +628,7 @@ test('key up and down when Select focused opens list', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -648,7 +648,7 @@ test('List should keep width of parent Select', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isFocused: true } @@ -672,7 +672,7 @@ test('Placeholder text should reappear when List is closed', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -690,7 +690,7 @@ test('typing in Select filter will hide selected Item', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -709,7 +709,7 @@ test('clearing selected item closes List if open', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -734,7 +734,7 @@ test('closing List clears Select filter text', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -757,7 +757,7 @@ test('closing List clears Select filter text', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -780,7 +780,7 @@ test('closing List item clears Select filter text', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -800,7 +800,7 @@ test('typing while Select is focused populates Select filter text', async (t) => const select = new Select({ target, props: { - config, + imports, items } }); @@ -820,7 +820,7 @@ test('Select input placeholder wipes while item is selected', async (t) => { const select = new Select({ target, props: { - config, + imports, items, value: {name: 'Item #2'}, } @@ -836,7 +836,7 @@ test('Select listOpen state controls List', async (t) => { const select = new Select({ target, props: { - config, + imports, items, listOpen: true } @@ -854,7 +854,7 @@ test('clicking Select toggles List open state', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -872,7 +872,7 @@ test('Select filter text filters list', async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -888,7 +888,7 @@ test('Select filter text filters list with itemFilter', async (t) => { const select = new Select({ target, props: { - config, + imports, items, itemFilter: (label, filterText, option) => label === 'Ice Cream' } @@ -905,7 +905,7 @@ test('Typing in the Select filter opens List', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isFocused: true } @@ -920,7 +920,7 @@ test('While filtering, the first item in List should receive hover class', async const select = new Select({ target, props: { - config, + imports, items, isFocused: true } @@ -936,7 +936,7 @@ test('Select container styles can be overridden', async (t) => { const select = new Select({ target, props: { - config, + imports, items, value: {name: 'Item #2'}, containerStyles: `padding-left: 40px;` @@ -951,7 +951,7 @@ test('Select can be disabled', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isDisabled: true, } @@ -966,7 +966,7 @@ test('Select List closes when you click enter', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isFocused: true } @@ -984,7 +984,7 @@ test('tabbing should move between tabIndexes and others Selects', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isFocused: false } @@ -993,7 +993,7 @@ test('tabbing should move between tabIndexes and others Selects', async (t) => { const other = new Select({ target: extraTarget, props: { - config, + imports, items, isFocused: false } @@ -1010,7 +1010,7 @@ test(`shouldn't be able to clear a disabled Select`, async (t) => { const select = new Select({ target, props: { - config, + imports, items, isDisabled: true, value: {name: 'Item #4'} @@ -1027,7 +1027,7 @@ test(`two way binding between Select and it's parent component`, async (t) => { const parent = new ParentContainer({ target, props: { - config, + imports, items, value: {value: 'chips', label: 'Chips'}, } @@ -1058,7 +1058,7 @@ test(`show ellipsis for overflowing text in a List item`, async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: [ { @@ -1090,7 +1090,7 @@ test('focusing in an external textarea should close and blur it', async (t) => { const select = new Select({ target, props: { - config, + imports, items, } @@ -1111,7 +1111,7 @@ test('clicking between Selects should close and blur other Select', async (t) => const select = new Select({ target, props: { - config, + imports, items, isFocused: false } @@ -1120,7 +1120,7 @@ test('clicking between Selects should close and blur other Select', async (t) => const other = new Select({ target: extraTarget, props: { - config, + imports, items, isFocused: false } @@ -1146,7 +1146,7 @@ test('if only one item in list it should have hover state', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: [{ index: 0, @@ -1164,7 +1164,7 @@ test(`hovered item in a filtered list shows hover state`, async (t) => { const select = new Select({ target, props: { - config, + imports, items } }); @@ -1183,7 +1183,7 @@ test(`data shouldn't be stripped from item - currently only saves name`, async ( const select = new Select({ target, props: { - config, + imports, items } }); @@ -1199,7 +1199,7 @@ test('should not be able to clear when clearing is disabled', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isClearable: false } @@ -1218,7 +1218,7 @@ test('should not be able to search when searching is disabled', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isSearchable: false } @@ -1239,7 +1239,7 @@ test('placeholder should be prop value', async (t) => { const select = new Select({ target, props: { - config, + imports, items: itemsWithGroup, placeholder } @@ -1258,7 +1258,7 @@ test('should display loading icon when waiting is enabled', async (t) => { const select = new Select({ target, props: { - config, + imports, LoadingIcon, items, isWaiting: true @@ -1274,7 +1274,7 @@ test('inputStyles prop applies css to select input', async (t) => { const select = new Select({ target, props: { - config, + imports, items, value: {value: 'pizza', label: 'Pizza'}, inputStyles: `padding-left: 40px;` @@ -1289,7 +1289,7 @@ test('items should be grouped by groupBy expression', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithGroup, groupBy @@ -1312,7 +1312,7 @@ test('clicking group header should not make a selected', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1331,7 +1331,7 @@ test('clicking an item with selectable: false should not make a selected', async const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithSelectable } @@ -1351,7 +1351,7 @@ test('clicking an item with selectable not specified should make a selected', as const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithSelectable } @@ -1370,7 +1370,7 @@ test('clicking an item with selectable: true should make a selected', async (t) const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithSelectable } @@ -1386,7 +1386,7 @@ test('when groupBy, no active item and keydown enter is fired then list should c const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1405,7 +1405,7 @@ test('when isGroupHeaderSelectable clicking group header should select createGro const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithGroup, isGroupHeaderSelectable: true, @@ -1443,7 +1443,7 @@ test('group headers label should be created by getGroupHeaderLabel(item)', async const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithGroup, groupBy, @@ -1472,7 +1472,7 @@ test('groups should be sorted by expression', async (t) => { const select = new Select({ target, props: { - config, + imports, listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group, @@ -1492,7 +1492,7 @@ test('when isMulti is true show each item in value', async (t) => { const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [ @@ -1513,7 +1513,7 @@ test('when isMulti is true and value is undefined show placeholder text', async const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: undefined @@ -1529,7 +1529,7 @@ test('when isMulti is true clicking item in List will populate value', async (t) const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: undefined @@ -1548,7 +1548,7 @@ test('when isMulti is true items in value will not appear in List', async (t) => const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1571,7 +1571,7 @@ test('when isMulti is true both value and filterText filters List', async (t) => const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, listOpen: true, isMulti: true, items, @@ -1592,7 +1592,7 @@ test('when isMulti is true clicking X on a selected item will remove it from val const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] @@ -1609,7 +1609,7 @@ test('when isMulti is true and all selected items have been removed then placeho const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1625,7 +1625,7 @@ test('when isMulti is true and items are selected then clear all should wipe all const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] @@ -1642,7 +1642,7 @@ test('when isMulti and groupBy is active then items should be selectable', async const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1661,7 +1661,7 @@ test('when isMulti and selected items reach edge of container then Select height const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items } @@ -1678,7 +1678,7 @@ test('when isMulti and value is populated then navigating with LeftArrow updates const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], @@ -1701,7 +1701,7 @@ test('when isMulti and value is populated then navigating with ArrowRight update const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], @@ -1723,7 +1723,7 @@ test('when isMulti and value has items and list opens then first item in list sh const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, isFocused: true @@ -1744,7 +1744,7 @@ test('when isMulti, isDisabled, and value has items then items should be locked' const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, isDisabled: true, @@ -1761,7 +1761,7 @@ test('when isMulti is true show each item in value if simple arrays are used', a const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items: ['pizza', 'chips', 'chocolate'], value: ['pizza', 'chocolate'] @@ -1780,7 +1780,7 @@ test('when labelIdentifier is set you can pass a string and see the right label' const select = new Select({ target, props: { - config, + imports, items: [{id: 0, name: 'ONE'}, {id: 1, name: 'TWO'}], value: {id: 0, name: 'ONE'}, optionIdentifier: 'id', @@ -1798,7 +1798,7 @@ test('when getValue method is set should use that key to update value', async (t const select = new Select({ target, props: { - config, + imports, items: [{id: 0, label: 'ONE'}, {id: 1, label: 'TWO'}], value: {id: 0, label: 'ONE'}, optionIdentifier: 'id' @@ -1818,7 +1818,7 @@ test('when loadOptions method is supplied and filterText has length then items s const select = new Select({ target, props: { - config: { ...config, Item: CustomItem, Selection: CustomItem }, + imports: { ...imports, Item: CustomItem, Selection: CustomItem }, getOptionLabel: (option) => option.name, loadOptions: getPosts, optionIdentifier: 'id', @@ -1838,7 +1838,7 @@ test('when noOptionsMessage is set and there are no items then show message', as const select = new Select({ target, props: { - config, + imports, noOptionsMessage: 'SO SO SO SCANDALOUS', listOpen: true } @@ -1853,7 +1853,7 @@ test('when getSelectionLabel method is supplied and value are no items then disp const select = new Select({ target, props: { - config, + imports, getSelectionLabel: (option) => option.notLabel, value: {notLabel: 'This is not a label', value: 'not important'}, } @@ -1869,7 +1869,7 @@ test('when getOptionLabel method and items is supplied then display result of ge const select = new Select({ target, props: { - config, + imports, getOptionLabel: (option) => option.notLabel, isFocused: true, items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], @@ -1886,7 +1886,7 @@ test('when getOptionLabel method and items is supplied then display result of ge const select = new Select({ target, props: { - config, + imports, getOptionLabel: (option) => option.notLabel, isFocused: true, items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], @@ -1904,7 +1904,7 @@ test('when a custom Item component is supplied then use to display each item', a const select = new Select({ target, props: { - config: { ...config, Item: CustomItem}, + imports: { ...imports, Item: CustomItem}, getOptionLabel: (option) => option.name, isFocused: true, items: [{ @@ -1923,7 +1923,7 @@ test('when a custom Selection component is supplied then use to display selectio const select = new Select({ target, props: { - config: { ...config, + imports: { ...imports, Item: CustomItem, Selection: CustomItem }, @@ -1947,7 +1947,7 @@ test('when loadOptions method is supplied, isMulti is true and filterText has le const select = new Select({ target, props: { - config: { ...config, Item: CustomItem, Multi}, + imports: { ...imports, Item: CustomItem, Multi}, getOptionLabel: (option) => option.name, getSelectionLabel: (option) => option.name, loadOptions: getPosts, @@ -1969,7 +1969,7 @@ test('when getSelectionLabel contains HTML then render the HTML', async (t) => { const select = new Select({ target, props: { - config, + imports, value: items[0], getSelectionLabel: (option) => `

${option.label}

`, } @@ -1984,7 +1984,7 @@ test('when getOptionLabel contains HTML then render the HTML', async (t) => { const select = new Select({ target, props: { - config, + imports, items, getOptionLabel: (option) => `

${option.label}

`, isFocused: true @@ -2001,7 +2001,7 @@ test('when isMulti is true, value populated and arrowLeft is pressed then no ite const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [ @@ -2022,7 +2022,7 @@ test('when hideEmptyState true then do not show "no options" div ', async (t) => const select = new Select({ target, props: { - config, + imports, items, listOpen: true, filterText: 'x', @@ -2041,7 +2041,7 @@ test('when value changes then select event should fire', async (t) => { const select = new Select({ target, props: { - config, + imports, items, } }); @@ -2065,7 +2065,7 @@ test('when value is cleared the clear event is fired', async (t) => { const select = new Select({ target, props: { - config, + imports, items, value: items[0], } @@ -2088,7 +2088,7 @@ test('when multi item is cleared the clear event is fired with removed item', as const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [itemToRemove] @@ -2111,7 +2111,7 @@ test('when items in list filter or update then first item in list should highlig const select = new Select({ target, props: { - config, + imports, items, isFocused: true } @@ -2132,7 +2132,7 @@ test('when item is selected or state changes then check value[optionIdentifier] const select = new Select({ target, props: { - config, + imports, items, value: {value: 'cake', label: 'Cake'} } @@ -2154,7 +2154,7 @@ test('when isMulti and item is selected or state changes then check value[option const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [ @@ -2183,7 +2183,7 @@ test('when isFocused turns to false then check Select is no longer in focus', as const select = new Select({ target, props: { - config, + imports, isFocused: true, items, } @@ -2192,7 +2192,7 @@ test('when isFocused turns to false then check Select is no longer in focus', as const selectSecond = new Select({ target: extraTarget, props: { - config, + imports, isFocused: false, items, } @@ -2228,7 +2228,7 @@ test('when items and loadOptions method are both supplied then fallback to items const select = new Select({ target, props: { - config, + imports, getOptionLabel: (option) => option.name, getSelectionLabel: (option) => option.name, loadOptions: getPosts, @@ -2254,7 +2254,7 @@ test('when items is just an array of strings then render list', async (t) => { const select = new Select({ target, props: { - config, + imports, items, listOpen: true } @@ -2272,7 +2272,7 @@ test('when items are just strings then value should render', async (t) => { const select = new Select({ target, props: { - config, + imports, items, value: {value: 'one', label: 'one', index: 0} } @@ -2295,7 +2295,7 @@ test('when VirtualList then render list', async (t) => { const select = new Select({ target, props: { - config: { ...config, VirtualList }, + imports: { ...imports, VirtualList }, items, listOpen: true } @@ -2311,7 +2311,7 @@ test('when isMulti and value has items then check each item is unique', async (t const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [ @@ -2331,7 +2331,7 @@ test('when isMulti and textFilter has length then enter should select item', asy const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, isFocused: true, @@ -2351,7 +2351,7 @@ test('when isMulti and textFilter has length and no items in list then enter sho const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, isFocused: true, @@ -2370,7 +2370,7 @@ test('When isMulti and no selected item then delete should do nothing', async (t const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, isFocused: true, @@ -2389,7 +2389,7 @@ test('When list is open, filterText applied and Enter/Tab key pressed should sel const select = new Select({ target, props: { - config, + imports, listOpen: true, isFocused: true, filterText: 'A5', @@ -2412,7 +2412,7 @@ test('When inputAttributes is supplied each attribute is placed on the Select in const select = new Select({ target, props: { - config, + imports, items, inputAttributes: { id: 'testId', @@ -2433,7 +2433,7 @@ test('when items and value supplied as just strings then value should render cor const select = new Select({ target, props: { - config, + imports, items: ['Pizza', 'Chocolate', 'Crisps'], value: 'Pizza' } @@ -2448,7 +2448,7 @@ test('when isMulti with items and value supplied as just strings then value shou const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items: ['Pizza', 'Chocolate', 'Crisps'], value: ['Pizza'] @@ -2472,7 +2472,7 @@ test('when isMulti, groupBy and value are supplied then list should be filtered' const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items: _items, groupBy: (item) => item.group, @@ -2495,7 +2495,7 @@ test('When isCreatable disabled, creator is not displayed', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isFocused: true, listOpen: true @@ -2523,7 +2523,7 @@ test('When isCreatable enabled, creator displays getOptionLabel for isCreator', const select = new Select({ target, props: { - config, + imports, items, isCreatable: true, isFocused: true, @@ -2551,7 +2551,7 @@ test('When isCreatable enabled, creator is not displayed when duplicate item val const select = new Select({ target, props: { - config, + imports, items: [item], isCreatable: true, listOpen: true @@ -2574,7 +2574,7 @@ test('When creator selected, selected item is set to created item', async (t) => const select = new Select({ target, props: { - config, + imports, items, isCreatable: true, isFocused: true, @@ -2600,7 +2600,7 @@ test('When creator is selected, created item it added to multi selection', async const select = new Select({ target, props: { - config, + imports, items, isCreatable: true, isFocused: true, @@ -2628,7 +2628,7 @@ test('When creator is selected multiple times, items are all added to multi sele const select = new Select({ target, props: { - config, + imports, items, isCreatable: true, isFocused: true, @@ -2657,7 +2657,7 @@ test('When isMulti and an items remove icon is clicked then item should be remov const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, items, isCreatable: true, value: [ @@ -2696,7 +2696,7 @@ test('When isCreatable with non-default item structure, item creator displays ge const select = new Select({ target, props: { - config, + imports, optionIdentifier: 'food', getOptionLabel: itemDisplay, getSelectionLabel: itemDisplay, @@ -2730,7 +2730,7 @@ test('When isCreatable and isMulti and optionIdentifier is supplied creator disp const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, optionIdentifier: 'foo', isMulti: true, items: _items, @@ -2767,7 +2767,7 @@ test('When isCreatable and isMulti and optionIdentifier is supplied multiple cre const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, optionIdentifier, isMulti: true, items: _items, @@ -2807,7 +2807,7 @@ test('When isCreatable and item is created then createItem method should only ru const select = new Select({ target, props: { - config, + imports, isCreatable: true, items, createItem @@ -2828,7 +2828,7 @@ test('When items are collection and value a string then lookup item using option const select = new Select({ target, props: { - config, + imports, items, value: 'cake' } @@ -2846,7 +2846,7 @@ test('When listAutoWidth is set to false list container should have style of wid const select = new Select({ target, props: { - config, + imports, items, listAutoWidth: false, listOpen: true @@ -2864,7 +2864,7 @@ test('When item is already active and is selected from list then close list', as const select = new Select({ target, props: { - config, + imports, items, listOpen: true, value: 'pizza' @@ -2883,7 +2883,7 @@ test('When Icon prop is supplied then render on Select', async (t) => { const select = new Select({ target, props: { - config, + imports, items, Icon: TestIcon } @@ -2898,7 +2898,7 @@ test('When showChevron prop is true only show chevron when there is no value on const select = new Select({ target, props: { - config, + imports, items, value: {value: 'chocolate', label: 'Chocolate'}, showChevron: true @@ -2914,8 +2914,7 @@ test('When showChevron prop is true and no value show chevron on Select', async const select = new Select({ target, props: { - config, - ChevronIcon, + imports: {...imports, ChevronIcon}, items, showChevron: true } @@ -2930,8 +2929,7 @@ test('When showChevron and isClearable is true always show chevron on Select', a const select = new Select({ target, props: { - config, - ChevronIcon, + imports: {...imports, ChevronIcon}, items, value: {value: 'chocolate', label: 'Chocolate'}, showChevron: true, @@ -2948,7 +2946,7 @@ test('When items and loadItems then listOpen should be false', async (t) => { const select = new Select({ target, props: { - config, + imports, getSelectionLabel: (option) => option.name, getOptionLabel: (option) => option.name, loadOptions: getPosts, @@ -2970,7 +2968,7 @@ test('Select container classes can be injected', async (t) => { const select = new Select({ target, props: { - config, + imports, items, value: {value: 'cake', label: 'Cake'}, class: 'select-container testclass', @@ -2988,7 +2986,7 @@ test('When noOptionsMessage is changed after List component has been created the const select = new Select({ target, props: { - config, + imports, getOptionLabel: (option) => option.name, loadOptions: getPosts, optionIdentifier: 'id', @@ -3018,7 +3016,7 @@ test('When loadOptions promise is resolved then dispatch loaded', async (t) => { const select = new Select({ target, props: { - config, + imports, loadOptions: resolvePromise, }, }); @@ -3050,7 +3048,7 @@ test('When loadOptions promise is rejected then dispatch error', async (t) => { const select = new Select({ target, props: { - config, + imports, loadOptions: rejectPromise, }, }); @@ -3082,7 +3080,7 @@ test('When items change then value should also update', async (t) => { const select = new Select({ target, props: { - config, + imports, items, value: {value: 'chips', label: 'Chips'}, }, @@ -3110,7 +3108,7 @@ test('When items change then value should also update', async (t) => { const multiSelect = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], @@ -3139,7 +3137,7 @@ test('When items change then value should also update but only if found in items const select = new Select({ target, props: { - config, + imports, items, value: {value: 'chips', label: 'Chips'}, }, @@ -3167,7 +3165,7 @@ test('When isMulti and multiFullItemClearable then clicking anywhere on the item const multiSelect = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, multiFullItemClearable: true, @@ -3187,7 +3185,7 @@ test('When isMulti and filterText then items should filter out already selected const multiSelect = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items, value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], @@ -3212,7 +3210,7 @@ test('when loadOptions and items is supplied then list should close on blur', as const select = new Select({ target, props: { - config, + imports, items, loadOptions, } @@ -3233,7 +3231,7 @@ test('when isCreatable and item created then event "itemCreated" should dispatch const select = new Select({ target, props: { - config, + imports, items, isCreatable: true, isFocused: true, @@ -3264,7 +3262,7 @@ test('when loadOptions response returns cancelled true then dont end loading sta const select = new Select({ target, props: { - config, + imports, loadOptions: getCancelledRes, } }); @@ -3280,7 +3278,7 @@ test('when ClearItem replace clear icon', async (t) => { const select = new Select({ target, props: { - config, + imports, items, ClearIcon: TestClearIcon, value: {value: 'chips', label: 'Chips'} @@ -3296,7 +3294,7 @@ test('losing focus of Select should close list', async (t) => { const select = new Select({ target, props: { - config, + imports, items, } }); @@ -3315,7 +3313,7 @@ test('clicking on an external textarea should close and blur it', async (t) => { const select = new Select({ target, props: { - config, + imports, items, } }); @@ -3333,7 +3331,7 @@ test('when switching between isMulti true/false ensure Select continues working' const select = new Select({ target, props: { - config, + imports, items, listOpen: true, value: {value: 'chips', label: 'Chips'} @@ -3359,7 +3357,7 @@ test('when isSearchable is false then input should be readonly', async (t) => { const select = new Select({ target, props: { - config, + imports, items, isSearchable: false } @@ -3376,7 +3374,7 @@ test('when esc key pressed should close list', async (t) => { const select = new Select({ target, props: { - config, + imports, items, listOpen: true } @@ -3395,7 +3393,7 @@ test('when isMulti and placeholderAlwaysShow then always show placeholder text', const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'},], @@ -3425,7 +3423,7 @@ test('when loadOptions and value then items should show on promise resolve',asyn const select = new Select({ target, props: { - config, + imports, value: { value: 'chocolate', label: 'Chocolate' }, @@ -3453,7 +3451,7 @@ test('when loadOptions, isMulti and value then filterText should remain on promi const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, value: { value: 'chocolate', label: 'Chocolate' @@ -3474,7 +3472,7 @@ test('When listOffset is set list position offset changes', async (t) => { const select = new Select({ target, props: { - config, + imports, items, listOffset: 0, listOpen: true @@ -3491,7 +3489,7 @@ test('When items are updated post onMount ensure filtering still works', async ( const select = new Select({ target, props: { - config, + imports, items: null }, }); @@ -3512,7 +3510,7 @@ test('When grouped items are updated post onMount ensure filtering still works', const select = new Select({ target, props: { - config, + imports, groupBy: item => item.group }, }); @@ -3536,7 +3534,7 @@ test('When groupBy and value selected ensure filtering still works', async (t) = const select = new Select({ target, props: { - config, + imports, items: itemsWithGroup, groupBy: (item) => item.group, @@ -3555,7 +3553,7 @@ test('When value selected and filterText then ensure selecting the active value const select = new Select({ target, props: { - config, + imports, items, }, }); @@ -3577,7 +3575,7 @@ test('When groupBy, optionIdentifier and labelIdentifier then ensure list displa const select = new Select({ target, props: { - config, + imports, items: itemsWithGroupIds, optionIdentifier: '_id', labelIdentifier: 'name', @@ -3601,7 +3599,7 @@ test('When groupBy, optionIdentifier, labelIdentifier and createGroupHeaderItem const select = new Select({ target, props: { - config, + imports, items: itemsWithGroupIds, optionIdentifier: '_id', labelIdentifier: 'name', @@ -3631,7 +3629,7 @@ test('When isMulti on:select events should fire on each item removal (including const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, items, isMulti: true, value: ['Cake', 'Chips'] @@ -3658,7 +3656,7 @@ test('When loadOptions and isCreatable then create new item is active when promi const select = new Select({ target, props: { - config, + imports, loadOptions: itemsPromiseEmpty, isCreatable: true, }, @@ -3676,7 +3674,7 @@ test('When loadOptions and isCreatable then create new item show at bottom of re const select = new Select({ target, props: { - config, + imports, loadOptions: itemsPromise, isCreatable: true, }, @@ -3695,7 +3693,7 @@ test('When inputAttributes.name supplied, add to hidden input', async (t) => { const select = new Select({ target, props: { - config, + imports, inputAttributes: { name: 'Foods' }, items: items, showChevron: true, @@ -3712,7 +3710,7 @@ test('When no value then hidden field should also have no value', async (t) => { const select = new Select({ target, props: { - config, + imports, inputAttributes: { name: 'Foods' }, items: items, @@ -3729,7 +3727,7 @@ test('When value then hidden field should have value.label', async (t) => { const select = new Select({ target, props: { - config, + imports, items: items, value: {value: 'cake', label: 'Cake'}, }, @@ -3745,7 +3743,7 @@ test('When isMulti and no value then hidden field should no value', async (t) => const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items: items, }, @@ -3761,7 +3759,7 @@ test('When isMulti and value then hidden fields should list value items', async const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items: items, value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},] @@ -3780,7 +3778,7 @@ test('When listOpen then aria-context describes highlighted item', async (t) => const select = new Select({ target, props: { - config, + imports, items: items, listOpen: true }, @@ -3798,7 +3796,7 @@ test('When listOpen and value then aria-selection describes value', async (t) => const select = new Select({ target, props: { - config, + imports, items: items, value: {value: 'cake', label: 'Cake'}, isFocused: true @@ -3815,7 +3813,7 @@ test('When listOpen, value and isMulti then aria-selection describes value', asy const select = new Select({ target, props: { - config: {...config, Multi}, + imports: {...imports, Multi}, isMulti: true, items: items, value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},], @@ -3834,7 +3832,7 @@ test('When ariaValues and value supplied, then aria-selection uses default updat const select = new Select({ target, props: { - config, + imports, items: items, value: {value: 'pizza', label: 'Pizza'}, isFocused: true, @@ -3852,7 +3850,7 @@ test('When ariaListOpen, listOpen, then aria-context uses default updated', asyn const select = new Select({ target, props: { - config, + imports, items: items, listOpen: true, ariaListOpen: (label, count) => `label: ${label}, count: ${count}` @@ -3869,7 +3867,7 @@ test('When ariaFocused, focused value supplied, then aria-context uses default u const select = new Select({ target, props: { - config, + imports, items: items, isFocused: true, ariaFocused: () => `nothing to see here.` @@ -3887,7 +3885,7 @@ test('When id supplied then add to input', async (t) => { const select = new Select({ target, props: { - config, + imports, id: 'foods', items: items, }, @@ -3908,7 +3906,7 @@ test('allows the user to select an item by clicking with a focusable ancestor', const select = new Select({ target: ancestor, props: { - config, + imports, items, }, }); @@ -3925,7 +3923,7 @@ test('when listOpen true on page load then list should show onMount', async (t) const select = new Select({ target, props: { - config, + imports, items, listOpen: true, }, @@ -3942,7 +3940,7 @@ test('when listOpen true on page load then list should show onMount', async (t) const select = new Select({ target, props: { - config, + imports, items, listOpen: true, }, @@ -3960,7 +3958,7 @@ test('when suggestions and no filterText then list should show suggestions', asy const select = new Select({ target, props: { - config, + imports, loadOptions: () => { return Promise.resolve(['foo']) }, @@ -3979,7 +3977,7 @@ test('when suggestions items is selected, list should stay open and filterText s const select = new Select({ target, props: { - config, + imports, loadOptions: () => { return Promise.resolve(['foo']) }, @@ -4012,7 +4010,7 @@ test('when VirtualList and no results then show noOptionsMessage', async (t) => const select = new Select({ target, props: { - config: { ...config, VirtualList }, + imports: { ...imports, VirtualList }, items, listOpen: true, filterText: 'zzzzz' @@ -4030,7 +4028,7 @@ test('when value is set check from item and show correct label', async (t) => { const select = new Select({ target, props: { - config: { ...config }, + imports: { ...imports }, items, listOpen: true, @@ -4040,4 +4038,23 @@ test('when value is set check from item and show correct label', async (t) => { select.value = 'cake'; t.equal(select.value.label, 'Cake'); select.$destroy(); +}); + +test('if ChevronIcon and showChevron show chevron and allow click', async (t) => { + const select = new Select({ + target, + props: { + imports: { ...imports, ChevronIcon}, + items, + + showChevron: true + + } + }); + + let chevron = document.querySelector('.chevron'); + t.ok(chevron); + chevron.click(); + t.ok(select.listOpen); + select.$destroy(); }); \ No newline at end of file From 3b78f38d0a9253f2470769f2a44354ed5717c396 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 12 Nov 2021 11:54:08 +1100 Subject: [PATCH 308/635] #326 added blur and focus events --- CHANGELOG.md | 1 + src/lib/Select.svelte | 6 +++++- test/src/tests.js | 50 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfbe716b..6508193a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## unreleased +* added blur and focus events * renamed 'config' to 'imports' * ChevronIcon moved to config, * Added suggestions feature diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 059e4edc..fc6810a0 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -440,12 +440,16 @@ } } - function handleFocus() { + function handleFocus(e) { + dispatch('focus', e); + isFocused = true; if (input) input.focus(); } function handleBlur(e) { + dispatch('blur', e); + isFocused = false; activeValue = undefined; diff --git a/test/src/tests.js b/test/src/tests.js index e4365edd..63d21cde 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -4057,4 +4057,52 @@ test('if ChevronIcon and showChevron show chevron and allow click', async (t) => chevron.click(); t.ok(select.listOpen); select.$destroy(); -}); \ No newline at end of file +}); + +test('when component focuses fire on:focus event', async (t) => { + const select = new Select({ + target, + props: { + imports, + items + } + }); + + let f = false; + select.$on('focus', () => { + f = true; + }); + + let ele = document.querySelector('.select-container input'); + ele.focus(); + + t.ok(f); + + select.$destroy(); +}); + + +test('when component blurs fire on:blur event', async (t) => { + const select = new Select({ + target, + props: { + imports, + items, + isFocused: true + } + }); + + let b = false; + select.$on('blur', () => { + b = true; + }); + + let ele = document.querySelector('.select-container input'); + ele.blur(); + + t.ok(b); + + select.$destroy(); +}); + + From c9a8f05fd420b3d08729c9ef9459b5d9a4c27932 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 12 Nov 2021 11:54:28 +1100 Subject: [PATCH 309/635] 5.0.0-alpha.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e66d2e98..195128bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "svelte-select", - "version": "5.0.0-alpha.1", + "version": "5.0.0-alpha.2", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "5.0.0-alpha.1", + "version": "5.0.0-alpha.2", "license": "ISC", "devDependencies": { "@sveltejs/kit": "1.0.0-next.195", diff --git a/package.json b/package.json index c62ab002..27d488f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-alpha.1", + "version": "5.0.0-alpha.2", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A + From 36e2caaf09afda59cea02f702e754e354e1d3074 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Nov 2021 06:33:12 +1100 Subject: [PATCH 311/635] yml format --- .github/workflows/npm-publish.yml | 30 +++++++++++++++--------------- .prettierrc | 6 ++++++ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index c933dbe6..4d2ffee0 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -1,20 +1,20 @@ name: Publish svelte-select to NPM on: - release: - types: [created] + release: + types: [created] jobs: - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: 16 - registry-url: https://registry.npmjs.org/ - - run: npm i - - run: npm publish ./package - env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} \ No newline at end of file + publish-npm: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 16 + registry-url: https://registry.npmjs.org/ + - run: npm i + - run: npm publish ./package + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.prettierrc b/.prettierrc index 14bbceee..297574b3 100644 --- a/.prettierrc +++ b/.prettierrc @@ -10,6 +10,12 @@ "options": { "singleQuote": true } + }, + { + "files": ["*.yml"], + "options": { + "tabWidth": 2 + } } ], "svelteSortOrder": "scripts-markup-styles", From 41ce681c3911adf9d6c5f83f415032111ddff745 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Nov 2021 06:46:22 +1100 Subject: [PATCH 312/635] github workflow update --- .github/workflows/npm-publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 4d2ffee0..abdf4ecc 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -6,7 +6,6 @@ on: jobs: publish-npm: - needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -14,7 +13,7 @@ jobs: with: node-version: 16 registry-url: https://registry.npmjs.org/ - - run: npm i + - run: npm ci - run: npm publish ./package env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} From def0f2041f00263ca1a0f6d267d797b2579bb39d Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Nov 2021 07:21:40 +1100 Subject: [PATCH 313/635] workflow alpha test --- .github/workflows/npm-publish.yml | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index abdf4ecc..86248ae4 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -14,6 +14,6 @@ jobs: node-version: 16 registry-url: https://registry.npmjs.org/ - run: npm ci - - run: npm publish ./package + - run: npm publish ./package --tag alpha env: - NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/package.json b/package.json index 71330d88..9c05671a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-alpha.2", + "version": "5.0.0-alpha.3", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "scripts": { From 5e68c24be65fea2855d0e40482277ab16891200c Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Nov 2021 08:37:01 +1100 Subject: [PATCH 320/635] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8061db5e..d26743ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # svelte-select changelog +## 4.4.5 + +* NPM fix + ## 4.4.4 * Bug fix for #346 out of viewport - thanks to @nickyrferry From 08391910e8eeba7e60cc2e64977eb49eddd57458 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 16 Nov 2021 08:37:09 +1100 Subject: [PATCH 321/635] 4.4.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 695e7566..1b4da091 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.4.4", + "version": "4.4.5", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A - +
diff --git a/test/src/tests.js b/test/src/tests.js index 63d21cde..9689db7e 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -3,7 +3,6 @@ import CustomItem from './CustomItem.svelte'; import Select from '../../src/lib/Select.svelte'; import Multi from '../../src/lib/Multi.svelte'; import ChevronIcon from '../../src/lib/ChevronIcon.svelte'; -import LoadingIcon from '../../src/lib/LoadingIcon.svelte'; import TestIcon from './TestIcon.svelte'; import TestClearIcon from './TestClearIcon.svelte'; import SelectDefault from './Select/Select--default.svelte' @@ -681,7 +680,7 @@ test('Placeholder text should reappear when List is closed', async (t) => { div.click(); div.remove(); const selectInput = document.querySelector('.select-container input'); - t.equal(selectInput.attributes.placeholder.value, 'Select...'); + t.equal(selectInput.attributes.placeholder.value, 'Please select'); select.$destroy(); }); @@ -745,7 +744,7 @@ test('closing List clears Select filter text', async (t) => { div.click(); div.remove(); const selectInput = document.querySelector('.select-container input'); - t.equal(selectInput.attributes.placeholder.value, 'Select...'); + t.equal(selectInput.attributes.placeholder.value, 'Please select'); select.$destroy(); }); @@ -768,7 +767,7 @@ test('closing List clears Select filter text', async (t) => { div.click(); div.remove(); const selectInput = document.querySelector('.select-container input'); - t.equal(selectInput.attributes.placeholder.value, 'Select...'); + t.equal(selectInput.attributes.placeholder.value, 'Please select'); select.$destroy(); }); @@ -791,7 +790,7 @@ test('closing List item clears Select filter text', async (t) => { div.click(); div.remove(); const selectInput = document.querySelector('.select-container input'); - t.equal(selectInput.attributes.placeholder.value, 'Select...'); + t.equal(selectInput.attributes.placeholder.value, 'Please select'); select.$destroy(); }); @@ -1259,7 +1258,6 @@ test('should display loading icon when waiting is enabled', async (t) => { target, props: { imports, - LoadingIcon, items, isWaiting: true } @@ -2018,7 +2016,7 @@ test('when isMulti is true, value populated and arrowLeft is pressed then no ite select.$destroy(); }); -test('when hideEmptyState true then do not show "no options" div ', async (t) => { +test('when hideEmptyState true then do not show "no items" div ', async (t) => { const select = new Select({ target, props: { @@ -3274,13 +3272,12 @@ test('when loadOptions response returns cancelled true then dont end loading sta select.$destroy(); }); -test('when ClearItem replace clear icon', async (t) => { +test('when ClearIcon replace clear icon', async (t) => { const select = new Select({ target, props: { - imports, + imports: {...imports, ClearIcon: TestClearIcon}, items, - ClearIcon: TestClearIcon, value: {value: 'chips', label: 'Chips'} } }); @@ -4105,4 +4102,4 @@ test('when component blurs fire on:blur event', async (t) => { select.$destroy(); }); - + // suggestions tests here... \ No newline at end of file From add40fff97d17a0216f8cd1afb4e9d6d6d4b993c Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 25 Nov 2021 07:08:28 +1100 Subject: [PATCH 324/635] fixing up tests and adding isOutOfViewport test --- test/public/index.html | 5 ++--- test/src/index.js | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/test/public/index.html b/test/public/index.html index 449015ab..3647050b 100644 --- a/test/public/index.html +++ b/test/public/index.html @@ -6,9 +6,8 @@ -
-
-
+ + diff --git a/test/src/index.js b/test/src/index.js index fb9c70a2..db884f89 100644 --- a/test/src/index.js +++ b/test/src/index.js @@ -503,6 +503,7 @@ test('when listPosition is set to auto and container at the bottom, the list sho t.ok(distanceOfListTopFromViewportTop <= distanceOfInputTopFromViewportTop); + testTarget.remove(); select.$destroy(); }); @@ -1026,6 +1027,7 @@ test(`show ellipsis for overflowing text in a List item`, async (t) => { list.$destroy(); target.style.width = ''; + target.style.position = ''; }); test('focusing in an external textarea should close and blur it', async (t) => { @@ -1589,6 +1591,7 @@ test('when isMulti and groupBy is active then items should be selectable', async await querySelectorClick('.listItem'); t.equal(JSON.stringify(select.value), JSON.stringify([{"isGroupItem":true,"value":"chocolate","label":"Chocolate","group":"Sweet"}])); + target.style.maxWidth = ''; select.$destroy(); }); @@ -1605,6 +1608,8 @@ test('when isMulti and selected items reach edge of container then Select height t.ok(document.querySelector('.selectContainer').scrollHeight === 42); await handleSet(select, {value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}]}); t.ok(document.querySelector('.selectContainer').scrollHeight > 44); + + target.style.maxWidth = ''; select.$destroy(); }); @@ -1625,6 +1630,7 @@ test('when isMulti and value is populated then navigating with LeftArrow updates t.ok(select.$capture_state().activeValue === 1); + target.style.maxWidth = ''; select.$destroy(); }); @@ -3792,6 +3798,24 @@ test('When id supplied then add to input', async (t) => { select.$destroy(); }); +test('when list is open and up/down arrows are used to navigate list then isOutOfViewport result should stay consistent', async (t) => { + const select = new Select({ + target, + props: { + listOpen: true, + items: items, + containerStyles: 'position: absolute; bottom: 200px;' + }, + }); + + let list = document.querySelector('.listContainer'); + t.equal(list.style.bottom, '47px') + await handleKeyboard('ArrowDown'); + t.equal(list.style.bottom, '47px') + + select.$destroy(); +}); + // this allows us to close puppeteer once tests have completed window.done = done; export default {}; From 08a78efb7698cfe00b02af4c6c32e4df07c86659 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 25 Nov 2021 07:12:38 +1100 Subject: [PATCH 325/635] changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8061db5e..531661b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # svelte-select changelog +## 4.4.5 + +* Bug fix for isOutOfViewport - thanks to @alexkuzmin + + ## 4.4.4 * Bug fix for #346 out of viewport - thanks to @nickyrferry From ef61e140781afe8ffdfedd6a13e99b5555242726 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 25 Nov 2021 07:13:07 +1100 Subject: [PATCH 326/635] 4.4.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 695e7566..1b4da091 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "4.4.4", + "version": "4.4.5", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "svelte": "src/index.js", From c70a1059af41c7bbcd0270c58921f7ee941a1896 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 29 Nov 2021 08:36:37 +1100 Subject: [PATCH 329/635] internal padding --- src/lib/default.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/default.css b/src/lib/default.css index ecfb509a..ae7b32f7 100644 --- a/src/lib/default.css +++ b/src/lib/default.css @@ -3,6 +3,7 @@ } .select-container { + --internalPadding: 0 16px; border: var(--border); border-radius: var(--border-radius, 3px); box-sizing: border-box; @@ -10,7 +11,7 @@ position: relative; display: flex; align-items: center; - padding: var(--padding, 0 16px); + padding: var(--padding, var(--internalPadding)); background: var(--background, #fff); margin: var(--margin, 0); width: var(--width, 100%); @@ -22,7 +23,7 @@ color: var(--input-color, #3f4f5f); height: var(--height, 42px); line-height: var(--height, 42px); - padding: var(--input-padding, var(--padding, 0 16px)); + padding: var(--inputPadding, var(--padding, var(--internalPadding))); width: 100%; background: transparent; font-size: var(--input-font-size, 14px); From 6fc130d9214f9b27d646ff0ed1a6602a7ff3aea7 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 2 Dec 2021 07:12:46 +1100 Subject: [PATCH 330/635] icons and css updates --- ...d.js => generate_theming_variables_md.cjs} | 2 +- docs/theming_variables.md | 150 +++++++--------- package-lock.json | 14 +- package.json | 3 +- src/lib/ClearIcon.svelte | 8 + src/lib/Multi.svelte | 84 +-------- src/lib/Select.svelte | 6 +- src/lib/default.css | 165 ++++++++++-------- src/lib/imports.js | 25 +++ src/lib/presets/vanilla.js | 21 --- src/lib/tailwind.css | 6 +- src/routes/index.svelte | 45 +++-- test/src/Select/Select--default.svelte | 2 +- test/src/tests.js | 39 ++--- 14 files changed, 254 insertions(+), 316 deletions(-) rename docs/{generate_theming_variables_md.js => generate_theming_variables_md.cjs} (99%) create mode 100644 src/lib/imports.js delete mode 100644 src/lib/presets/vanilla.js diff --git a/docs/generate_theming_variables_md.js b/docs/generate_theming_variables_md.cjs similarity index 99% rename from docs/generate_theming_variables_md.js rename to docs/generate_theming_variables_md.cjs index cb92e432..2400c030 100644 --- a/docs/generate_theming_variables_md.js +++ b/docs/generate_theming_variables_md.cjs @@ -13,7 +13,7 @@ const VARIABLE_SECTION_PATTERN = /()(.|\n)*( const searchResults = await find( VARIABLE_USAGE_PATTERN, SOURCE_FOLDER, - ".svelte$" + ".css$" ); const justTheMatchedParts = Object.keys(searchResults).reduce( (accumulator, nextKey) => [ diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 1e992164..9a575610 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -5,96 +5,68 @@ You can override the following variables to style a Select component. - `--background` - `--border` -- `--borderFocusColor` -- `--borderHoverColor` -- `--borderRadius` -- `--clearSelectBottom` -- `--clearSelectColor` -- `--clearSelectFocusColor` -- `--clearSelectHoverColor` -- `--clearSelectRight` -- `--clearSelectTop` -- `--clearSelectWidth` -- `--disabledBackground` -- `--disabledBorderColor` -- `--disabledColor` -- `--disabledPlaceholderColor` -- `--disabledPlaceholderOpacity` -- `--errorBackground` -- `--errorBorder` -- `--groupItemPaddingLeft` -- `--groupTitleColor` -- `--groupTitleFontSize` -- `--groupTitleFontWeight` -- `--groupTitlePadding` -- `--groupTitleTextTransform` +- `--border-focus-color` +- `--border-hover-color` +- `--border-radius` +- `--clear-select-color` +- `--clear-select-width` +- `--disabled-background` +- `--disabled-border-color` +- `--disabled-color` +- `--disabled-placeholder-color` +- `--disabled-placeholder-opacity` +- `--error-background` +- `--error-border` +- `--group-item-padding-left` +- `--group-title-color` +- `--group-title-font-size` +- `--group-title-font-weight` +- `--group-title-padding` +- `--group-title-text-transform` - `--height` -- `--indicatorColor` -- `--indicatorFill` -- `--indicatorHeight` -- `--indicatorRight` -- `--indicatorStroke` -- `--indicatorTop` -- `--indicatorWidth` -- `--inputColor` -- `--inputFontSize` -- `--inputLeft` -- `--inputLetterSpacing` -- `--inputMargin` -- `--inputPadding` -- `--itemActiveBackground` -- `--itemColor` -- `--itemFirstBorderRadius` -- `--itemHoverBG` -- `--itemHoverColor` -- `--itemIsActiveBG` -- `--itemIsActiveColor` -- `--itemIsNotSelectableColor` -- `--itemPadding` -- `--listBackground` -- `--listBorder` -- `--listBorderRadius` -- `--listEmptyColor` -- `--listEmptyPadding` -- `--listEmptyTextAlign` -- `--listLeft` -- `--listMaxHeight` -- `--listPosition` -- `--listRight` -- `--listShadow` -- `--listZIndex` +- `--icons-bottom` +- `--icons-color` +- `--icons-color-focused` +- `--icons-right` +- `--icons-top` +- `--indicator-color` +- `--indicator-height` +- `--indicator-width` +- `--input-color` +- `--input-font-size` +- `--input-left` +- `--input-letter-spacing` +- `--input-margin` +- `--input-padding` +- `--internal-padding` +- `--item-active-background` +- `--item-color` +- `--item-first-border-radius` +- `--item-hover-bg` +- `--item-hover-color` +- `--item-is-active-bg` +- `--item-is-active-color` +- `--item-is-not-selectable-color` +- `--item-padding` +- `--list-background` +- `--list-border` +- `--list-border-radius` +- `--list-empty-color` +- `--list-empty-padding` +- `--list-empty-text-align` +- `--list-left` +- `--list-max-height` +- `--list-position` +- `--list-right` +- `--list-shadow` +- `--list-z-index` - `--margin` -- `--multiClearBG` -- `--multiClearFill` -- `--multiClearHeight` -- `--multiClearHoverBG` -- `--multiClearHoverFill` -- `--multiClearPadding` -- `--multiClearRadius` -- `--multiClearTextAlign` -- `--multiClearTop` -- `--multiClearWidth` -- `--multiItemActiveBG` -- `--multiItemActiveColor` -- `--multiItemBG` -- `--multiItemBorderRadius` -- `--multiItemDisabledHoverBg` -- `--multiItemDisabledHoverColor` -- `--multiItemHeight` -- `--multiItemMargin` -- `--multiItemPadding` -- `--multiLabelMargin` -- `--multiSelectInputMargin` -- `--multiSelectInputPadding` -- `--multiSelectPadding` +- `--multi-select-input-margin` +- `--multi-select-input-padding` +- `--multi-select-padding` - `--padding` -- `--placeholderColor` -- `--placeholderOpacity` -- `--selectedItemPadding` -- `--spinnerColor` -- `--spinnerHeight` -- `--spinnerLeft` -- `--spinnerRight` -- `--spinnerWidth` -- `--virtualListHeight` +- `--placeholder-color` +- `--placeholder-opacity` +- `--selected-item-padding` +- `--width` diff --git a/package-lock.json b/package-lock.json index 3d35c627..f9372091 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "sirv-cli": "^1.0.14", "svelte": "^3.44.1", "svelte-preprocess": "^4.9.8", - "svelte-select": "^5.0.0-alpha.2", + "svelte-select": "^5.0.0-alpha.4", "svelte-tiny-virtual-list": "^1.1.7", "svelte2tsx": "^0.4.8", "tailwindcss": "^2.2.19", @@ -3781,9 +3781,9 @@ } }, "node_modules/svelte-select": { - "version": "5.0.0-alpha.2", - "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-5.0.0-alpha.2.tgz", - "integrity": "sha512-umsnE+vkHQ6X2totVIhqgIbXOeygVvcp5YsvbhaFFicgOjptNj5Vf7GttE4JHf7S7G2ewO6NitKqVDjBBhtCYA==", + "version": "5.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-5.0.0-alpha.4.tgz", + "integrity": "sha512-Xv6pvTubpQ/w/0sT69XP9yD2xrZ4G4KZqBnmzkGq1zaOPlFNLBtK0gnbcIJ8jgnUi4bGcfUo9FN1dCo788rtfg==", "dev": true }, "node_modules/svelte-tiny-virtual-list": { @@ -6776,9 +6776,9 @@ } }, "svelte-select": { - "version": "5.0.0-alpha.2", - "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-5.0.0-alpha.2.tgz", - "integrity": "sha512-umsnE+vkHQ6X2totVIhqgIbXOeygVvcp5YsvbhaFFicgOjptNj5Vf7GttE4JHf7S7G2ewO6NitKqVDjBBhtCYA==", + "version": "5.0.0-alpha.4", + "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-5.0.0-alpha.4.tgz", + "integrity": "sha512-Xv6pvTubpQ/w/0sT69XP9yD2xrZ4G4KZqBnmzkGq1zaOPlFNLBtK0gnbcIJ8jgnUi4bGcfUo9FN1dCo788rtfg==", "dev": true }, "svelte-tiny-virtual-list": { diff --git a/package.json b/package.json index 5e15ab48..4bfe3f7b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "preview": "svelte-kit preview", "dev-tests": "rollup -cw", "test:browser": "sirv test/public -p 3000 --dev", - "gen:docs": "node docs/generate_theming_variables_md.js", + "gen:docs": "node docs/generate_theming_variables_md.cjs", "prepare": "svelte-kit package" }, "devDependencies": { @@ -31,7 +31,6 @@ "sirv-cli": "^1.0.14", "svelte": "^3.44.1", "svelte-preprocess": "^4.9.8", - "svelte-select": "^5.0.0-alpha.4", "svelte-tiny-virtual-list": "^1.1.7", "svelte2tsx": "^0.4.8", "tailwindcss": "^2.2.19", diff --git a/src/lib/ClearIcon.svelte b/src/lib/ClearIcon.svelte index 8ea2b6fa..18e07fea 100644 --- a/src/lib/ClearIcon.svelte +++ b/src/lib/ClearIcon.svelte @@ -12,3 +12,11 @@ l3.641,3.641L27.641,22.688L38.564,33.61L34.923,37.251z" /> + + \ No newline at end of file diff --git a/src/lib/Multi.svelte b/src/lib/Multi.svelte index 313b8f80..a468a5c6 100644 --- a/src/lib/Multi.svelte +++ b/src/lib/Multi.svelte @@ -8,6 +8,7 @@ export let isDisabled = false; export let multiFullItemClearable = false; export let getSelectionLabel = undefined; + export let ClearIcon; function handleClear(i, event) { event.stopPropagation(); @@ -17,88 +18,15 @@ {#each value as item, i}
- multiFullItemClearable ? handleClear(i, event) : {}}> -
+ class="multi-item {activeValue === i ? 'active' : ''} {isDisabled ? 'disabled' : ''}" + on:click={(event) => (multiFullItemClearable ? handleClear(i, event) : {})}> +
{@html getSelectionLabel(item)}
{#if !isDisabled && !multiFullItemClearable} -
handleClear(i, event)}> - +
handleClear(i, event)}> +
{/if}
{/each} - - diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 1cf0a6e8..a579c08a 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -566,10 +566,11 @@ class:multi={isMulti} class:disabled={isDisabled} class:focused={isFocused} + class:list-open={listOpen} style={containerStyles} on:click={handleClick} bind:this={container}> - + {#if isFocused} {ariaSelection} @@ -589,6 +590,7 @@ {getSelectionLabel} {activeValue} {isDisabled} + {ClearIcon} {multiFullItemClearable} on:multiItemClear={handleMultiItemClear} on:focus={handleFocus} /> @@ -614,7 +616,7 @@
{#if showClear} - \ No newline at end of file +
+ + \ No newline at end of file diff --git a/src/lib/List.svelte b/src/lib/List.svelte index fbee471b..9132ed79 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -190,7 +190,7 @@ let styles; const base = `position:fixed;left:${left}px;min-width:${width}px;width:${ - listAutoWidth ? width + 'px' : '100%' + listAutoWidth ? width + 'px' : 'auto' };`; const _top = `bottom:${window.innerHeight - bottom + height + listOffset}px;`; @@ -275,3 +275,38 @@
{noOptionsMessage}
{/if}
+ + + \ No newline at end of file diff --git a/src/lib/LoadingIcon.svelte b/src/lib/LoadingIcon.svelte index 14816ff6..1acd210b 100644 --- a/src/lib/LoadingIcon.svelte +++ b/src/lib/LoadingIcon.svelte @@ -13,9 +13,9 @@ \ No newline at end of file diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index d0f6e831..94c85b2c 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -1,24 +1,30 @@
@@ -653,3 +667,159 @@ on:itemCreated={itemCreated} on:closeList={closeList} /> {/if} + + diff --git a/src/lib/Selection.svelte b/src/lib/Selection.svelte index 0091da9a..e4109f90 100644 --- a/src/lib/Selection.svelte +++ b/src/lib/Selection.svelte @@ -5,4 +5,12 @@
{@html getSelectionLabel(item)} -
\ No newline at end of file +
+ + diff --git a/src/lib/debounce.js b/src/lib/debounce.js deleted file mode 100644 index fc125ad1..00000000 --- a/src/lib/debounce.js +++ /dev/null @@ -1,7 +0,0 @@ -export default function debounce(fn, wait = 1) { - let timeout; - return function (...args) { - clearTimeout(timeout); - timeout = setTimeout(() => fn.apply(this, ...args), wait); - }; -} diff --git a/src/lib/default.css b/src/lib/default.css deleted file mode 100644 index 2c3539a5..00000000 --- a/src/lib/default.css +++ /dev/null @@ -1,255 +0,0 @@ -:root { - --border: 1px solid #d8dbdf; -} - -.select-container { - --internal-padding: 0 16px; - border: var(--border); - border-radius: var(--border-radius, 3px); - box-sizing: border-box; - height: var(--height, 42px); - position: relative; - display: flex; - align-items: center; - padding: var(--padding, var(--internal-padding)); - background: var(--background, #fff); - margin: var(--margin, 0); - width: var(--width, 100%); -} - -.select-container input { - cursor: default; - border: none; - color: var(--input-color, #3f4f5f); - height: var(--height, 42px); - line-height: var(--height, 42px); - padding: var(--input-padding, var(--padding, var(--internal-padding))); - width: 100%; - background: transparent; - font-size: var(--input-font-size, 14px); - letter-spacing: var(--input-letter-spacing, inherit); - position: absolute; - left: var(--input-left, 0); - margin: var(--input-margin, 0); - box-sizing: border-box; -} - -.select-container input::placeholder { - color: var(--placeholder-color, #78848f); - opacity: var(--placeholder-opacity, 1); -} - -.select-container input:focus { - outline: none; -} - -.select-container:hover { - border-color: var(--border-hover-color, #b2b8bf); -} - -.select-container.focused { - border-color: var(--border-focus-color, #006fe8); -} - -.select-container.disabled { - background: var(--disabled-background, #ebedef); - border-color: var(--disabled-border-color, #ebedef); - color: var(--disabled-color, #c1c6cc); -} - -.select-container.disabled input::placeholder { - color: var(--disabled-placeholder-color, #c1c6cc); - opacity: var(--disabled-placeholder-opacity, 1); -} - -.select-container .selected-item { - line-height: var(--height, 42px); - height: var(--height, 42px); - overflow-x: hidden; - padding: var(--selected-item-padding, 0 20px 0 0); -} - -.select-container .selected-item:focus { - outline: none; -} - -.select-container .icons { - pointer-events: none; - position: absolute; - display: flex; - align-items: center; - justify-items: center; - right: var(--icons-right, 0); - top: var(--icons-top, 11px); - bottom: var(--icons-bottom, 11px); - color: var(--icons-color, #c5cacf); -} - -.select-container.focused .icons, -.select-container .icons svg:hover { - color: var(--icons-color-focused, #2c3e50); -} - -.select-container .clear-select { - display: flex; - align-items: center; - width: var(--clear-select-width, 30px); - color: var(--clear-select-color, --icons-color); - pointer-events: all; -} - -.select-container .chevron { - display: flex; - box-shadow: -1px 0 0 0 #c5cacf; - width: var(--indicator-width, 35px); - height: var(--indicator-height, 20px); - color: var(--indicator-color, --icons-color); - pointer-events: all; -} - -.select-container.list-open .chevron { - pointer-events: none; - -} - -.select-container.multi { - padding: var(--multi-select-padding, 0 35px 0 16px); - min-height: 38px; - flex-wrap: wrap; - align-items: stretch; - display: flex; - height: auto; -} - -.select-container.multi input { - padding: var(--multi-select-input-padding, 0); - position: relative; - margin: var(--multi-select-input-margin, 0); -} - -.select-container.error { - border: var(--error-border, 1px solid #ff2d55); - background: var(--error-background, #fff); -} - -.a11y-text { - z-index: 9999; - border: 0px; - clip: rect(1px, 1px, 1px, 1px); - height: 1px; - width: 1px; - position: absolute; - overflow: hidden; - padding: 0px; - white-space: nowrap; -} - -.list { - box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); - border-radius: var(--list-border-radius, 4px); - max-height: var(--list-max-height, 250px); - overflow-y: auto; - background: var(--list-background, #fff); - position: var(--list-position, absolute); - z-index: var(--list-z-index, 2); - border: var(--list-border, --border); -} - -.list .list-group-title { - color: var(--group-title-color, #8f8f8f); - cursor: default; - font-size: var(--group-title-font-size, 12px); - font-weight: var(--group-title-font-weight, 600); - height: var(--height, 42px); - line-height: var(--height, 42px); - padding: var(--group-title-padding, 0 20px); - text-overflow: ellipsis; - overflow-x: hidden; - white-space: nowrap; - text-transform: var(--group-title-text-transform, uppercase); -} - -.list .empty { - text-align: var(--list-empty-text-align, center); - padding: var(--list-empty-padding, 20px 0); - color: var(--list-empty-color, #78848f); -} - -.item { - cursor: default; - height: var(--height, 42px); - line-height: var(--height, 42px); - padding: var(--item-padding, 0 20px); - color: var(--item-color, inherit); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} - -.item.group-item { - padding-left: var(--group-item-padding-left, 40px); -} - -.item:active { - background: var(--item-active-background, #b9daff); -} - -.item.active { - background: var(--item-is-active-bg, #007aff); - color: var(--item-is-active-color, #fff); -} - -.item.not-selectable { - color: var(--item-is-not-selectable-color, #999); -} - -.item.first { - border-radius: var(--item-first-border-radius, 4px 4px 0 0); -} - -.item.hover:not(.active) { - background: var(--item-hover-bg, #e7f2ff); - color: var(--item-hover-color, inherit); -} - -.selection { - text-overflow: ellipsis; - overflow-x: hidden; - white-space: nowrap; -} - -.multi input { - flex: 1 1 40px; -} - -.multi-item { - background: var(--multi-item-bg, #ebedef); - margin: var(--multi-item-margin, 4px 5px 0 0); - border: var(--multi-item-border, 1px solid #ddd); - border-radius: var(--multi-item-border-radius, 4px); - height: var(--multi-item-height, 32px); - line-height: var(--multi-item-height, 32px); - display: flex; - cursor: default; - padding: var(--multi-item-padding, 0 6px 0 6px); - max-width: 100%; -} - -.multi-item_label { - margin: var(--multi-label-margin, 0 5px 0 0); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.multi-item.disabled:hover { - background: var(--multi-item-disabled-hover-bg, #ebedef); - color: var(--multi-item-disabled-hover-color, #c1c6cc); -} - -.multi-item_clear { - display: flex; - align-items: center; - justify-content: center; - --clear-icon-colour: var(--multi-item-clear-icon-color, #000); -} diff --git a/src/lib/imports.js b/src/lib/imports.js deleted file mode 100644 index 744fb2f5..00000000 --- a/src/lib/imports.js +++ /dev/null @@ -1,25 +0,0 @@ -import theme from './default.css'; -import List from './List.svelte'; -import Item from './Item.svelte'; -import Selection from './Selection.svelte'; -import Multi from './Multi.svelte'; -import LoadingIcon from './LoadingIcon.svelte'; -import ClearIcon from './ClearIcon.svelte'; -import ChevronIcon from './ChevronIcon.svelte'; -import debounce from './debounce'; -import filter from './filter'; -import getItems from './getItems'; - -export default { - theme, - List, - Item, - Selection, - Multi, - LoadingIcon, - ClearIcon, - ChevronIcon, - debounce, - filter, - getItems, -} \ No newline at end of file diff --git a/src/lib/tailwind.css b/src/lib/tailwind.css index 6278adcb..258d2694 100644 --- a/src/lib/tailwind.css +++ b/src/lib/tailwind.css @@ -1,67 +1,67 @@ @import 'http://github.com/tailwindcss/base'; -.select-container { +.svelte-select { @apply border rounded box-border h-10 relative flex items-center px-4 py-0 bg-white m-0 w-full hover:border-gray-400; } -.select-container input { +.svelte-select input { @apply cursor-default border-none text-gray-600 h-10 leading-10 px-4 py-0 bg-transparent text-sm absolute left-0 m-0 w-full focus:outline-none hover:border-gray-400; } -.select-container.focused { +.svelte-select.focused { @apply border-blue-600; } -.select-container.disabled { +.svelte-select.disabled { @apply bg-gray-200 border-gray-200 text-gray-600; } -.select-container.disabled input::placeholder { +.svelte-select.disabled input::placeholder { @apply text-gray-400 opacity-100; } -.select-container .selected-item { +.svelte-select .selected-item { @apply leading-10 h-10 overflow-x-hidden pr-5 focus:outline-none; } -.select-container .icons { +.svelte-select .icons { @apply absolute flex right-0 translate-y-0 text-gray-200 pointer-events-none top-3 bottom-3; } -.select-container .icons > * { +.svelte-select .icons > * { @apply transition-colors ease-in-out duration-200; } -.select-container .clear-select { +.svelte-select .clear-select { @apply pointer-events-auto; } -.select-container.focused .icons, -.select-container .chevron:hover, -.select-container .clear-select:hover { +.svelte-select.focused .icons, +.svelte-select .chevron:hover, +.svelte-select .clear-select:hover { @apply text-gray-600; } -.select-container .clear-select { +.svelte-select .clear-select { @apply px-2 h-5 text-gray-300 flex-none w-9; } -.select-container .chevron { +.svelte-select .chevron { @apply flex pt-0 pr-2 pl-2 border-l-2 w-9 h-5 text-gray-300; } -.select-container.multi { +.svelte-select.multi { @apply pr-9 pl-4 h-auto flex-wrap items-stretch; } -.select-container.multi input { +.svelte-select.multi input { @apply p-0 relative m-0; } -.select-container.error { +.svelte-select.error { @apply border-red-500 bg-white; } diff --git a/src/routes/index.svelte b/src/routes/index.svelte index d2c1f28e..dc4d16f0 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -1,10 +1,8 @@
-
diff --git a/svelte.config.js b/svelte.config.js index 8178ee3b..bded4854 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,9 +1,4 @@ /** @type {import('@sveltejs/kit').Config} */ -const config = { - kit: { - // hydrate the
element in src/app.html - target: '#svelte' - }, -}; +const config = {}; export default config; diff --git a/test/src/CustomItem.svelte b/test/src/CustomItem.svelte index ade75908..a4c972e5 100644 --- a/test/src/CustomItem.svelte +++ b/test/src/CustomItem.svelte @@ -34,8 +34,8 @@ display: flex; align-items: center; cursor: default; - height: 40px; - line-height: 40px; + height: 42px; + line-height: 42px; padding: 0 16px; text-overflow: ellipsis; overflow: hidden; diff --git a/test/src/tests.js b/test/src/tests.js index 212f2f16..e44eeb78 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -153,7 +153,6 @@ assert.arrayEqual = (a, b) => { assert.ok(a.every((val, i) => val === b[i])); }; - test('with no data creates default elements', async (t) => { const testTemplate = new SelectDefault({ target: testTarget @@ -1655,7 +1654,7 @@ test('when isMulti and selected items reach edge of container then Select height } }); - target.style.maxWidth = '250px'; + target.style.maxWidth = '252px'; t.ok(document.querySelector('.svelte-select').scrollHeight === 42); await handleSet(select, {value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}]}); t.ok(document.querySelector('.svelte-select').scrollHeight > 44); @@ -3977,7 +3976,7 @@ test('when suggestions items is selected, list should stay open and filterText s t.equal(item.innerHTML, 'one'); item.click(); t.equal(select.filterText, 'one'); - await wait(0); + await wait(400); item = document.querySelector('.item'); t.equal(item.innerHTML, 'foo'); @@ -4086,6 +4085,4 @@ test('when component blurs fire on:blur event', async (t) => { t.ok(b); select.$destroy(); -}); - - // TODO: suggestions tests \ No newline at end of file +}); \ No newline at end of file From f20c055fae76d2745c6ea2e16df33e28e86233a6 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 1 Mar 2022 07:33:23 +1100 Subject: [PATCH 360/635] preRelease=beta --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 30f0b448..887b697d 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "preprepare": "node src/remove-styles.cjs", "prepare": "svelte-kit package", "postprepare": "node src/post-prepare.cjs && npm run gen:docs", - "release": "release-it" + "release": "release-it --preRelease=beta" }, "devDependencies": { "@rollup/plugin-alias": "^3.1.9", From 59de8f31bc9d03809384602548a5f9708016013f Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 1 Mar 2022 07:34:44 +1100 Subject: [PATCH 361/635] Release 5.0.0-beta.0 --- docs/theming_variables.md | 1 + package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 8a3fe9d9..5319309a 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -77,6 +77,7 @@ You can override the following variables to style a Select component. - `--multi-item-margin` - `--multi-item-padding` - `--multi-label-margin` +- `--multi-max-width` - `--multi-select-input-margin` - `--multi-select-input-padding` - `--multi-select-padding` diff --git a/package-lock.json b/package-lock.json index 75a6eb5d..04299bcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "svelte-select", - "version": "5.0.0-alpha.10", + "version": "5.0.0-beta.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "5.0.0-alpha.10", + "version": "5.0.0-beta.0", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 887b697d..262145ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-alpha.10", + "version": "5.0.0-beta.0", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A + component for Svelte apps", "scripts": { From 3e207c9776639343c27ab95a358bc73380c77aa4 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 09:48:52 +1000 Subject: [PATCH 365/635] #392 suggestions docs fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index de73eadc..505999c4 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ CSS classes and custom properties changed (just depreciated in v5) from camel to | isWaiting | `boolean` | `false` | Show LoadingIcon. `loadOptions` will override this | | listOffset | `number` | `5` | `px` space between select and list | | debounceWait | `number` | `300` | `milliseconds` debounce wait | -| suggestions | `boolean` | `false` | Show search suggestions before user input | +| suggestions | `array` | `null` | Show search suggestions before user input | ### Replaceable components @@ -324,7 +324,7 @@ You can also use the `inputStyles` prop to write in any override styles needed f ``` ### Replace styles (Tailwind, Bootstrap, Bulma etc) -If you'd like to supply your own styles use: `import Select from 'svelte-select/no-styles/Select.svelte'`. Then add you own somewhere in your code or build pipeline. There is a tailwind stylesheet via `import 'tailwind.css'`. It uses `@extend` so PostCSS is required (experimental, feedback welcome). +If you'd like to supply your own styles use: `import Select from 'svelte-select/no-styles/Select.svelte'`. Then somewhere in your code or build pipeline add your own. There is a tailwind stylesheet via `import 'svelte-select/tailwind.css'`. It uses `@extend` so PostCSS is required (experimental, feedback welcome). ## Events From 45d087c8ddb22c34e4a4cca360a2bd4b25ec0aee Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 09:49:04 +1000 Subject: [PATCH 366/635] dep bump --- package-lock.json | 2453 +++++++++++++++++++++++++++------------------ package.json | 22 +- 2 files changed, 1464 insertions(+), 1011 deletions(-) diff --git a/package-lock.json b/package-lock.json index d84bd8a4..9e94bb97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,26 +9,26 @@ "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", - "@sveltejs/kit": "1.0.0-next.295", - "autoprefixer": "^10.4.2", + "@sveltejs/kit": "1.0.0-next.310", + "autoprefixer": "^10.4.4", "cross-env": "^7.0.3", "find-in-files": "^0.5.0", - "prettier": "~2.5.1", - "prettier-plugin-svelte": "^2.6.0", - "release-it": "^14.12.5", - "rollup": "^2.70.0", + "prettier": "~2.6.2", + "prettier-plugin-svelte": "^2.7.0", + "release-it": "^14.14.2", + "rollup": "^2.70.1", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^2.0.2", - "svelte": "^3.46.4", - "svelte-preprocess": "^4.10.4", - "svelte-tiny-virtual-list": "^1.1.7", - "svelte2tsx": "^0.5.5", + "svelte": "^3.47.0", + "svelte-preprocess": "^4.10.5", + "svelte-tiny-virtual-list": "^2.0.3", + "svelte2tsx": "^0.5.8", "tape-modern": "^1.1.2", - "typescript": "^4.6.2" + "typescript": "^4.6.3" } }, "node_modules/@babel/code-frame": { @@ -343,26 +343,23 @@ "license": "MIT" }, "node_modules/@sindresorhus/is": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", - "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node": ">=6" } }, "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.295", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.295.tgz", - "integrity": "sha512-4pO/swXByhU+7bhNikTjh1d4QxAMP9TZ74p7sdPuyJf5cg7Zrfk1nBtaMt0R+8+5j1xfC/XWRcxa3WnhT9bQMA==", + "version": "1.0.0-next.310", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.310.tgz", + "integrity": "sha512-pTyMyaoyHS+V5cQZIQMfQXmLkhw1VaRwT9avOSgwDc0QBpnNw2LdzwoPYsUr96ca5B6cfT3SMUNolxErTNHmPQ==", "dev": true, "dependencies": { "@sveltejs/vite-plugin-svelte": "^1.0.0-next.32", "sade": "^1.7.4", - "vite": "^2.8.0" + "vite": "^2.9.0" }, "bin": { "svelte-kit": "svelte-kit.js" @@ -401,15 +398,15 @@ } }, "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, "dependencies": { - "defer-to-connect": "^2.0.0" + "defer-to-connect": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">=6" } }, "node_modules/@trysound/sax": { @@ -421,33 +418,6 @@ "node": ">=10.13.0" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "10.12.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", @@ -477,15 +447,6 @@ "@types/node": "*" } }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/sass": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz", @@ -549,6 +510,25 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/array.prototype.map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", + "integrity": "sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -565,14 +545,24 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -583,10 +573,6 @@ "engines": { "node": "^10 || ^12 || >=14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.1.0" } @@ -708,15 +694,25 @@ } }, "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" }, "bin": { @@ -724,10 +720,6 @@ }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/buffer": { @@ -776,28 +768,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", + "keyv": "^3.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "engines": { "node": ">=8" @@ -818,6 +801,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -865,14 +857,20 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001307", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001307.tgz", - "integrity": "sha512-+MXEMczJ4FuxJAUp0jvAl6Df0NI/OfW1RWEE61eSmzS7hw6lz4IKutbhbXendwq8BljfFuHtu26VWsg4afQ7Ng==", + "version": "1.0.30001327", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", + "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/chalk": { "version": "4.1.2", @@ -1270,9 +1268,9 @@ } }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -1296,30 +1294,15 @@ } }, "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" + "mimic-response": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/dedent-js": { @@ -1347,12 +1330,21 @@ } }, "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, "node_modules/delayed-stream": { @@ -1465,9 +1457,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.65", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.65.tgz", - "integrity": "sha512-0/d8Skk8sW3FxXP0Dd6MnBlrwx7Qo9cqQec3BlIAlvKnrmS3pHsIbaroEi+nd0kZkGpQ6apMEre7xndzjlEnLw==", + "version": "1.4.106", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", + "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", "dev": true }, "node_modules/emoji-regex": { @@ -1512,6 +1504,82 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", + "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -1519,9 +1587,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.25.tgz", - "integrity": "sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.34.tgz", + "integrity": "sha512-QIWdPT/gFF6hCaf4m7kP0cJ+JIuFkdHibI7vVFvu3eJS1HpVmYHWDulyN5WXwbRA0SX/7ZDaJ/1DH8SdY9xOJg==", "dev": true, "hasInstallScript": true, "bin": { @@ -1531,32 +1599,32 @@ "node": ">=12" }, "optionalDependencies": { - "esbuild-android-64": "0.14.25", - "esbuild-android-arm64": "0.14.25", - "esbuild-darwin-64": "0.14.25", - "esbuild-darwin-arm64": "0.14.25", - "esbuild-freebsd-64": "0.14.25", - "esbuild-freebsd-arm64": "0.14.25", - "esbuild-linux-32": "0.14.25", - "esbuild-linux-64": "0.14.25", - "esbuild-linux-arm": "0.14.25", - "esbuild-linux-arm64": "0.14.25", - "esbuild-linux-mips64le": "0.14.25", - "esbuild-linux-ppc64le": "0.14.25", - "esbuild-linux-riscv64": "0.14.25", - "esbuild-linux-s390x": "0.14.25", - "esbuild-netbsd-64": "0.14.25", - "esbuild-openbsd-64": "0.14.25", - "esbuild-sunos-64": "0.14.25", - "esbuild-windows-32": "0.14.25", - "esbuild-windows-64": "0.14.25", - "esbuild-windows-arm64": "0.14.25" + "esbuild-android-64": "0.14.34", + "esbuild-android-arm64": "0.14.34", + "esbuild-darwin-64": "0.14.34", + "esbuild-darwin-arm64": "0.14.34", + "esbuild-freebsd-64": "0.14.34", + "esbuild-freebsd-arm64": "0.14.34", + "esbuild-linux-32": "0.14.34", + "esbuild-linux-64": "0.14.34", + "esbuild-linux-arm": "0.14.34", + "esbuild-linux-arm64": "0.14.34", + "esbuild-linux-mips64le": "0.14.34", + "esbuild-linux-ppc64le": "0.14.34", + "esbuild-linux-riscv64": "0.14.34", + "esbuild-linux-s390x": "0.14.34", + "esbuild-netbsd-64": "0.14.34", + "esbuild-openbsd-64": "0.14.34", + "esbuild-sunos-64": "0.14.34", + "esbuild-windows-32": "0.14.34", + "esbuild-windows-64": "0.14.34", + "esbuild-windows-arm64": "0.14.34" } }, "node_modules/esbuild-android-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz", - "integrity": "sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.34.tgz", + "integrity": "sha512-XfxcfJqmMYsT/LXqrptzFxmaR3GWzXHDLdFNIhm6S00zPaQF1TBBWm+9t0RZ6LRR7iwH57DPjaOeW20vMqI4Yw==", "cpu": [ "x64" ], @@ -1570,9 +1638,9 @@ } }, "node_modules/esbuild-android-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz", - "integrity": "sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.34.tgz", + "integrity": "sha512-T02+NXTmSRL1Mc6puz+R9CB54rSPICkXKq6+tw8B6vxZFnCPzbJxgwIX4kcluz9p8nYBjF3+lSilTGWb7+Xgew==", "cpu": [ "arm64" ], @@ -1586,9 +1654,9 @@ } }, "node_modules/esbuild-darwin-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz", - "integrity": "sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.34.tgz", + "integrity": "sha512-pLRip2Bh4Ng7Bf6AMgCrSp3pPe/qZyf11h5Qo2mOfJqLWzSVjxrXW+CFRJfrOVP7TCnh/gmZSM2AFdCPB72vtw==", "cpu": [ "x64" ], @@ -1602,9 +1670,9 @@ } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz", - "integrity": "sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.34.tgz", + "integrity": "sha512-vpidSJEBxx6lf1NWgXC+DCmGqesJuZ5Y8aQVVsaoO4i8tRXbXb0whChRvop/zd3nfNM4dIl5EXAky0knRX5I6w==", "cpu": [ "arm64" ], @@ -1618,9 +1686,9 @@ } }, "node_modules/esbuild-freebsd-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz", - "integrity": "sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.34.tgz", + "integrity": "sha512-m0HBjePhe0hAQJgtMRMNV9kMgIyV4/qSnzPx42kRMQBcPhgjAq1JRu4Il26czC+9FgpMbFkUktb07f/Lwnc6CA==", "cpu": [ "x64" ], @@ -1634,9 +1702,9 @@ } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz", - "integrity": "sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.34.tgz", + "integrity": "sha512-cpRc2B94L1KvMPPYB4D6G39jLqpKlD3noAMY4/e86iXXXkhUYJJEtTuyNFTa9JRpWM0xCAp4mxjHjoIiLuoCLA==", "cpu": [ "arm64" ], @@ -1650,9 +1718,9 @@ } }, "node_modules/esbuild-linux-32": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz", - "integrity": "sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.34.tgz", + "integrity": "sha512-8nQaEaoW7MH/K/RlozJa+lE1ejHIr8fuPIHhc513UebRav7HtXgQvxHQ6VZRUkWtep23M6dd7UqhwO1tMOfzQQ==", "cpu": [ "ia32" ], @@ -1666,9 +1734,9 @@ } }, "node_modules/esbuild-linux-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz", - "integrity": "sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.34.tgz", + "integrity": "sha512-Y3of4qQoLLlAgf042MlrY1P+7PnN9zWj8nVtw9XQG5hcLOZLz7IKpU35oeu7n4wvyaZHwvQqDJ93gRLqdJekcQ==", "cpu": [ "x64" ], @@ -1682,9 +1750,9 @@ } }, "node_modules/esbuild-linux-arm": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz", - "integrity": "sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.34.tgz", + "integrity": "sha512-9lpq1NcJqssAF7alCO6zL3gvBVVt/lKw4oetUM7OgNnRX0OWpB+ZIO9FwCrSj/dMdmgDhPLf+119zB8QxSMmAg==", "cpu": [ "arm" ], @@ -1698,9 +1766,9 @@ } }, "node_modules/esbuild-linux-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz", - "integrity": "sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.34.tgz", + "integrity": "sha512-IlWaGtj9ir7+Nrume1DGcyzBDlK8GcnJq0ANKwcI9pVw8tqr+6GD0eqyF9SF1mR8UmAp+odrx1H5NdR2cHdFHA==", "cpu": [ "arm64" ], @@ -1714,9 +1782,9 @@ } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz", - "integrity": "sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.34.tgz", + "integrity": "sha512-k3or+01Rska1AjUyNjA4buEwB51eyN/xPQAoOx1CjzAQC3l8rpjUDw55kXyL63O/1MUi4ISvtNtl8gLwdyEcxw==", "cpu": [ "mips64el" ], @@ -1730,9 +1798,9 @@ } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz", - "integrity": "sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.34.tgz", + "integrity": "sha512-+qxb8M9FfM2CJaVU7GgYpJOHM1ngQOx+/VrtBjb4C8oVqaPcESCeg2anjl+HRZy8VpYc71q/iBYausPPbJ+Keg==", "cpu": [ "ppc64" ], @@ -1746,9 +1814,9 @@ } }, "node_modules/esbuild-linux-riscv64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz", - "integrity": "sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.34.tgz", + "integrity": "sha512-Y717ltBdQ5j5sZIHdy1DV9kieo0wMip0dCmVSTceowCPYSn1Cg33Kd6981+F/3b9FDMzNWldZFOBRILViENZSA==", "cpu": [ "riscv64" ], @@ -1762,9 +1830,9 @@ } }, "node_modules/esbuild-linux-s390x": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz", - "integrity": "sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.34.tgz", + "integrity": "sha512-bDDgYO4LhL4+zPs+WcBkXph+AQoPcQRTv18FzZS0WhjfH8TZx2QqlVPGhmhZ6WidrY+jKthUqO6UhGyIb4MpmA==", "cpu": [ "s390x" ], @@ -1778,9 +1846,9 @@ } }, "node_modules/esbuild-netbsd-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz", - "integrity": "sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.34.tgz", + "integrity": "sha512-cfaFGXdRt0+vHsjNPyF0POM4BVSHPSbhLPe8mppDc7GDDxjIl08mV1Zou14oDWMp/XZMjYN1kWYRSfftiD0vvQ==", "cpu": [ "x64" ], @@ -1794,9 +1862,9 @@ } }, "node_modules/esbuild-openbsd-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz", - "integrity": "sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.34.tgz", + "integrity": "sha512-vmy9DxXVnRiI14s8GKuYBtess+EVcDALkbpTqd5jw4XITutIzyB7n4x0Tj5utAkKsgZJB22lLWGekr0ABnSLow==", "cpu": [ "x64" ], @@ -1810,9 +1878,9 @@ } }, "node_modules/esbuild-sunos-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz", - "integrity": "sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.34.tgz", + "integrity": "sha512-eNPVatNET1F7tRMhii7goL/eptfxc0ALRjrj9SPFNqp0zmxrehBFD6BaP3R4LjMn6DbMO0jOAnTLFKr8NqcJAA==", "cpu": [ "x64" ], @@ -1826,9 +1894,9 @@ } }, "node_modules/esbuild-windows-32": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz", - "integrity": "sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.34.tgz", + "integrity": "sha512-EFhpXyHEcnqWYe2rAHFd8dRw8wkrd9U+9oqcyoEL84GbanAYjiiIjBZsnR8kl0sCQ5w6bLpk7vCEIA2VS32Vcg==", "cpu": [ "ia32" ], @@ -1842,9 +1910,9 @@ } }, "node_modules/esbuild-windows-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz", - "integrity": "sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.34.tgz", + "integrity": "sha512-a8fbl8Ky7PxNEjf1aJmtxdDZj32/hC7S1OcA2ckEpCJRTjiKslI9vAdPpSjrKIWhws4Galpaawy0nB7fjHYf5Q==", "cpu": [ "x64" ], @@ -1858,9 +1926,9 @@ } }, "node_modules/esbuild-windows-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz", - "integrity": "sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.34.tgz", + "integrity": "sha512-EYvmKbSa2B3sPnpC28UEu9jBK5atGV4BaVRE7CYGUci2Hlz4AvtV/LML+TcDMT6gBgibnN2gcltWclab3UutMg==", "cpu": [ "arm64" ], @@ -2058,9 +2126,9 @@ } }, "node_modules/fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, "engines": { "node": "*" @@ -2142,6 +2210,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/git-up": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", @@ -2210,28 +2294,46 @@ } }, "node_modules/got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" }, "engines": { - "node": ">=10.19.0" + "node": ">=8.6" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "engines": { + "node": ">=6" + } + }, + "node_modules/got/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/graceful-fs": { @@ -2253,6 +2355,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2263,10 +2374,25 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { "node": ">= 0.4" }, @@ -2289,19 +2415,6 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -2488,6 +2601,20 @@ "node": ">=8.0.0" } }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -2506,16 +2633,72 @@ "node": ">=8" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, "dependencies": { "ci-info": "^3.2.0" @@ -2536,6 +2719,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -2606,6 +2804,15 @@ "node": ">=8" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -2613,6 +2820,18 @@ "dev": true, "license": "MIT" }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-npm": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", @@ -2634,6 +2853,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -2661,12 +2895,49 @@ "node": ">=0.10.0" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ssh": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", @@ -2688,6 +2959,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -2706,6 +3007,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -2724,12 +3037,40 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2737,9 +3078,9 @@ "dev": true }, "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, "node_modules/json-parse-even-better-errors": { @@ -2761,12 +3102,12 @@ } }, "node_modules/keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "dependencies": { - "json-buffer": "3.0.1" + "json-buffer": "3.0.0" } }, "node_modules/kleur": { @@ -2978,21 +3319,21 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -3093,9 +3434,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -3148,9 +3489,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, "node_modules/normalize-range": { @@ -3199,14 +3540,41 @@ } }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3273,254 +3641,88 @@ }, "node_modules/os-name": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/package-json/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "dependencies": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/package-json/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "node_modules/package-json/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true, - "dependencies": { - "json-buffer": "3.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/package-json/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/package-json/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, "dependencies": { - "lowercase-keys": "^1.0.0" + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/package-json/node_modules/semver": { @@ -3649,21 +3851,27 @@ } }, "node_modules/postcss": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", - "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], "dependencies": { - "nanoid": "^3.2.0", + "nanoid": "^3.3.1", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" } }, "node_modules/postcss-calc": { @@ -4224,27 +4432,50 @@ } }, "node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-plugin-svelte": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.6.0.tgz", - "integrity": "sha512-NPSRf6Y5rufRlBleok/pqg4+1FyGsL0zYhkYP6hnueeL1J/uCm3OfOZPsLX4zqD9VAdcXfyEL2PYqGv8ZoOSfA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz", + "integrity": "sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==", "dev": true, "peerDependencies": { "prettier": "^1.16.4 || ^2.0.0", "svelte": "^3.2.0" } }, + "node_modules/promise.allsettled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.5.tgz", + "integrity": "sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==", + "dev": true, + "dependencies": { + "array.prototype.map": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/promise.series": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", @@ -4346,18 +4577,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -4430,9 +4649,9 @@ } }, "node_modules/release-it": { - "version": "14.12.5", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.12.5.tgz", - "integrity": "sha512-mGFbbX8eEKMOhfjq5mZAgGppT8CME1T+vj6xA5tAPYSCuPpcNEDjqiG1tJfPy/XImZI4uS3U6pNP5KyDpy9etg==", + "version": "14.14.2", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.14.2.tgz", + "integrity": "sha512-+TE5Zg7x5BE/xw6i8SN9rmsGxCE2GVqH1v8Ay1L09nsLQx1HJhihAqUtCCDdgOuLvGpX0xgDMsSzakDlDLpOkA==", "dev": true, "dependencies": { "@iarna/toml": "2.2.5", @@ -4440,27 +4659,29 @@ "async-retry": "1.3.3", "chalk": "4.1.2", "cosmiconfig": "7.0.1", - "debug": "4.3.3", + "debug": "4.3.4", "execa": "5.1.1", "form-data": "4.0.0", "git-url-parse": "11.6.0", "globby": "11.0.4", - "got": "11.8.3", + "got": "9.6.0", "import-cwd": "3.0.0", "inquirer": "8.2.0", "is-ci": "3.0.1", "lodash": "4.17.21", - "mime-types": "2.1.34", + "mime-types": "2.1.35", "new-github-release-url": "1.0.0", "open": "7.4.2", "ora": "5.4.1", "os-name": "4.0.1", "parse-json": "5.2.0", + "promise.allsettled": "1.0.5", "semver": "7.3.5", "shelljs": "0.8.5", "update-notifier": "5.1.0", "url-join": "4.0.1", "uuid": "8.3.2", + "wildcard-match": "5.1.2", "yaml": "1.10.2", "yargs-parser": "20.2.9" }, @@ -4524,12 +4745,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -4540,12 +4755,21 @@ } }, "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "dependencies": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/restore-cursor": { @@ -4581,9 +4805,9 @@ } }, "node_modules/rollup": { - "version": "2.70.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.0.tgz", - "integrity": "sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==", + "version": "2.70.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", + "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5079,6 +5303,32 @@ "node": ">=8" } }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5156,9 +5406,9 @@ } }, "node_modules/svelte": { - "version": "3.46.4", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz", - "integrity": "sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.47.0.tgz", + "integrity": "sha512-4JaJp3HEoTCGARRWZQIZDUanhYv0iyoHikklVHVLH9xFE9db22g4TDv7CPeNA8HD1JgjXI1vlhR1JZvvhaTu2Q==", "dev": true, "engines": { "node": ">= 8" @@ -5174,9 +5424,9 @@ } }, "node_modules/svelte-preprocess": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.4.tgz", - "integrity": "sha512-fuwol0N4UoHsNQolLFbMqWivqcJ9N0vfWO9IuPAiX/5okfoGXURyJ6nECbuEIv0nU3M8Xe2I1ONNje2buk7l6A==", + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.5.tgz", + "integrity": "sha512-VKXPRScCzAZqeBZOGq4LLwtNrAu++mVn7XvQox3eFDV7Ciq0Lg70Q8QWjH9iXF7J+pMlXhPsSFwpCb2E+hoeyA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5240,15 +5490,15 @@ } }, "node_modules/svelte-tiny-virtual-list": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-1.1.7.tgz", - "integrity": "sha512-8314cmLXOVqIQwSc3NFu8yGU7BdHEJeixrwFirmnMoWl6YNcCq5jVjCKjE3tDNJfUenz1LN5M5YshPt6GcPuww==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.3.tgz", + "integrity": "sha512-f2V8xlB+5bnsQ2w02MqQvD/vTUrVr1QLacbDU8DNVNby/YMKX8b8IOft//eJId9Wv3ATaiIpnFpRD5ojt9MYtw==", "dev": true }, "node_modules/svelte2tsx": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.5.tgz", - "integrity": "sha512-5n8jP721bM3vXPk36AM9diZg2aasLvsfP/Zt9CQVrcqcnzexOYVeS8kpGk+3mofOPvPvXnOCLdff62usI/KOMw==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.8.tgz", + "integrity": "sha512-z5Mfpmy/jkpFIiePAocgWxGRJg+Ka0zlxyvFlpP2X1BoQuXjFC6pnIR9CGebOTmi+W1JnSUAdxrCCj/sEMXZ8Q==", "dev": true, "dependencies": { "dedent-js": "^1.0.1", @@ -5387,9 +5637,9 @@ } }, "node_modules/typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5399,6 +5649,21 @@ "node": ">=4.2.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/uniqs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", @@ -5513,13 +5778,13 @@ } }, "node_modules/vite": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz", - "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.1.tgz", + "integrity": "sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==", "dev": true, "dependencies": { - "esbuild": "^0.14.14", - "postcss": "^8.4.6", + "esbuild": "^0.14.27", + "postcss": "^8.4.12", "resolve": "^1.22.0", "rollup": "^2.59.0" }, @@ -5589,6 +5854,22 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -5601,6 +5882,12 @@ "node": ">=8" } }, + "node_modules/wildcard-match": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", + "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", + "dev": true + }, "node_modules/windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", @@ -6002,20 +6289,20 @@ } }, "@sindresorhus/is": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", - "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, "@sveltejs/kit": { - "version": "1.0.0-next.295", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.295.tgz", - "integrity": "sha512-4pO/swXByhU+7bhNikTjh1d4QxAMP9TZ74p7sdPuyJf5cg7Zrfk1nBtaMt0R+8+5j1xfC/XWRcxa3WnhT9bQMA==", + "version": "1.0.0-next.310", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.310.tgz", + "integrity": "sha512-pTyMyaoyHS+V5cQZIQMfQXmLkhw1VaRwT9avOSgwDc0QBpnNw2LdzwoPYsUr96ca5B6cfT3SMUNolxErTNHmPQ==", "dev": true, "requires": { "@sveltejs/vite-plugin-svelte": "^1.0.0-next.32", "sade": "^1.7.4", - "vite": "^2.8.0" + "vite": "^2.9.0" } }, "@sveltejs/vite-plugin-svelte": { @@ -6032,12 +6319,12 @@ } }, "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, "requires": { - "defer-to-connect": "^2.0.0" + "defer-to-connect": "^1.0.1" } }, "@trysound/sax": { @@ -6046,33 +6333,6 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/node": { "version": "10.12.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", @@ -6100,15 +6360,6 @@ "@types/node": "*" } }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/sass": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz", @@ -6157,6 +6408,19 @@ "color-convert": "^2.0.1" } }, + "array.prototype.map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", + "integrity": "sha512-Qds9QnX7A0qISY7JT5WuJO0NJPE9CMlC6JzHQfhpqAAQQzufVRoeH7EzUY5GcPTx72voG8LV/5eo+b8Qi8hmhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, "async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -6173,14 +6437,14 @@ "dev": true }, "autoprefixer": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", - "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", "dev": true, "requires": { - "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001297", - "fraction.js": "^4.1.2", + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -6271,15 +6535,15 @@ } }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" } }, @@ -6305,25 +6569,19 @@ "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", + "keyv": "^3.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "dependencies": { "get-stream": { @@ -6334,6 +6592,12 @@ "requires": { "pump": "^3.0.0" } + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true } } }, @@ -6372,9 +6636,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001307", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001307.tgz", - "integrity": "sha512-+MXEMczJ4FuxJAUp0jvAl6Df0NI/OfW1RWEE61eSmzS7hw6lz4IKutbhbXendwq8BljfFuHtu26VWsg4afQ7Ng==", + "version": "1.0.30001327", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", + "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", "dev": true }, "chalk": { @@ -6666,9 +6930,9 @@ } }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -6681,20 +6945,12 @@ "dev": true }, "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } + "mimic-response": "^1.0.0" } }, "dedent-js": { @@ -6719,11 +6975,20 @@ } }, "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6804,9 +7069,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.65", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.65.tgz", - "integrity": "sha512-0/d8Skk8sW3FxXP0Dd6MnBlrwx7Qo9cqQec3BlIAlvKnrmS3pHsIbaroEi+nd0kZkGpQ6apMEre7xndzjlEnLw==", + "version": "1.4.106", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", + "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", "dev": true }, "emoji-regex": { @@ -6842,7 +7107,68 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", + "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es6-promise": { @@ -6852,170 +7178,170 @@ "dev": true }, "esbuild": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.25.tgz", - "integrity": "sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==", - "dev": true, - "requires": { - "esbuild-android-64": "0.14.25", - "esbuild-android-arm64": "0.14.25", - "esbuild-darwin-64": "0.14.25", - "esbuild-darwin-arm64": "0.14.25", - "esbuild-freebsd-64": "0.14.25", - "esbuild-freebsd-arm64": "0.14.25", - "esbuild-linux-32": "0.14.25", - "esbuild-linux-64": "0.14.25", - "esbuild-linux-arm": "0.14.25", - "esbuild-linux-arm64": "0.14.25", - "esbuild-linux-mips64le": "0.14.25", - "esbuild-linux-ppc64le": "0.14.25", - "esbuild-linux-riscv64": "0.14.25", - "esbuild-linux-s390x": "0.14.25", - "esbuild-netbsd-64": "0.14.25", - "esbuild-openbsd-64": "0.14.25", - "esbuild-sunos-64": "0.14.25", - "esbuild-windows-32": "0.14.25", - "esbuild-windows-64": "0.14.25", - "esbuild-windows-arm64": "0.14.25" + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.34.tgz", + "integrity": "sha512-QIWdPT/gFF6hCaf4m7kP0cJ+JIuFkdHibI7vVFvu3eJS1HpVmYHWDulyN5WXwbRA0SX/7ZDaJ/1DH8SdY9xOJg==", + "dev": true, + "requires": { + "esbuild-android-64": "0.14.34", + "esbuild-android-arm64": "0.14.34", + "esbuild-darwin-64": "0.14.34", + "esbuild-darwin-arm64": "0.14.34", + "esbuild-freebsd-64": "0.14.34", + "esbuild-freebsd-arm64": "0.14.34", + "esbuild-linux-32": "0.14.34", + "esbuild-linux-64": "0.14.34", + "esbuild-linux-arm": "0.14.34", + "esbuild-linux-arm64": "0.14.34", + "esbuild-linux-mips64le": "0.14.34", + "esbuild-linux-ppc64le": "0.14.34", + "esbuild-linux-riscv64": "0.14.34", + "esbuild-linux-s390x": "0.14.34", + "esbuild-netbsd-64": "0.14.34", + "esbuild-openbsd-64": "0.14.34", + "esbuild-sunos-64": "0.14.34", + "esbuild-windows-32": "0.14.34", + "esbuild-windows-64": "0.14.34", + "esbuild-windows-arm64": "0.14.34" } }, "esbuild-android-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz", - "integrity": "sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.34.tgz", + "integrity": "sha512-XfxcfJqmMYsT/LXqrptzFxmaR3GWzXHDLdFNIhm6S00zPaQF1TBBWm+9t0RZ6LRR7iwH57DPjaOeW20vMqI4Yw==", "dev": true, "optional": true }, "esbuild-android-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz", - "integrity": "sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.34.tgz", + "integrity": "sha512-T02+NXTmSRL1Mc6puz+R9CB54rSPICkXKq6+tw8B6vxZFnCPzbJxgwIX4kcluz9p8nYBjF3+lSilTGWb7+Xgew==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz", - "integrity": "sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.34.tgz", + "integrity": "sha512-pLRip2Bh4Ng7Bf6AMgCrSp3pPe/qZyf11h5Qo2mOfJqLWzSVjxrXW+CFRJfrOVP7TCnh/gmZSM2AFdCPB72vtw==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz", - "integrity": "sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.34.tgz", + "integrity": "sha512-vpidSJEBxx6lf1NWgXC+DCmGqesJuZ5Y8aQVVsaoO4i8tRXbXb0whChRvop/zd3nfNM4dIl5EXAky0knRX5I6w==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz", - "integrity": "sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.34.tgz", + "integrity": "sha512-m0HBjePhe0hAQJgtMRMNV9kMgIyV4/qSnzPx42kRMQBcPhgjAq1JRu4Il26czC+9FgpMbFkUktb07f/Lwnc6CA==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz", - "integrity": "sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.34.tgz", + "integrity": "sha512-cpRc2B94L1KvMPPYB4D6G39jLqpKlD3noAMY4/e86iXXXkhUYJJEtTuyNFTa9JRpWM0xCAp4mxjHjoIiLuoCLA==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz", - "integrity": "sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.34.tgz", + "integrity": "sha512-8nQaEaoW7MH/K/RlozJa+lE1ejHIr8fuPIHhc513UebRav7HtXgQvxHQ6VZRUkWtep23M6dd7UqhwO1tMOfzQQ==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz", - "integrity": "sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.34.tgz", + "integrity": "sha512-Y3of4qQoLLlAgf042MlrY1P+7PnN9zWj8nVtw9XQG5hcLOZLz7IKpU35oeu7n4wvyaZHwvQqDJ93gRLqdJekcQ==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz", - "integrity": "sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.34.tgz", + "integrity": "sha512-9lpq1NcJqssAF7alCO6zL3gvBVVt/lKw4oetUM7OgNnRX0OWpB+ZIO9FwCrSj/dMdmgDhPLf+119zB8QxSMmAg==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz", - "integrity": "sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.34.tgz", + "integrity": "sha512-IlWaGtj9ir7+Nrume1DGcyzBDlK8GcnJq0ANKwcI9pVw8tqr+6GD0eqyF9SF1mR8UmAp+odrx1H5NdR2cHdFHA==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz", - "integrity": "sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.34.tgz", + "integrity": "sha512-k3or+01Rska1AjUyNjA4buEwB51eyN/xPQAoOx1CjzAQC3l8rpjUDw55kXyL63O/1MUi4ISvtNtl8gLwdyEcxw==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz", - "integrity": "sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.34.tgz", + "integrity": "sha512-+qxb8M9FfM2CJaVU7GgYpJOHM1ngQOx+/VrtBjb4C8oVqaPcESCeg2anjl+HRZy8VpYc71q/iBYausPPbJ+Keg==", "dev": true, "optional": true }, "esbuild-linux-riscv64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz", - "integrity": "sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.34.tgz", + "integrity": "sha512-Y717ltBdQ5j5sZIHdy1DV9kieo0wMip0dCmVSTceowCPYSn1Cg33Kd6981+F/3b9FDMzNWldZFOBRILViENZSA==", "dev": true, "optional": true }, "esbuild-linux-s390x": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz", - "integrity": "sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.34.tgz", + "integrity": "sha512-bDDgYO4LhL4+zPs+WcBkXph+AQoPcQRTv18FzZS0WhjfH8TZx2QqlVPGhmhZ6WidrY+jKthUqO6UhGyIb4MpmA==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz", - "integrity": "sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.34.tgz", + "integrity": "sha512-cfaFGXdRt0+vHsjNPyF0POM4BVSHPSbhLPe8mppDc7GDDxjIl08mV1Zou14oDWMp/XZMjYN1kWYRSfftiD0vvQ==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz", - "integrity": "sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.34.tgz", + "integrity": "sha512-vmy9DxXVnRiI14s8GKuYBtess+EVcDALkbpTqd5jw4XITutIzyB7n4x0Tj5utAkKsgZJB22lLWGekr0ABnSLow==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz", - "integrity": "sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.34.tgz", + "integrity": "sha512-eNPVatNET1F7tRMhii7goL/eptfxc0ALRjrj9SPFNqp0zmxrehBFD6BaP3R4LjMn6DbMO0jOAnTLFKr8NqcJAA==", "dev": true, "optional": true }, "esbuild-windows-32": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz", - "integrity": "sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.34.tgz", + "integrity": "sha512-EFhpXyHEcnqWYe2rAHFd8dRw8wkrd9U+9oqcyoEL84GbanAYjiiIjBZsnR8kl0sCQ5w6bLpk7vCEIA2VS32Vcg==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz", - "integrity": "sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.34.tgz", + "integrity": "sha512-a8fbl8Ky7PxNEjf1aJmtxdDZj32/hC7S1OcA2ckEpCJRTjiKslI9vAdPpSjrKIWhws4Galpaawy0nB7fjHYf5Q==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.14.25", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz", - "integrity": "sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==", + "version": "0.14.34", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.34.tgz", + "integrity": "sha512-EYvmKbSa2B3sPnpC28UEu9jBK5atGV4BaVRE7CYGUci2Hlz4AvtV/LML+TcDMT6gBgibnN2gcltWclab3UutMg==", "dev": true, "optional": true }, @@ -7165,9 +7491,9 @@ } }, "fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true }, "fs.realpath": { @@ -7221,6 +7547,16 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "git-up": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", @@ -7273,22 +7609,39 @@ } }, "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } } }, "graceful-fs": { @@ -7306,6 +7659,12 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7313,11 +7672,20 @@ "dev": true }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -7330,16 +7698,6 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7472,6 +7830,17 @@ "through": "^2.3.6" } }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -7484,12 +7853,47 @@ "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, "is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -7508,6 +7912,15 @@ "has": "^1.0.3" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -7551,12 +7964,24 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, "is-npm": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", @@ -7569,6 +7994,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -7587,12 +8021,37 @@ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-ssh": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", @@ -7608,6 +8067,24 @@ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -7620,6 +8097,15 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -7635,12 +8121,34 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7648,9 +8156,9 @@ "dev": true }, "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, "json-parse-even-better-errors": { @@ -7669,12 +8177,12 @@ } }, "keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "requires": { - "json-buffer": "3.0.1" + "json-buffer": "3.0.0" } }, "kleur": { @@ -7840,18 +8348,18 @@ } }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -7927,9 +8435,9 @@ "dev": true }, "nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", "dev": true }, "new-github-release-url": { @@ -7969,9 +8477,9 @@ } }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, "normalize-range": { @@ -8005,11 +8513,29 @@ } }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8072,9 +8598,9 @@ "dev": true }, "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, "p-finally": { @@ -8114,142 +8640,6 @@ "semver": "^6.2.0" }, "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - } - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - } - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -8350,12 +8740,12 @@ "dev": true }, "postcss": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", - "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, "requires": { - "nanoid": "^3.2.0", + "nanoid": "^3.3.1", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -8716,18 +9106,32 @@ "dev": true }, "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz", + "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==", "dev": true }, "prettier-plugin-svelte": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.6.0.tgz", - "integrity": "sha512-NPSRf6Y5rufRlBleok/pqg4+1FyGsL0zYhkYP6hnueeL1J/uCm3OfOZPsLX4zqD9VAdcXfyEL2PYqGv8ZoOSfA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz", + "integrity": "sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==", "dev": true, "requires": {} }, + "promise.allsettled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.5.tgz", + "integrity": "sha512-tVDqeZPoBC0SlzJHzWGZ2NKAguVq2oiYj7gbggbiTvH2itHohijTp7njOUA0aQ/nl+0lr/r6egmhoYu63UZ/pQ==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "iterate-value": "^1.0.2" + } + }, "promise.series": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", @@ -8792,12 +9196,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -8857,9 +9255,9 @@ } }, "release-it": { - "version": "14.12.5", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.12.5.tgz", - "integrity": "sha512-mGFbbX8eEKMOhfjq5mZAgGppT8CME1T+vj6xA5tAPYSCuPpcNEDjqiG1tJfPy/XImZI4uS3U6pNP5KyDpy9etg==", + "version": "14.14.2", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.14.2.tgz", + "integrity": "sha512-+TE5Zg7x5BE/xw6i8SN9rmsGxCE2GVqH1v8Ay1L09nsLQx1HJhihAqUtCCDdgOuLvGpX0xgDMsSzakDlDLpOkA==", "dev": true, "requires": { "@iarna/toml": "2.2.5", @@ -8867,27 +9265,29 @@ "async-retry": "1.3.3", "chalk": "4.1.2", "cosmiconfig": "7.0.1", - "debug": "4.3.3", + "debug": "4.3.4", "execa": "5.1.1", "form-data": "4.0.0", "git-url-parse": "11.6.0", "globby": "11.0.4", - "got": "11.8.3", + "got": "9.6.0", "import-cwd": "3.0.0", "inquirer": "8.2.0", "is-ci": "3.0.1", "lodash": "4.17.21", - "mime-types": "2.1.34", + "mime-types": "2.1.35", "new-github-release-url": "1.0.0", "open": "7.4.2", "ora": "5.4.1", "os-name": "4.0.1", "parse-json": "5.2.0", + "promise.allsettled": "1.0.5", "semver": "7.3.5", "shelljs": "0.8.5", "update-notifier": "5.1.0", "url-join": "4.0.1", "uuid": "8.3.2", + "wildcard-match": "5.1.2", "yaml": "1.10.2", "yargs-parser": "20.2.9" }, @@ -8931,12 +9331,6 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -8944,12 +9338,20 @@ "dev": true }, "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "requires": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^1.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } } }, "restore-cursor": { @@ -8975,9 +9377,9 @@ "dev": true }, "rollup": { - "version": "2.70.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.0.tgz", - "integrity": "sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==", + "version": "2.70.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", + "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -9337,6 +9739,26 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -9390,9 +9812,9 @@ "dev": true }, "svelte": { - "version": "3.46.4", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz", - "integrity": "sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.47.0.tgz", + "integrity": "sha512-4JaJp3HEoTCGARRWZQIZDUanhYv0iyoHikklVHVLH9xFE9db22g4TDv7CPeNA8HD1JgjXI1vlhR1JZvvhaTu2Q==", "dev": true }, "svelte-hmr": { @@ -9403,9 +9825,9 @@ "requires": {} }, "svelte-preprocess": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.4.tgz", - "integrity": "sha512-fuwol0N4UoHsNQolLFbMqWivqcJ9N0vfWO9IuPAiX/5okfoGXURyJ6nECbuEIv0nU3M8Xe2I1ONNje2buk7l6A==", + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.5.tgz", + "integrity": "sha512-VKXPRScCzAZqeBZOGq4LLwtNrAu++mVn7XvQox3eFDV7Ciq0Lg70Q8QWjH9iXF7J+pMlXhPsSFwpCb2E+hoeyA==", "dev": true, "requires": { "@types/pug": "^2.0.4", @@ -9417,15 +9839,15 @@ } }, "svelte-tiny-virtual-list": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-1.1.7.tgz", - "integrity": "sha512-8314cmLXOVqIQwSc3NFu8yGU7BdHEJeixrwFirmnMoWl6YNcCq5jVjCKjE3tDNJfUenz1LN5M5YshPt6GcPuww==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.3.tgz", + "integrity": "sha512-f2V8xlB+5bnsQ2w02MqQvD/vTUrVr1QLacbDU8DNVNby/YMKX8b8IOft//eJId9Wv3ATaiIpnFpRD5ojt9MYtw==", "dev": true }, "svelte2tsx": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.5.tgz", - "integrity": "sha512-5n8jP721bM3vXPk36AM9diZg2aasLvsfP/Zt9CQVrcqcnzexOYVeS8kpGk+3mofOPvPvXnOCLdff62usI/KOMw==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.8.tgz", + "integrity": "sha512-z5Mfpmy/jkpFIiePAocgWxGRJg+Ka0zlxyvFlpP2X1BoQuXjFC6pnIR9CGebOTmi+W1JnSUAdxrCCj/sEMXZ8Q==", "dev": true, "requires": { "dedent-js": "^1.0.1", @@ -9534,11 +9956,23 @@ } }, "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "uniqs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", @@ -9633,14 +10067,14 @@ "dev": true }, "vite": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz", - "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.1.tgz", + "integrity": "sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==", "dev": true, "requires": { - "esbuild": "^0.14.14", + "esbuild": "^0.14.27", "fsevents": "~2.3.2", - "postcss": "^8.4.6", + "postcss": "^8.4.12", "resolve": "^1.22.0", "rollup": "^2.59.0" } @@ -9679,6 +10113,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -9688,6 +10135,12 @@ "string-width": "^4.0.0" } }, + "wildcard-match": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", + "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", + "dev": true + }, "windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", diff --git a/package.json b/package.json index f85f980f..31002316 100644 --- a/package.json +++ b/package.json @@ -17,26 +17,26 @@ }, "devDependencies": { "@rollup/plugin-alias": "^3.1.9", - "@sveltejs/kit": "1.0.0-next.295", - "autoprefixer": "^10.4.2", + "@sveltejs/kit": "1.0.0-next.310", + "autoprefixer": "^10.4.4", "cross-env": "^7.0.3", "find-in-files": "^0.5.0", - "prettier": "~2.5.1", - "prettier-plugin-svelte": "^2.6.0", - "release-it": "^14.12.5", - "rollup": "^2.70.0", + "prettier": "~2.6.2", + "prettier-plugin-svelte": "^2.7.0", + "release-it": "^14.14.2", + "rollup": "^2.70.1", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^2.0.2", - "svelte": "^3.46.4", - "svelte-preprocess": "^4.10.4", - "svelte-tiny-virtual-list": "^1.1.7", - "svelte2tsx": "^0.5.5", + "svelte": "^3.47.0", + "svelte-preprocess": "^4.10.5", + "svelte-tiny-virtual-list": "^2.0.3", + "svelte2tsx": "^0.5.8", "tape-modern": "^1.1.2", - "typescript": "^4.6.2" + "typescript": "^4.6.3" }, "author": "Robert Balfré (https://github.com/rob-balfre)", "license": "ISC", From 43cf46ffcbef791ee2ee47a96e3273c636a0f60e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 09:49:09 +1000 Subject: [PATCH 367/635] clean up --- src/routes/index.svelte | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/routes/index.svelte b/src/routes/index.svelte index 94dc707f..02fc3ec0 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -1,23 +1,9 @@
-
From f4bf2b7ebe4ddb9824a67992427de1dbccd31595 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 09:50:17 +1000 Subject: [PATCH 368/635] Release 5.0.0-beta.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e94bb97..3375b17c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "svelte-select", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 31002316..80ed419b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A ``` -CSS classes and custom properties changed (just depreciated in v5) from camel to kebab case. For example `selectedItem` → `selected-item` and `--borderRadius` → `--border-radius` +CSS classes and custom properties changed (ONLY depreciated in v5, no need to update to use v5) from camel to kebab case. For example `selectedItem` → `selected-item` and `--borderRadius` → `--border-radius` ### Other CSS class name changes: `selectContainer` → `svelte-select`
From ecd170903e5912d7dd60e1277d8f000f55f60d56 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 10:49:39 +1000 Subject: [PATCH 371/635] VirtualList docs fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc771953..0d99221f 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Removed `isVirtualList` instead `npm i svelte-tiny-virtual-list -D` and import VirtualList from 'svelte-tiny-virtual-list'; - ``` CSS classes and custom properties changed (ONLY depreciated in v5, no need to update to use v5) from camel to kebab case. For example `selectedItem` → `selected-item` and `--borderRadius` → `--border-radius` From 38b09c60abc6f142b4f9694fbe6c996dbe02b7a5 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 11:04:40 +1000 Subject: [PATCH 372/635] #336 itemCreated docs --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0d99221f..87caee7e 100644 --- a/README.md +++ b/README.md @@ -333,6 +333,7 @@ If you'd like to supply your own styles use: `import Select from 'svelte-select/ | blur | { detail } | fires when select > input on:blur | | clear | { detail } | fires when clear all is invoked or item is removed (by user) from multi select | | loaded | { options } | fires when `loadOptions` resolves | +| itemCreated| { options } | fires when `isCreatable` true and item is created | error | { type, details } | fires when error is caught | ## Development From 5c9f5e09ab3569c60ea63d0cb82985640117b95b Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 13:24:07 +1000 Subject: [PATCH 373/635] #331 group headers hover index fix --- src/lib/List.svelte | 5 +++++ test/src/tests.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/lib/List.svelte b/src/lib/List.svelte index f97a1755..6b19c25e 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -51,6 +51,8 @@ }, false ); + + if (hoverItemIndex === 0 && items[hoverItemIndex] && items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable) hoverItemIndex = 1; }); beforeUpdate(() => { @@ -120,10 +122,13 @@ case 'ArrowDown': e.preventDefault(); items.length && updateHoverItem(1); + if (items[hoverItemIndex] && items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable) hoverItemIndex += 1; break; case 'ArrowUp': e.preventDefault(); items.length && updateHoverItem(-1); + if (items[hoverItemIndex] && items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable) hoverItemIndex > 0 ? hoverItemIndex -= 1 : hoverItemIndex = items.length - 1; + break; case 'Enter': e.preventDefault(); diff --git a/test/src/tests.js b/test/src/tests.js index e44eeb78..bab44579 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -4084,5 +4084,36 @@ test('when component blurs fire on:blur event', async (t) => { t.ok(b); + select.$destroy(); +}); + + +test('when group header is not selectable then update hoverItemIndex to next/prev item', async (t) => { + const select = new Select({ + target, + props: { + listOpen: true, + items: itemsWithGroup, + isGroupHeaderSelectable: false, + groupBy, + } + }); + + function groupBy(item) { + return item.group; + } + + const firstItem = document.querySelector('.list .list-item .item.hover'); + t.ok(firstItem.innerHTML === 'Chocolate'); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + await wait(0); + const secondItem = document.querySelector('.list .list-item .item.hover'); + t.ok(secondItem.innerHTML === 'Pizza'); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowUp'})); + await wait(0); + const thirdItem = document.querySelector('.list .list-item .item.hover'); + t.ok(thirdItem.innerHTML === 'Ice Cream'); select.$destroy(); }); \ No newline at end of file From 1ebeea6743c35a4da03a0c3b727d933f6911680f Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 13:24:53 +1000 Subject: [PATCH 374/635] Release 5.0.0-beta.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3375b17c..ae1d9994 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "svelte-select", - "version": "5.0.0-beta.2", + "version": "5.0.0-beta.3", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "5.0.0-beta.2", + "version": "5.0.0-beta.3", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 80ed419b..884cc13e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.2", + "version": "5.0.0-beta.3", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A + {/if} {#if isMulti && showMultiSelect} {#each value as item} - + {/each} {/if}
diff --git a/test/src/tests.js b/test/src/tests.js index bab44579..27ff75ad 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -3709,7 +3709,7 @@ test('When no value then hidden field should also have no value', async (t) => { select.$destroy(); }); -test('When value then hidden field should have value.label', async (t) => { +test('When value then hidden field should have value', async (t) => { const select = new Select({ target, props: { @@ -3720,7 +3720,7 @@ test('When value then hidden field should have value.label', async (t) => { }); let hidden = document.querySelector('input[type="hidden"]').value; - t.equal(hidden, 'Cake'); + t.equal(hidden, 'cake'); select.$destroy(); }); @@ -3753,8 +3753,8 @@ test('When isMulti and value then hidden fields should list value items', async }); let hidden = document.querySelectorAll('input[type="hidden"]'); - t.equal(hidden[0].value, 'Cake'); - t.equal(hidden[1].value, 'Pizza'); + t.equal(hidden[0].value, 'cake'); + t.equal(hidden[1].value, 'pizza'); select.$destroy(); }); From b9b0b4f134cb01106ff3af31085dd2b5b52da84c Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 13:36:30 +1000 Subject: [PATCH 376/635] Release 5.0.0-beta.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae1d9994..e66d31e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "svelte-select", - "version": "5.0.0-beta.3", + "version": "5.0.0-beta.4", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "5.0.0-beta.3", + "version": "5.0.0-beta.4", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 884cc13e..1e21afb6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.3", + "version": "5.0.0-beta.4", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A ``` -### Replace styles (Tailwind, Bootstrap, Bulma etc) -If you'd like to supply your own styles use: `import Select from 'svelte-select/no-styles/Select.svelte'`. Then somewhere in your code or build pipeline add your own. There is a tailwind stylesheet via `import 'svelte-select/tailwind.css'`. It uses `@extend` so PostCSS is required (experimental, feedback welcome). - -## Events +### 🧪 Experimental: Replace styles (Tailwind, Bootstrap, Bulma etc) +If you'd like to supply your own styles use: `import Select from 'svelte-select/no-styles/Select.svelte'`. Then somewhere in your code or build pipeline add your own. There is a tailwind stylesheet via `import 'svelte-select/tailwind.css'`. It uses `@extend` so PostCSS is required. -| Event Name | Callback | Description | -| ---------- | ----------------- | ------------------------------------------------------------------------------ | -| select | { detail } | fires when value changes | -| focus | { detail } | fires when select > input on:focus | -| blur | { detail } | fires when select > input on:blur | -| clear | { detail } | fires when clear all is invoked or item is removed (by user) from multi select | -| loaded | { options } | fires when `loadOptions` resolves | -| itemCreated| { options } | fires when `isCreatable` true and item is created -| error | { type, details } | fires when error is caught | ## Development From b3b5aee4dfb669610071e79d249ce701d264b6bb Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 12 Apr 2022 14:25:11 +1000 Subject: [PATCH 379/635] Release 5.0.0-beta.5 --- docs/theming_variables.md | 1 + package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index c824efaa..b883236f 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -84,6 +84,7 @@ Override the following CSS custom properties (variables) to style svelte-select - `--padding` - `--placeholder-color` - `--placeholder-opacity` +- `--selected-item-color` - `--selected-item-padding` - `--spinner-color` - `--spinner-height` diff --git a/package-lock.json b/package-lock.json index e66d31e4..4257caa3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "svelte-select", - "version": "5.0.0-beta.4", + "version": "5.0.0-beta.5", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "5.0.0-beta.4", + "version": "5.0.0-beta.5", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 1e21afb6..90cc5cc3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.4", + "version": "5.0.0-beta.5", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "scripts": { From bc653e95220e38617f1cd0dab373895ea95fa722 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 13 Apr 2022 08:12:43 +1000 Subject: [PATCH 382/635] Bump minimist --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a24ee88a..beb90887 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3380,8 +3380,8 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, @@ -3391,7 +3391,7 @@ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -8390,8 +8390,8 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, @@ -8401,7 +8401,7 @@ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "mri": { From d874048526628dd54fa1f2ca8bf55bd401ee887c Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Wed, 13 Apr 2022 08:34:37 +1000 Subject: [PATCH 383/635] Docs and CSS clean up --- README.md | 40 +++++++++++++++++++++++++++++++++++++++- src/lib/ClearIcon.svelte | 2 +- src/lib/Multi.svelte | 2 +- src/lib/Select.svelte | 28 +--------------------------- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 8b8fae47..0bbc4b55 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,9 @@ ## Demo -[✨ REPL Demo ✨](https://svelte.dev/repl/c3bbe052fdfc4e87a46ccd9091ee002b?version=3.47.0) +[✨ REPL: Simple ✨](https://svelte.dev/repl/c3bbe052fdfc4e87a46ccd9091ee002b) + +[💃 REPL: Show me everything 🕺](https://svelte.dev/repl/3df87e32340e4e9e85bf371becae2af0) ## Installation @@ -37,14 +39,50 @@ Removed `isVirtualList` instead `npm i svelte-tiny-virtual-list -D` and component for Svelte apps", "scripts": { From ceac36063bf503f6175a9660bb5fefb51098a512 Mon Sep 17 00:00:00 2001 From: Rob B <2623102+rob-balfre@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:10:11 +1000 Subject: [PATCH 385/635] v5 NOW IN BETA --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 89b2c1f3..e7318191 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +[✨✨✨ v5 NOW IN BETA ✨✨✨](https://github.com/rob-balfre/svelte-select/tree/feature/v5) + + # svelte-select A select/autocomplete component for Svelte apps. With support for grouping, filtering, async and more. From dc8d256c6b68e9be36dc692611056fc6a4f8f37d Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 14 Apr 2022 09:06:02 +1000 Subject: [PATCH 386/635] #395 suggestions docs --- README.md | 84 +++++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 0bbc4b55..88c70ce1 100644 --- a/README.md +++ b/README.md @@ -94,39 +94,39 @@ The following CSS custom properties were removed in v5. ## Props -| Prop | Type | Default | Description | -| ----------------------- | --------- | --------------- | -------------------------------------------------- | -| items | `array` | `[]` | Array items available to display / filter | -| value | `any` | `null` | Selected value(s) | -| justValue | `any` | `null` | Selected value(s) excluding container object | -| optionIdentifier | `string` | `value` | Override default identifier | -| labelIdentifier | `string` | `label` | Override default identifier | -| id | `string` | `null` | Add an id to the filter input field | -| filterText | `string` | `''` | Text to filter `items` by | -| placeholder | `string` | `Please select` | Placeholder text | -| noOptionsMessage | `string` | `No options` | Message displayed when no items | -| hideEmptyState | `boolean` | `false` | When no items hide list and `noOptionsMessage` | -| listOpen | `boolean` | `false` | Open/close list | -| class | `string` | `''` | container classes | -| containerStyles | `string` | `''` | Add inline styles to container | -| isClearable | `boolean` | `true` | Enable clearing of value(s) | -| isCreatable | `boolean` | `false` | Can create new item(s) to be added to `value` | -| isDisabled | `boolean` | `false` | Disable select | -| isMulti | `boolean` | `false` | Enable multi-select | -| isSearchable | `boolean` | `true` | If `false` search/filtering is disabled | -| isGroupHeaderSelectable | `boolean` | `false` | Enable selectable group headers | -| listPlacement | `string` | `auto` | Display list `'auto'`, `'top'` or `'bottom'` | -| hasError | `boolean` | `false` | Show error styles around select input | -| listAutoWidth | `boolean` | `true` | If `false` will ignore width of select | -| showChevron | `boolean` | `false` | Show chevron at all times | -| inputAttributes | `object` | `{}` | Pass in HTML attributes to Select's input | -| iconProps | `object` | `{}` | Icon props | -| filteredItems | `array` | `[]` | List of items after filtering (read only) | -| placeholderAlwaysShow | `boolean` | `false` | When `isMulti` placeholder text will always show | -| isWaiting | `boolean` | `false` | Show LoadingIcon. `loadOptions` will override this | -| listOffset | `number` | `5` | `px` space between select and list | -| debounceWait | `number` | `300` | `milliseconds` debounce wait | -| suggestions | `array` | `null` | Show search suggestions before user input | +| Prop | Type | Default | Description | +| ----------------------- | ---------- | --------------- | -------------------------------------------------- | +| items | `any[]` | `[]` | Array of items available to display / filter | +| value | `any` | `null` | Selected value(s) | +| justValue | `any` | `null` | Selected value(s) excluding container object | +| optionIdentifier | `string` | `value` | Override default identifier | +| labelIdentifier | `string` | `label` | Override default identifier | +| id | `string` | `null` | Add an id to the filter input field | +| filterText | `string` | `''` | Text to filter `items` by | +| placeholder | `string` | `Please select` | Placeholder text | +| noOptionsMessage | `string` | `No options` | Message displayed when no items | +| hideEmptyState | `boolean` | `false` | When no items hide list and `noOptionsMessage` | +| listOpen | `boolean` | `false` | Open/close list | +| class | `string` | `''` | container classes | +| containerStyles | `string` | `''` | Add inline styles to container | +| isClearable | `boolean` | `true` | Enable clearing of value(s) | +| isCreatable | `boolean` | `false` | Can create new item(s) to be added to `value` | +| isDisabled | `boolean` | `false` | Disable select | +| isMulti | `boolean` | `false` | Enable multi-select | +| isSearchable | `boolean` | `true` | If `false` search/filtering is disabled | +| isGroupHeaderSelectable | `boolean` | `false` | Enable selectable group headers | +| listPlacement | `string` | `auto` | Display list `'auto'`, `'top'` or `'bottom'` | +| hasError | `boolean` | `false` | Show error styles around select input | +| listAutoWidth | `boolean` | `true` | If `false` will ignore width of select | +| showChevron | `boolean` | `false` | Show chevron at all times | +| inputAttributes | `object` | `{}` | Pass in HTML attributes to Select's input | +| iconProps | `object` | `{}` | Icon props | +| filteredItems | `array` | `[]` | List of items after filtering (read only) | +| placeholderAlwaysShow | `boolean` | `false` | When `isMulti` placeholder text will always show | +| isWaiting | `boolean` | `false` | Show LoadingIcon. `loadOptions` will override this | +| listOffset | `number` | `5` | `px` space between select and list | +| debounceWait | `number` | `300` | `milliseconds` debounce wait | +| suggestions | `string[]` | `null` | Show search suggestions before user input | ### Replaceable components @@ -151,15 +151,15 @@ The following CSS custom properties were removed in v5. ## Events -| Event Name | Callback | Description | -| ---------- | ----------------- | ------------------------------------------------------------------------------ | -| select | { detail } | fires when value changes | -| focus | { detail } | fires when select > input on:focus | -| blur | { detail } | fires when select > input on:blur | -| clear | { detail } | fires when clear all is invoked or item is removed (by user) from multi select | -| loaded | { options } | fires when `loadOptions` resolves | -| itemCreated| { options } | fires when `isCreatable` true and item is created | -| error | { type, details } | fires when error is caught | +| Event Name | Callback | Description | +| ----------- | ----------------- | ------------------------------------------------------------------------------ | +| select | { detail } | fires when value changes | +| focus | { detail } | fires when select > input on:focus | +| blur | { detail } | fires when select > input on:blur | +| clear | { detail } | fires when clear all is invoked or item is removed (by user) from multi select | +| loaded | { options } | fires when `loadOptions` resolves | +| itemCreated | { options } | fires when `isCreatable` true and item is created | +| error | { type, details } | fires when error is caught | ### Items From c450371825bc3c37629d1a58744e1c219686b4a3 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 14 Apr 2022 09:10:22 +1000 Subject: [PATCH 387/635] Release 5.0.0-beta.8 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0285b7c3..281591f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "svelte-select", - "version": "5.0.0-beta.7", + "version": "5.0.0-beta.8", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "5.0.0-beta.7", + "version": "5.0.0-beta.8", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 47ef7d6c..df0861a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.7", + "version": "5.0.0-beta.8", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "scripts": { From 63965020c773e565d3440e037b0fc508878d87cc Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 19 Apr 2022 07:52:49 +1000 Subject: [PATCH 390/635] bump --- package-lock.json | 77 ++++++++++++++++++++++++++--------------------- package.json | 8 ++--- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index 517f09fa..1fe6275f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,18 +5,19 @@ "requires": true, "packages": { "": { + "name": "svelte-select", "version": "5.0.0-beta.9", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", - "@sveltejs/kit": "1.0.0-next.310", + "@sveltejs/kit": "1.0.0-next.315", "autoprefixer": "^10.4.4", "cross-env": "^7.0.3", "find-in-files": "^0.5.0", "prettier": "~2.6.2", "prettier-plugin-svelte": "^2.7.0", "release-it": "^14.14.2", - "rollup": "^2.70.1", + "rollup": "^2.70.2", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", @@ -24,9 +25,9 @@ "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^2.0.2", "svelte": "^3.47.0", - "svelte-preprocess": "^4.10.5", + "svelte-preprocess": "^4.10.6", "svelte-tiny-virtual-list": "^2.0.3", - "svelte2tsx": "^0.5.8", + "svelte2tsx": "^0.5.9", "tape-modern": "^1.1.2", "typescript": "^4.6.3" } @@ -352,9 +353,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.310", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.310.tgz", - "integrity": "sha512-pTyMyaoyHS+V5cQZIQMfQXmLkhw1VaRwT9avOSgwDc0QBpnNw2LdzwoPYsUr96ca5B6cfT3SMUNolxErTNHmPQ==", + "version": "1.0.0-next.315", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.315.tgz", + "integrity": "sha512-f6ufqd9z6uicOOr1eSIclm4TonwoRtw0kuIYrDatYSZtu/081kZ5r0Vj6sXDI6tFI1kctoRzPtFECXf5zkZvlw==", "dev": true, "dependencies": { "@sveltejs/vite-plugin-svelte": "^1.0.0-next.32", @@ -3477,15 +3478,23 @@ } }, "node_modules/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-releases": { @@ -4805,9 +4814,9 @@ } }, "node_modules/rollup": { - "version": "2.70.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", - "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", + "version": "2.70.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz", + "integrity": "sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5424,9 +5433,9 @@ } }, "node_modules/svelte-preprocess": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.5.tgz", - "integrity": "sha512-VKXPRScCzAZqeBZOGq4LLwtNrAu++mVn7XvQox3eFDV7Ciq0Lg70Q8QWjH9iXF7J+pMlXhPsSFwpCb2E+hoeyA==", + "version": "4.10.6", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.6.tgz", + "integrity": "sha512-I2SV1w/AveMvgIQlUF/ZOO3PYVnhxfcpNyGt8pxpUVhPfyfL/CZBkkw/KPfuFix5FJ9TnnNYMhACK3DtSaYVVQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5496,9 +5505,9 @@ "dev": true }, "node_modules/svelte2tsx": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.8.tgz", - "integrity": "sha512-z5Mfpmy/jkpFIiePAocgWxGRJg+Ka0zlxyvFlpP2X1BoQuXjFC6pnIR9CGebOTmi+W1JnSUAdxrCCj/sEMXZ8Q==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.9.tgz", + "integrity": "sha512-xTDASjlh+rKo4QRhTRYSH87sS7fRoyX67xhGIMPKa3FYqftRHRmMes6nVgEskiuhBovslNHYYpMMg5YM5n/STg==", "dev": true, "dependencies": { "dedent-js": "^1.0.1", @@ -6295,9 +6304,9 @@ "dev": true }, "@sveltejs/kit": { - "version": "1.0.0-next.310", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.310.tgz", - "integrity": "sha512-pTyMyaoyHS+V5cQZIQMfQXmLkhw1VaRwT9avOSgwDc0QBpnNw2LdzwoPYsUr96ca5B6cfT3SMUNolxErTNHmPQ==", + "version": "1.0.0-next.315", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.315.tgz", + "integrity": "sha512-f6ufqd9z6uicOOr1eSIclm4TonwoRtw0kuIYrDatYSZtu/081kZ5r0Vj6sXDI6tFI1kctoRzPtFECXf5zkZvlw==", "dev": true, "requires": { "@sveltejs/vite-plugin-svelte": "^1.0.0-next.32", @@ -8468,9 +8477,9 @@ } }, "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -9377,9 +9386,9 @@ "dev": true }, "rollup": { - "version": "2.70.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz", - "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==", + "version": "2.70.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz", + "integrity": "sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -9825,9 +9834,9 @@ "requires": {} }, "svelte-preprocess": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.5.tgz", - "integrity": "sha512-VKXPRScCzAZqeBZOGq4LLwtNrAu++mVn7XvQox3eFDV7Ciq0Lg70Q8QWjH9iXF7J+pMlXhPsSFwpCb2E+hoeyA==", + "version": "4.10.6", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.6.tgz", + "integrity": "sha512-I2SV1w/AveMvgIQlUF/ZOO3PYVnhxfcpNyGt8pxpUVhPfyfL/CZBkkw/KPfuFix5FJ9TnnNYMhACK3DtSaYVVQ==", "dev": true, "requires": { "@types/pug": "^2.0.4", @@ -9845,9 +9854,9 @@ "dev": true }, "svelte2tsx": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.8.tgz", - "integrity": "sha512-z5Mfpmy/jkpFIiePAocgWxGRJg+Ka0zlxyvFlpP2X1BoQuXjFC6pnIR9CGebOTmi+W1JnSUAdxrCCj/sEMXZ8Q==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.9.tgz", + "integrity": "sha512-xTDASjlh+rKo4QRhTRYSH87sS7fRoyX67xhGIMPKa3FYqftRHRmMes6nVgEskiuhBovslNHYYpMMg5YM5n/STg==", "dev": true, "requires": { "dedent-js": "^1.0.1", diff --git a/package.json b/package.json index 27c64b03..603dbfc7 100644 --- a/package.json +++ b/package.json @@ -17,14 +17,14 @@ }, "devDependencies": { "@rollup/plugin-alias": "^3.1.9", - "@sveltejs/kit": "1.0.0-next.310", + "@sveltejs/kit": "1.0.0-next.315", "autoprefixer": "^10.4.4", "cross-env": "^7.0.3", "find-in-files": "^0.5.0", "prettier": "~2.6.2", "prettier-plugin-svelte": "^2.7.0", "release-it": "^14.14.2", - "rollup": "^2.70.1", + "rollup": "^2.70.2", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", @@ -32,9 +32,9 @@ "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^2.0.2", "svelte": "^3.47.0", - "svelte-preprocess": "^4.10.5", + "svelte-preprocess": "^4.10.6", "svelte-tiny-virtual-list": "^2.0.3", - "svelte2tsx": "^0.5.8", + "svelte2tsx": "^0.5.9", "tape-modern": "^1.1.2", "typescript": "^4.6.3" }, From dbfab50ccc63dd948ffd1aea09f8fc688d084da0 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 19 Apr 2022 07:55:43 +1000 Subject: [PATCH 391/635] #396 on:select fix and added on:change --- README.md | 9 ++++-- src/lib/Select.svelte | 10 ++++--- test/src/tests.js | 70 +++++++++++++++++++++++++++++++++++-------- 3 files changed, 71 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 88c70ce1..c0794915 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Removed `isVirtualList` instead `npm i svelte-tiny-virtual-list -D` and ### CSS Camel to kebab: -CSS classes and custom properties changed (ONLY depreciated in v5, no need to update to use v5) from camel to kebab case. For example `selectedItem` → `selected-item` and `--borderRadius` → `--border-radius` +CSS classes and custom properties changed (only depreciated, no need to update if upgrading from v4) from camel to kebab case. For example `selectedItem` → `selected-item` and `--borderRadius` → `--border-radius` ### Redundant CSS custom properties: @@ -91,6 +91,10 @@ The following CSS custom properties were removed in v5. `loadOptionsInterval` → `debounceWait` +### Event change: +The `select` event now only fires when the user selects an item. If you also want to track programmatic changes use the new `change` event. + + ## Props @@ -153,7 +157,8 @@ The following CSS custom properties were removed in v5. | Event Name | Callback | Description | | ----------- | ----------------- | ------------------------------------------------------------------------------ | -| select | { detail } | fires when value changes | +| select | { detail } | fires when item is selected | +| change | { detail } | fires when value changes | | focus | { detail } | fires when select > input on:focus | | blur | { detail } | fires when select > input on:blur | | clear | { detail } | fires when clear all is invoked or item is removed (by user) from multi select | diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 23919228..71998632 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -205,14 +205,14 @@ if (isMulti) { if (JSON.stringify(value) !== JSON.stringify(prev_value)) { if (checkValueForDuplicates()) { - dispatch('select', value); + dispatch('change', value); } } return; } if (!prev_value || JSON.stringify(value[optionIdentifier]) !== JSON.stringify(prev_value[optionIdentifier])) { - dispatch('select', value); + dispatch('change', value); } } @@ -244,7 +244,7 @@ $: if (prev_isMulti && !isMulti) setupSingle(); $: if (isMulti && value && value.length > 1) checkValueForDuplicates(); $: if (value) dispatchSelectedItem(); - $: if (!value && isMulti && prev_value) dispatch('select', value); + $: if (!value && isMulti && prev_value) dispatch('change', value); $: if (isFocused !== prev_isFocused) setupFocus(); $: if (filterText !== prev_filterText) setupFilterText(); @@ -298,7 +298,8 @@ $: ariaSelection = value ? handleAriaSelection(isMulti) : ''; $: ariaContext = handleAriaContent({filteredItems, hoverItemIndex, isFocused, listOpen}); $: updateValueDisplay(items); - $: if (value) justValue = value ? value[optionIdentifier] : value; + $: if (value && !isMulti) justValue = value ? value[optionIdentifier] : value; + $: if (value && isMulti) justValue = value.map(item => item[optionIdentifier]); $: if (isMulti && !Multi) console.warn('isMulti is true but Multi is not imported'); $: listProps = { Item, @@ -506,6 +507,7 @@ setTimeout(() => { listOpen = false; activeValue = undefined; + dispatch('select', value); }); } } diff --git a/test/src/tests.js b/test/src/tests.js index ffbac96e..53fb672f 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -326,7 +326,7 @@ test('hover item updates on keyUp or keyDown', async (t) => { select.$destroy(); }); -test('on enter active item fires a itemSelected event', async (t) => { +test('on enter active item fires a select event', async (t) => { const select = new Select({ target, props: { @@ -338,7 +338,7 @@ test('on enter active item fires a itemSelected event', async (t) => { let value = undefined; - select.$on('select', event => { + select.$on('change', event => { value = JSON.stringify(event.detail); }); @@ -350,7 +350,7 @@ test('on enter active item fires a itemSelected event', async (t) => { select.$destroy(); }); -test('on tab active item fires a itemSelected event', async (t) => { +test('on tab active item fires a select event', async (t) => { const select = new Select({ target, props: { @@ -361,7 +361,7 @@ test('on tab active item fires a itemSelected event', async (t) => { }); let value = undefined; - select.$on('select', event => { + select.$on('change', event => { value = JSON.stringify(event.detail); }); @@ -373,7 +373,7 @@ test('on tab active item fires a itemSelected event', async (t) => { select.$destroy(); }); -test('on selected of current active item does not fire a itemSelected event', async (t) => { +test('on selected of current active item does not fire a select event', async (t) => { const select = new Select({ target, props: { @@ -386,7 +386,7 @@ test('on selected of current active item does not fire a itemSelected event', as let itemSelectedFired = false; - select.$on('select', () => { + select.$on('change', () => { itemSelectedFired = true; }); @@ -2035,7 +2035,7 @@ test('when value changes then select event should fire', async (t) => { let selectEvent = undefined; - select.$on('select', event => { + select.$on('change', event => { selectEvent = event; }); @@ -2127,7 +2127,7 @@ test('when item is selected or state changes then check value[optionIdentifier] let item = undefined; - select.$on('select', () => { + select.$on('change', () => { item = true; }); @@ -2153,7 +2153,7 @@ test('when isMulti and item is selected or state changes then check value[option let item = undefined; - select.$on('select', () => { + select.$on('change', () => { item = true; }); @@ -2185,7 +2185,7 @@ test('when isFocused turns to false then check Select is no longer in focus', as } }); - select.$on('select', () => { + select.$on('change', () => { setTimeout(() => { select.$set({ isFocused: false, @@ -3624,7 +3624,7 @@ test('When isMulti on:select events should fire on each item removal (including let events = []; - select.$on('select', (e) => { + select.$on('change', (e) => { events.push('event fired'); }); @@ -4140,4 +4140,50 @@ test('when loadOptions and groupBy then group headers should appear', async (t) t.ok(header.innerHTML === 'Sweet'); select.$destroy(); -}); \ No newline at end of file +}); + +test('when user selects an item then select event fires', async (t) => { + const select = new Select({ + target, + props: { + listOpen: true, + items + } + }); + + let value = undefined; + + select.$on('select', event => { + value = JSON.stringify(event.detail); + }); + + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); + window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); + await wait(0); + t.equal(value, JSON.stringify({value: 'cake', label: 'Cake'})); + + select.$destroy(); +}); + +test('when item selected programmatically a select event should NOT fire', async (t) => { + const select = new Select({ + target, + props: { + listOpen: true, + items + } + }); + + let value = undefined; + select.$set({ value: {value: 'cake', label: 'Cake'}}); + + select.$on('select', event => { + value = event.detail; + }); + + await wait(0); + t.ok(value === undefined); + + select.$destroy(); +}); From 00b058217475653613854e8f2d3d56da151f3c85 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Tue, 19 Apr 2022 07:56:28 +1000 Subject: [PATCH 392/635] Release 5.0.0-beta.10 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1fe6275f..b9e95b8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "svelte-select", - "version": "5.0.0-beta.9", + "version": "5.0.0-beta.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "svelte-select", - "version": "5.0.0-beta.9", + "version": "5.0.0-beta.10", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 603dbfc7..16d6d956 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.9", + "version": "5.0.0-beta.10", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "scripts": { From 33647f58c031778f7ef96ff93b348fce2777af70 Mon Sep 17 00:00:00 2001 From: zerdox <49815452+ZerdoX-x@users.noreply.github.com> Date: Wed, 18 May 2022 13:58:54 +0500 Subject: [PATCH 395/635] docs: Add missing `showIndicator` deprecation --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c0794915..5df2294a 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ The following CSS custom properties were removed in v5. `containerClasses` → `class`
`MultiSelection` → `Multi`
`indicatorSvg` → `ChevronIcon`
+`showIndicator` → `showChevron`
`selectedValue` removed (was already deprecated in v4 in favour of `value`)
`loadOptionsInterval` → `debounceWait` From 5c0241cbd46d7c016696ce1dade4a65e8debc263 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 19 May 2022 10:51:42 +1000 Subject: [PATCH 396/635] #401 Update docs for justValue and make debounce a function expression --- README.md | 66 +++++++++++++++++++++---------------------- src/lib/Select.svelte | 5 ++-- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 5df2294a..0abc9bac 100644 --- a/README.md +++ b/README.md @@ -99,39 +99,39 @@ The `select` event now only fires when the user selects an item. If you also wan ## Props -| Prop | Type | Default | Description | -| ----------------------- | ---------- | --------------- | -------------------------------------------------- | -| items | `any[]` | `[]` | Array of items available to display / filter | -| value | `any` | `null` | Selected value(s) | -| justValue | `any` | `null` | Selected value(s) excluding container object | -| optionIdentifier | `string` | `value` | Override default identifier | -| labelIdentifier | `string` | `label` | Override default identifier | -| id | `string` | `null` | Add an id to the filter input field | -| filterText | `string` | `''` | Text to filter `items` by | -| placeholder | `string` | `Please select` | Placeholder text | -| noOptionsMessage | `string` | `No options` | Message displayed when no items | -| hideEmptyState | `boolean` | `false` | When no items hide list and `noOptionsMessage` | -| listOpen | `boolean` | `false` | Open/close list | -| class | `string` | `''` | container classes | -| containerStyles | `string` | `''` | Add inline styles to container | -| isClearable | `boolean` | `true` | Enable clearing of value(s) | -| isCreatable | `boolean` | `false` | Can create new item(s) to be added to `value` | -| isDisabled | `boolean` | `false` | Disable select | -| isMulti | `boolean` | `false` | Enable multi-select | -| isSearchable | `boolean` | `true` | If `false` search/filtering is disabled | -| isGroupHeaderSelectable | `boolean` | `false` | Enable selectable group headers | -| listPlacement | `string` | `auto` | Display list `'auto'`, `'top'` or `'bottom'` | -| hasError | `boolean` | `false` | Show error styles around select input | -| listAutoWidth | `boolean` | `true` | If `false` will ignore width of select | -| showChevron | `boolean` | `false` | Show chevron at all times | -| inputAttributes | `object` | `{}` | Pass in HTML attributes to Select's input | -| iconProps | `object` | `{}` | Icon props | -| filteredItems | `array` | `[]` | List of items after filtering (read only) | -| placeholderAlwaysShow | `boolean` | `false` | When `isMulti` placeholder text will always show | -| isWaiting | `boolean` | `false` | Show LoadingIcon. `loadOptions` will override this | -| listOffset | `number` | `5` | `px` space between select and list | -| debounceWait | `number` | `300` | `milliseconds` debounce wait | -| suggestions | `string[]` | `null` | Show search suggestions before user input | +| Prop | Type | Default | Description | +| ----------------------- | ---------- | --------------- | ---------------------------------------------------------- | +| items | `any[]` | `[]` | Array of items available to display / filter | +| value | `any` | `null` | Selected value(s) | +| justValue | `any` | `null` | **READ-ONLY** Selected value(s) excluding container object | +| optionIdentifier | `string` | `value` | Override default identifier | +| labelIdentifier | `string` | `label` | Override default identifier | +| id | `string` | `null` | Add an id to the filter input field | +| filterText | `string` | `''` | Text to filter `items` by | +| placeholder | `string` | `Please select` | Placeholder text | +| noOptionsMessage | `string` | `No options` | Message displayed when no items | +| hideEmptyState | `boolean` | `false` | When no items hide list and `noOptionsMessage` | +| listOpen | `boolean` | `false` | Open/close list | +| class | `string` | `''` | container classes | +| containerStyles | `string` | `''` | Add inline styles to container | +| isClearable | `boolean` | `true` | Enable clearing of value(s) | +| isCreatable | `boolean` | `false` | Can create new item(s) to be added to `value` | +| isDisabled | `boolean` | `false` | Disable select | +| isMulti | `boolean` | `false` | Enable multi-select | +| isSearchable | `boolean` | `true` | If `false` search/filtering is disabled | +| isGroupHeaderSelectable | `boolean` | `false` | Enable selectable group headers | +| listPlacement | `string` | `auto` | Display list `'auto'`, `'top'` or `'bottom'` | +| hasError | `boolean` | `false` | Show error styles around select input | +| listAutoWidth | `boolean` | `true` | If `false` will ignore width of select | +| showChevron | `boolean` | `false` | Show chevron at all times | +| inputAttributes | `object` | `{}` | Pass in HTML attributes to Select's input | +| iconProps | `object` | `{}` | Icon props | +| filteredItems | `array` | `[]` | List of items after filtering (read only) | +| placeholderAlwaysShow | `boolean` | `false` | When `isMulti` placeholder text will always show | +| isWaiting | `boolean` | `false` | Show LoadingIcon. `loadOptions` will override this | +| listOffset | `number` | `5` | `px` space between select and list | +| debounceWait | `number` | `300` | `milliseconds` debounce wait | +| suggestions | `string[]` | `null` | Show search suggestions before user input | ### Replaceable components diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index a7977c32..57432744 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -13,6 +13,8 @@ import _filter from '$lib/filter'; import _getItems from '$lib/getItems'; + export let justValue = null; // read-only + export let Item = _Item; export let List = _List; export let Selection = _Selection; @@ -35,7 +37,6 @@ export let isCreatable = false; export let isFocused = false; export let value = null; - export let justValue = null; export let filterText = ''; export let placeholder = 'Please select'; export let placeholderAlwaysShow = false; @@ -86,7 +87,7 @@ export let listOpen = false; let timeout; - export function debounce(fn, wait = 1) { + export let debounce = (fn, wait = 1) => { clearTimeout(timeout); timeout = setTimeout(fn, wait); } From 249262d37a8795210ba91edd1ca08892e7155bdf Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 19 May 2022 10:52:02 +1000 Subject: [PATCH 397/635] dep bump --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index e727bf60..3eb52c99 100644 --- a/package.json +++ b/package.json @@ -17,26 +17,26 @@ }, "devDependencies": { "@rollup/plugin-alias": "^3.1.9", - "@sveltejs/kit": "1.0.0-next.315", - "autoprefixer": "^10.4.4", + "@sveltejs/kit": "1.0.0-next.335", + "autoprefixer": "^10.4.7", "cross-env": "^7.0.3", "find-in-files": "^0.5.0", "prettier": "~2.6.2", "prettier-plugin-svelte": "^2.7.0", - "release-it": "^14.14.2", - "rollup": "^2.70.2", + "release-it": "^15.0.0", + "rollup": "^2.73.0", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^2.0.2", - "svelte": "^3.47.0", + "svelte": "^3.48.0", "svelte-preprocess": "^4.10.6", - "svelte-tiny-virtual-list": "^2.0.3", - "svelte2tsx": "^0.5.9", + "svelte-tiny-virtual-list": "^2.0.5", + "svelte2tsx": "^0.5.10", "tape-modern": "^1.1.2", - "typescript": "^4.6.3" + "typescript": "^4.6.4" }, "author": "Robert Balfré (https://github.com/rob-balfre)", "license": "ISC", From 7e74a32e26a35accdd86c0ce4ad1cf43e4186e65 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 9 Jun 2022 08:52:17 +1000 Subject: [PATCH 398/635] #402 list placement update, dep bump and clean up --- package-lock.json | 3645 ++++++++++++++++++++----- package.json | 8 +- src/app.html | 4 +- src/lib/List.svelte | 31 +- src/lib/Select.svelte | 128 +- src/lib/filter.js | 3 +- src/lib/{getItems.js => get-items.js} | 2 +- test/src/tests.js | 130 +- 8 files changed, 3051 insertions(+), 900 deletions(-) rename src/lib/{getItems.js => get-items.js} (94%) diff --git a/package-lock.json b/package-lock.json index f59cb852..4ef681ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,26 +10,26 @@ "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", - "@sveltejs/kit": "1.0.0-next.315", - "autoprefixer": "^10.4.4", + "@sveltejs/kit": "1.0.0-next.348", + "autoprefixer": "^10.4.7", "cross-env": "^7.0.3", "find-in-files": "^0.5.0", "prettier": "~2.6.2", "prettier-plugin-svelte": "^2.7.0", - "release-it": "^14.14.2", - "rollup": "^2.70.2", + "release-it": "^15.0.0", + "rollup": "^2.75.5", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^2.0.2", - "svelte": "^3.47.0", - "svelte-preprocess": "^4.10.6", - "svelte-tiny-virtual-list": "^2.0.3", - "svelte2tsx": "^0.5.9", + "svelte": "^3.48.0", + "svelte-preprocess": "^4.10.7", + "svelte-tiny-virtual-list": "^2.0.5", + "svelte2tsx": "^0.5.10", "tape-modern": "^1.1.2", - "typescript": "^4.6.3" + "typescript": "^4.7.3" } }, "node_modules/@babel/code-frame": { @@ -324,9 +324,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.2.tgz", - "integrity": "sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, "dependencies": { "estree-walker": "^2.0.1", @@ -353,36 +353,38 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.315", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.315.tgz", - "integrity": "sha512-f6ufqd9z6uicOOr1eSIclm4TonwoRtw0kuIYrDatYSZtu/081kZ5r0Vj6sXDI6tFI1kctoRzPtFECXf5zkZvlw==", + "version": "1.0.0-next.348", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.348.tgz", + "integrity": "sha512-K9dfgzIbotWmbcdCsQ6ROGs9R+bsGWwmSdN6l6km1QV5esQehqg1UYHGD9q0VJsg4rJg/zmKVBYo0oBquSHPZw==", "dev": true, "dependencies": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.32", - "sade": "^1.7.4", - "vite": "^2.9.0" + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.46", + "chokidar": "^3.5.3", + "sade": "^1.8.1", + "vite": "^2.9.9" }, "bin": { "svelte-kit": "svelte-kit.js" }, "engines": { - "node": ">=14.13" + "node": ">=16.7" }, "peerDependencies": { "svelte": "^3.44.0" } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.37", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.37.tgz", - "integrity": "sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA==", + "version": "1.0.0-next.47", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.47.tgz", + "integrity": "sha512-J6n8UN51aq/TEZGQ89/EtdXTtca3cRcTJGzi6fi+xK8LkgsHQLCZhRj+PJ+swktRSWTX9IOmQS55SqVg6bz5fA==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^4.1.2", - "debug": "^4.3.3", + "@rollup/pluginutils": "^4.2.1", + "debug": "^4.3.4", + "deepmerge": "^4.2.2", "kleur": "^4.1.4", - "magic-string": "^0.25.7", - "svelte-hmr": "^0.14.9" + "magic-string": "^0.26.2", + "svelte-hmr": "^0.14.12" }, "engines": { "node": "^14.13.1 || >= 16" @@ -390,7 +392,7 @@ "peerDependencies": { "diff-match-patch": "^1.0.5", "svelte": "^3.44.0", - "vite": "^2.7.0" + "vite": "^2.9.0" }, "peerDependenciesMeta": { "diff-match-patch": { @@ -398,6 +400,18 @@ } } }, + "node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -410,6 +424,15 @@ "node": ">=6" } }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -419,6 +442,39 @@ "node": ">=10.13.0" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "10.12.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", @@ -448,6 +504,15 @@ "@types/node": "*" } }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/sass": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz", @@ -457,6 +522,39 @@ "@types/node": "*" } }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -511,6 +609,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/array.prototype.map": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", @@ -530,6 +641,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -546,9 +669,9 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "dev": true, "funding": [ { @@ -561,8 +684,8 @@ } ], "dependencies": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -620,13 +743,22 @@ "node": "*" } }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", + "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", "dev": true, "dependencies": { - "buffer": "^5.5.0", + "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } @@ -695,9 +827,9 @@ } }, "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "funding": [ { @@ -710,10 +842,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" }, "bin": { @@ -724,9 +856,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -744,7 +876,7 @@ ], "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-crc32": { @@ -769,6 +901,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz", + "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, "node_modules/cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -858,9 +1008,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001327", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", - "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", + "version": "1.0.30001346", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", + "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==", "dev": true, "funding": [ { @@ -907,6 +1057,33 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/ci-info": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", @@ -961,7 +1138,7 @@ "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "engines": { "node": ">=0.8" @@ -1012,6 +1189,25 @@ "node": ">= 0.8" } }, + "node_modules/compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "dev": true, + "dependencies": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/compress-brotli/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1054,6 +1250,12 @@ "node": ">=4" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "node_modules/cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -1268,6 +1470,15 @@ "node": ">=8.0.0" } }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1321,10 +1532,25 @@ "node": ">=4.0.0" } }, + "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==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", "dev": true, "dependencies": { "clone": "^1.0.2" @@ -1336,6 +1562,15 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1348,6 +1583,21 @@ "node": ">= 0.4" } }, + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1357,6 +1607,15 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", @@ -1458,9 +1717,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.106", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", - "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", + "version": "1.4.146", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", + "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", "dev": true }, "node_modules/emoji-regex": { @@ -1588,9 +1847,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.34.tgz", - "integrity": "sha512-QIWdPT/gFF6hCaf4m7kP0cJ+JIuFkdHibI7vVFvu3eJS1HpVmYHWDulyN5WXwbRA0SX/7ZDaJ/1DH8SdY9xOJg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.42.tgz", + "integrity": "sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw==", "dev": true, "hasInstallScript": true, "bin": { @@ -1600,32 +1859,32 @@ "node": ">=12" }, "optionalDependencies": { - "esbuild-android-64": "0.14.34", - "esbuild-android-arm64": "0.14.34", - "esbuild-darwin-64": "0.14.34", - "esbuild-darwin-arm64": "0.14.34", - "esbuild-freebsd-64": "0.14.34", - "esbuild-freebsd-arm64": "0.14.34", - "esbuild-linux-32": "0.14.34", - "esbuild-linux-64": "0.14.34", - "esbuild-linux-arm": "0.14.34", - "esbuild-linux-arm64": "0.14.34", - "esbuild-linux-mips64le": "0.14.34", - "esbuild-linux-ppc64le": "0.14.34", - "esbuild-linux-riscv64": "0.14.34", - "esbuild-linux-s390x": "0.14.34", - "esbuild-netbsd-64": "0.14.34", - "esbuild-openbsd-64": "0.14.34", - "esbuild-sunos-64": "0.14.34", - "esbuild-windows-32": "0.14.34", - "esbuild-windows-64": "0.14.34", - "esbuild-windows-arm64": "0.14.34" + "esbuild-android-64": "0.14.42", + "esbuild-android-arm64": "0.14.42", + "esbuild-darwin-64": "0.14.42", + "esbuild-darwin-arm64": "0.14.42", + "esbuild-freebsd-64": "0.14.42", + "esbuild-freebsd-arm64": "0.14.42", + "esbuild-linux-32": "0.14.42", + "esbuild-linux-64": "0.14.42", + "esbuild-linux-arm": "0.14.42", + "esbuild-linux-arm64": "0.14.42", + "esbuild-linux-mips64le": "0.14.42", + "esbuild-linux-ppc64le": "0.14.42", + "esbuild-linux-riscv64": "0.14.42", + "esbuild-linux-s390x": "0.14.42", + "esbuild-netbsd-64": "0.14.42", + "esbuild-openbsd-64": "0.14.42", + "esbuild-sunos-64": "0.14.42", + "esbuild-windows-32": "0.14.42", + "esbuild-windows-64": "0.14.42", + "esbuild-windows-arm64": "0.14.42" } }, "node_modules/esbuild-android-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.34.tgz", - "integrity": "sha512-XfxcfJqmMYsT/LXqrptzFxmaR3GWzXHDLdFNIhm6S00zPaQF1TBBWm+9t0RZ6LRR7iwH57DPjaOeW20vMqI4Yw==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.42.tgz", + "integrity": "sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A==", "cpu": [ "x64" ], @@ -1639,9 +1898,9 @@ } }, "node_modules/esbuild-android-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.34.tgz", - "integrity": "sha512-T02+NXTmSRL1Mc6puz+R9CB54rSPICkXKq6+tw8B6vxZFnCPzbJxgwIX4kcluz9p8nYBjF3+lSilTGWb7+Xgew==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.42.tgz", + "integrity": "sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg==", "cpu": [ "arm64" ], @@ -1655,9 +1914,9 @@ } }, "node_modules/esbuild-darwin-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.34.tgz", - "integrity": "sha512-pLRip2Bh4Ng7Bf6AMgCrSp3pPe/qZyf11h5Qo2mOfJqLWzSVjxrXW+CFRJfrOVP7TCnh/gmZSM2AFdCPB72vtw==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.42.tgz", + "integrity": "sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA==", "cpu": [ "x64" ], @@ -1671,9 +1930,9 @@ } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.34.tgz", - "integrity": "sha512-vpidSJEBxx6lf1NWgXC+DCmGqesJuZ5Y8aQVVsaoO4i8tRXbXb0whChRvop/zd3nfNM4dIl5EXAky0knRX5I6w==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.42.tgz", + "integrity": "sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA==", "cpu": [ "arm64" ], @@ -1687,9 +1946,9 @@ } }, "node_modules/esbuild-freebsd-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.34.tgz", - "integrity": "sha512-m0HBjePhe0hAQJgtMRMNV9kMgIyV4/qSnzPx42kRMQBcPhgjAq1JRu4Il26czC+9FgpMbFkUktb07f/Lwnc6CA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.42.tgz", + "integrity": "sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw==", "cpu": [ "x64" ], @@ -1703,9 +1962,9 @@ } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.34.tgz", - "integrity": "sha512-cpRc2B94L1KvMPPYB4D6G39jLqpKlD3noAMY4/e86iXXXkhUYJJEtTuyNFTa9JRpWM0xCAp4mxjHjoIiLuoCLA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.42.tgz", + "integrity": "sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA==", "cpu": [ "arm64" ], @@ -1719,9 +1978,9 @@ } }, "node_modules/esbuild-linux-32": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.34.tgz", - "integrity": "sha512-8nQaEaoW7MH/K/RlozJa+lE1ejHIr8fuPIHhc513UebRav7HtXgQvxHQ6VZRUkWtep23M6dd7UqhwO1tMOfzQQ==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.42.tgz", + "integrity": "sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg==", "cpu": [ "ia32" ], @@ -1735,9 +1994,9 @@ } }, "node_modules/esbuild-linux-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.34.tgz", - "integrity": "sha512-Y3of4qQoLLlAgf042MlrY1P+7PnN9zWj8nVtw9XQG5hcLOZLz7IKpU35oeu7n4wvyaZHwvQqDJ93gRLqdJekcQ==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.42.tgz", + "integrity": "sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA==", "cpu": [ "x64" ], @@ -1751,9 +2010,9 @@ } }, "node_modules/esbuild-linux-arm": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.34.tgz", - "integrity": "sha512-9lpq1NcJqssAF7alCO6zL3gvBVVt/lKw4oetUM7OgNnRX0OWpB+ZIO9FwCrSj/dMdmgDhPLf+119zB8QxSMmAg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.42.tgz", + "integrity": "sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg==", "cpu": [ "arm" ], @@ -1767,9 +2026,9 @@ } }, "node_modules/esbuild-linux-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.34.tgz", - "integrity": "sha512-IlWaGtj9ir7+Nrume1DGcyzBDlK8GcnJq0ANKwcI9pVw8tqr+6GD0eqyF9SF1mR8UmAp+odrx1H5NdR2cHdFHA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.42.tgz", + "integrity": "sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA==", "cpu": [ "arm64" ], @@ -1783,9 +2042,9 @@ } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.34.tgz", - "integrity": "sha512-k3or+01Rska1AjUyNjA4buEwB51eyN/xPQAoOx1CjzAQC3l8rpjUDw55kXyL63O/1MUi4ISvtNtl8gLwdyEcxw==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.42.tgz", + "integrity": "sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg==", "cpu": [ "mips64el" ], @@ -1799,9 +2058,9 @@ } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.34.tgz", - "integrity": "sha512-+qxb8M9FfM2CJaVU7GgYpJOHM1ngQOx+/VrtBjb4C8oVqaPcESCeg2anjl+HRZy8VpYc71q/iBYausPPbJ+Keg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.42.tgz", + "integrity": "sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg==", "cpu": [ "ppc64" ], @@ -1815,9 +2074,9 @@ } }, "node_modules/esbuild-linux-riscv64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.34.tgz", - "integrity": "sha512-Y717ltBdQ5j5sZIHdy1DV9kieo0wMip0dCmVSTceowCPYSn1Cg33Kd6981+F/3b9FDMzNWldZFOBRILViENZSA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.42.tgz", + "integrity": "sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ==", "cpu": [ "riscv64" ], @@ -1831,9 +2090,9 @@ } }, "node_modules/esbuild-linux-s390x": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.34.tgz", - "integrity": "sha512-bDDgYO4LhL4+zPs+WcBkXph+AQoPcQRTv18FzZS0WhjfH8TZx2QqlVPGhmhZ6WidrY+jKthUqO6UhGyIb4MpmA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.42.tgz", + "integrity": "sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ==", "cpu": [ "s390x" ], @@ -1847,9 +2106,9 @@ } }, "node_modules/esbuild-netbsd-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.34.tgz", - "integrity": "sha512-cfaFGXdRt0+vHsjNPyF0POM4BVSHPSbhLPe8mppDc7GDDxjIl08mV1Zou14oDWMp/XZMjYN1kWYRSfftiD0vvQ==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.42.tgz", + "integrity": "sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw==", "cpu": [ "x64" ], @@ -1863,9 +2122,9 @@ } }, "node_modules/esbuild-openbsd-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.34.tgz", - "integrity": "sha512-vmy9DxXVnRiI14s8GKuYBtess+EVcDALkbpTqd5jw4XITutIzyB7n4x0Tj5utAkKsgZJB22lLWGekr0ABnSLow==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.42.tgz", + "integrity": "sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA==", "cpu": [ "x64" ], @@ -1879,9 +2138,9 @@ } }, "node_modules/esbuild-sunos-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.34.tgz", - "integrity": "sha512-eNPVatNET1F7tRMhii7goL/eptfxc0ALRjrj9SPFNqp0zmxrehBFD6BaP3R4LjMn6DbMO0jOAnTLFKr8NqcJAA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.42.tgz", + "integrity": "sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ==", "cpu": [ "x64" ], @@ -1895,9 +2154,9 @@ } }, "node_modules/esbuild-windows-32": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.34.tgz", - "integrity": "sha512-EFhpXyHEcnqWYe2rAHFd8dRw8wkrd9U+9oqcyoEL84GbanAYjiiIjBZsnR8kl0sCQ5w6bLpk7vCEIA2VS32Vcg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.42.tgz", + "integrity": "sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g==", "cpu": [ "ia32" ], @@ -1911,9 +2170,9 @@ } }, "node_modules/esbuild-windows-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.34.tgz", - "integrity": "sha512-a8fbl8Ky7PxNEjf1aJmtxdDZj32/hC7S1OcA2ckEpCJRTjiKslI9vAdPpSjrKIWhws4Galpaawy0nB7fjHYf5Q==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.42.tgz", + "integrity": "sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA==", "cpu": [ "x64" ], @@ -1927,9 +2186,9 @@ } }, "node_modules/esbuild-windows-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.34.tgz", - "integrity": "sha512-EYvmKbSa2B3sPnpC28UEu9jBK5atGV4BaVRE7CYGUci2Hlz4AvtV/LML+TcDMT6gBgibnN2gcltWclab3UutMg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.42.tgz", + "integrity": "sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw==", "cpu": [ "arm64" ], @@ -1969,6 +2228,50 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", @@ -1976,6 +2279,15 @@ "dev": true, "license": "MIT" }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -1983,23 +2295,23 @@ "dev": true }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -2019,22 +2331,10 @@ "node": ">=4" } }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2044,9 +2344,15 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, + "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==", + "dev": true + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -2071,6 +2377,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2126,6 +2441,12 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", + "dev": true + }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", @@ -2139,6 +2460,20 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2160,6 +2495,43 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dev": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2227,6 +2599,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/git-up": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", @@ -2294,10 +2683,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "node_modules/globby": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "dependencies": { "@sindresorhus/is": "^0.14.0", @@ -2416,13 +2836,69 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", + "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=12.20.0" } }, "node_modules/iconv-lite": { @@ -2476,9 +2952,9 @@ ] }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -2578,9 +3054,9 @@ } }, "node_modules/inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -2593,13 +3069,109 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/inquirer/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/inquirer/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/internal-slot": { @@ -2625,6 +3197,12 @@ "node": ">= 0.10" } }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, "node_modules/is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", @@ -2668,6 +3246,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -2753,7 +3343,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2797,12 +3387,15 @@ } }, "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-map": { @@ -2949,12 +3542,12 @@ } }, "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2997,12 +3590,12 @@ "dev": true }, "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", + "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3102,6 +3695,15 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -3132,6 +3734,19 @@ "node": ">=8" } }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lilconfig": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", @@ -3195,21 +3810,33 @@ "dev": true }, "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -3241,12 +3868,12 @@ } }, "node_modules/macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.0.1.tgz", + "integrity": "sha512-3l6OrhdDg2H2SigtuN3jBh+5dRJRWxNKuJTPBbGeNJTsmt/pj9PO25wYaNb05NuNmAsl435j4rDP6rgNXz7s7g==", "dev": true, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3307,13 +3934,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -3341,12 +3968,15 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-response": { @@ -3435,9 +4065,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -3446,25 +4076,40 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/new-github-release-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", - "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", "dev": true, "dependencies": { - "type-fest": "^0.4.1" + "type-fest": "^2.5.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz", + "integrity": "sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/no-case": { @@ -3503,6 +4148,15 @@ "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -3525,15 +4179,30 @@ } }, "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/nth-check": { @@ -3595,6 +4264,126 @@ } }, "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.0.tgz", + "integrity": "sha512-CxEP6845hLK+NHFWZ+LplGO4zfw4QSfxTlqMfvlJ988GoiUeZDMzCvqsZkFHv69sPICmJH1MDxZoQFOKXerAVw==", + "dev": true, + "dependencies": { + "bl": "^5.0.0", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", @@ -3609,56 +4398,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz", + "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==", "dev": true, "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" + "macos-release": "^3.0.1", + "windows-release": "^5.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3667,7 +4448,7 @@ "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3719,6 +4500,40 @@ "node": ">=8" } }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dev": true, + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -3848,9 +4663,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -3860,9 +4675,9 @@ } }, "node_modules/postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "dev": true, "funding": [ { @@ -3875,7 +4690,7 @@ } ], "dependencies": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -4431,6 +5246,15 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -4500,6 +5324,46 @@ "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", "dev": true }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/proxy-agent/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -4586,6 +5450,33 @@ } ] }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -4621,6 +5512,18 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -4658,71 +5561,198 @@ } }, "node_modules/release-it": { - "version": "14.14.2", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.14.2.tgz", - "integrity": "sha512-+TE5Zg7x5BE/xw6i8SN9rmsGxCE2GVqH1v8Ay1L09nsLQx1HJhihAqUtCCDdgOuLvGpX0xgDMsSzakDlDLpOkA==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.0.0.tgz", + "integrity": "sha512-Dnio6p+1O88UdQZmPjdXqq+Nrrn5t0USZyOctTPK5M36kOOfQTdp8V1Wlagz9QYIYr93NwovEZ+f4wK0P/kHbw==", "dev": true, "dependencies": { "@iarna/toml": "2.2.5", "@octokit/rest": "18.12.0", "async-retry": "1.3.3", - "chalk": "4.1.2", + "chalk": "5.0.1", "cosmiconfig": "7.0.1", - "debug": "4.3.4", - "execa": "5.1.1", + "execa": "6.1.0", "form-data": "4.0.0", "git-url-parse": "11.6.0", - "globby": "11.0.4", - "got": "9.6.0", - "import-cwd": "3.0.0", - "inquirer": "8.2.0", + "globby": "13.1.1", + "got": "12.0.4", + "inquirer": "8.2.4", "is-ci": "3.0.1", "lodash": "4.17.21", "mime-types": "2.1.35", - "new-github-release-url": "1.0.0", - "open": "7.4.2", - "ora": "5.4.1", - "os-name": "4.0.1", - "parse-json": "5.2.0", + "new-github-release-url": "2.0.0", + "open": "8.4.0", + "ora": "6.1.0", + "os-name": "5.0.1", "promise.allsettled": "1.0.5", - "semver": "7.3.5", + "proxy-agent": "5.0.0", + "semver": "7.3.7", "shelljs": "0.8.5", "update-notifier": "5.1.0", - "url-join": "4.0.1", - "uuid": "8.3.2", + "url-join": "5.0.0", "wildcard-match": "5.1.2", - "yaml": "1.10.2", - "yargs-parser": "20.2.9" + "yargs-parser": "21.0.1" }, "bin": { "release-it": "bin/release-it.js" }, + "engines": { + "node": ">=14.9" + } + }, + "node_modules/release-it/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/release-it/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/release-it/node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/release-it/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/release-it/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, "engines": { "node": ">=10" } }, - "node_modules/release-it/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==", + "node_modules/release-it/node_modules/got": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/got/-/got-12.0.4.tgz", + "integrity": "sha512-2Eyz4iU/ktq7wtMFXxzK7g5p35uNYLLdiZarZ5/Yn3IJlNEpBd5+dCgcAyxN8/8guZLszffwe3wVyw+DEVrpBg==", "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/release-it/node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "node_modules/release-it/node_modules/got/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/release-it/node_modules/keyv": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", + "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", + "dev": true, + "dependencies": { + "compress-brotli": "^1.3.8", + "json-buffer": "3.0.1" + } + }, + "node_modules/release-it/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -4730,6 +5760,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/release-it/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/release-it/node_modules/responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + } + }, "node_modules/require-relative": { "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", @@ -4754,6 +5802,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -4794,6 +5848,30 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -4814,9 +5892,9 @@ } }, "node_modules/rollup": { - "version": "2.70.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz", - "integrity": "sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==", + "version": "2.75.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.5.tgz", + "integrity": "sha512-JzNlJZDison3o2mOxVmb44Oz7t74EfSd1SQrplQk0wSaXV7uLQXtVdHbxlcT3w+8tZ1TL4r/eLfc7nAbz38BBA==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -4990,30 +6068,24 @@ } }, "node_modules/rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", "dev": true, "dependencies": { - "tslib": "~2.1.0" + "tslib": "^2.1.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, "node_modules/sade": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", - "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, "dependencies": { "mri": "^1.1.0" }, "engines": { - "node": ">= 6" + "node": ">=6" } }, "node_modules/safe-buffer": { @@ -5082,9 +6154,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5117,6 +6189,12 @@ "semver": "bin/semver.js" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5170,9 +6248,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/sirv": { @@ -5220,6 +6298,44 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/sorcery": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", @@ -5274,6 +6390,15 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -5351,12 +6476,15 @@ } }, "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-indent": { @@ -5415,27 +6543,30 @@ } }, "node_modules/svelte": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.47.0.tgz", - "integrity": "sha512-4JaJp3HEoTCGARRWZQIZDUanhYv0iyoHikklVHVLH9xFE9db22g4TDv7CPeNA8HD1JgjXI1vlhR1JZvvhaTu2Q==", + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.48.0.tgz", + "integrity": "sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/svelte-hmr": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.9.tgz", - "integrity": "sha512-bKE9+4qb4sAnA+TKHiYurUl970rjA0XmlP9TEP7K/ncyWz3m81kA4HOgmlZK/7irGK7gzZlaPDI3cmf8fp/+tg==", + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", + "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, "peerDependencies": { "svelte": ">=3.19.0" } }, "node_modules/svelte-preprocess": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.6.tgz", - "integrity": "sha512-I2SV1w/AveMvgIQlUF/ZOO3PYVnhxfcpNyGt8pxpUVhPfyfL/CZBkkw/KPfuFix5FJ9TnnNYMhACK3DtSaYVVQ==", + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5454,7 +6585,7 @@ "coffeescript": "^2.5.1", "less": "^3.11.3 || ^4.0.0", "postcss": "^7 || ^8", - "postcss-load-config": "^2.1.0 || ^3.0.0", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", "pug": "^3.0.0", "sass": "^1.26.8", "stylus": "^0.55.0", @@ -5499,15 +6630,15 @@ } }, "node_modules/svelte-tiny-virtual-list": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.3.tgz", - "integrity": "sha512-f2V8xlB+5bnsQ2w02MqQvD/vTUrVr1QLacbDU8DNVNby/YMKX8b8IOft//eJId9Wv3ATaiIpnFpRD5ojt9MYtw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.5.tgz", + "integrity": "sha512-xg9ckb8UeeIme4/5qlwCrl2QNmUZ8SCQYZn3Ji83cUsoASqRNy3KWjpmNmzYvPDqCHSZjruBBsoB7t5hwuzw5g==", "dev": true }, "node_modules/svelte2tsx": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.9.tgz", - "integrity": "sha512-xTDASjlh+rKo4QRhTRYSH87sS7fRoyX67xhGIMPKa3FYqftRHRmMes6nVgEskiuhBovslNHYYpMMg5YM5n/STg==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.10.tgz", + "integrity": "sha512-nokQ0HTTWMcNX6tLrDLiOmJCuqjKZU9nCZ6/mVuCL3nusXdbp+9nv69VG2pCy7uQC66kV4Ls+j0WfvvJuGVnkg==", "dev": true, "dependencies": { "dedent-js": "^1.0.1", @@ -5575,6 +6706,18 @@ "node": ">=4" } }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -5596,6 +6739,15 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/totalist": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", @@ -5624,6 +6776,18 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -5646,9 +6810,9 @@ } }, "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", + "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5697,6 +6861,24 @@ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", "dev": true }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", @@ -5744,10 +6926,13 @@ } }, "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, "node_modules/url-parse-lax": { "version": "3.0.0", @@ -5767,15 +6952,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/vendors": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", @@ -5787,13 +6963,13 @@ } }, "node_modules/vite": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.1.tgz", - "integrity": "sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.9.tgz", + "integrity": "sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew==", "dev": true, "dependencies": { "esbuild": "^0.14.27", - "postcss": "^8.4.12", + "postcss": "^8.4.13", "resolve": "^1.22.0", "rollup": "^2.59.0" }, @@ -5823,6 +6999,22 @@ } } }, + "node_modules/vm2": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "dev": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -5898,34 +7090,34 @@ "dev": true }, "node_modules/windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz", + "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==", "dev": true, "dependencies": { - "execa": "^4.0.2" + "execa": "^5.1.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { @@ -5935,28 +7127,79 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/windows-release/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/windows-release/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "pump": "^3.0.0" + "path-key": "^3.0.0" }, "engines": { "node": ">=8" + } + }, + "node_modules/windows-release/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "node_modules/windows-release/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { - "node": ">=8.12.0" + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { @@ -6004,6 +7247,15 @@ "node": ">=8" } }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -6020,12 +7272,12 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" } } }, @@ -6280,9 +7532,9 @@ } }, "@rollup/pluginutils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.2.tgz", - "integrity": "sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, "requires": { "estree-walker": "^2.0.1", @@ -6304,27 +7556,40 @@ "dev": true }, "@sveltejs/kit": { - "version": "1.0.0-next.315", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.315.tgz", - "integrity": "sha512-f6ufqd9z6uicOOr1eSIclm4TonwoRtw0kuIYrDatYSZtu/081kZ5r0Vj6sXDI6tFI1kctoRzPtFECXf5zkZvlw==", + "version": "1.0.0-next.348", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.348.tgz", + "integrity": "sha512-K9dfgzIbotWmbcdCsQ6ROGs9R+bsGWwmSdN6l6km1QV5esQehqg1UYHGD9q0VJsg4rJg/zmKVBYo0oBquSHPZw==", "dev": true, "requires": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.32", - "sade": "^1.7.4", - "vite": "^2.9.0" + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.46", + "chokidar": "^3.5.3", + "sade": "^1.8.1", + "vite": "^2.9.9" } }, "@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.37", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.37.tgz", - "integrity": "sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA==", + "version": "1.0.0-next.47", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.47.tgz", + "integrity": "sha512-J6n8UN51aq/TEZGQ89/EtdXTtca3cRcTJGzi6fi+xK8LkgsHQLCZhRj+PJ+swktRSWTX9IOmQS55SqVg6bz5fA==", "dev": true, "requires": { - "@rollup/pluginutils": "^4.1.2", - "debug": "^4.3.3", + "@rollup/pluginutils": "^4.2.1", + "debug": "^4.3.4", + "deepmerge": "^4.2.2", "kleur": "^4.1.4", - "magic-string": "^0.25.7", - "svelte-hmr": "^0.14.9" + "magic-string": "^0.26.2", + "svelte-hmr": "^0.14.12" + }, + "dependencies": { + "magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } } }, "@szmarczak/http-timer": { @@ -6336,12 +7601,51 @@ "defer-to-connect": "^1.0.1" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true }, + "@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", + "dev": true + }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/node": { "version": "10.12.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", @@ -6369,6 +7673,15 @@ "@types/node": "*" } }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/sass": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.16.1.tgz", @@ -6378,6 +7691,27 @@ "@types/node": "*" } }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -6417,6 +7751,16 @@ "color-convert": "^2.0.1" } }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "array.prototype.map": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.4.tgz", @@ -6430,6 +7774,15 @@ "is-string": "^1.0.7" } }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, "async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -6446,13 +7799,13 @@ "dev": true }, "autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "dev": true, "requires": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -6483,13 +7836,19 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", + "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", "dev": true, "requires": { - "buffer": "^5.5.0", + "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } @@ -6544,26 +7903,26 @@ } }, "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" } }, "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "requires": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "buffer-crc32": { @@ -6578,6 +7937,18 @@ "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cacheable-lookup": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz", + "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A==", + "dev": true + }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -6645,9 +8016,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001327", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", - "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", + "version": "1.0.30001346", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", + "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==", "dev": true }, "chalk": { @@ -6677,6 +8048,22 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, "ci-info": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", @@ -6713,7 +8100,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, "clone-response": { @@ -6755,6 +8142,24 @@ "delayed-stream": "~1.0.0" } }, + "compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "dev": true, + "requires": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + }, + "dependencies": { + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6790,6 +8195,12 @@ "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", "dev": true }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -6938,6 +8349,12 @@ "css-tree": "^1.1.2" } }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6974,10 +8391,22 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "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==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", "dev": true, "requires": { "clone": "^1.0.2" @@ -6989,6 +8418,12 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -6998,12 +8433,30 @@ "object-keys": "^1.0.12" } }, + "degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dev": true, + "requires": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, "deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", @@ -7078,9 +8531,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.106", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", - "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", + "version": "1.4.146", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", + "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", "dev": true }, "emoji-regex": { @@ -7187,170 +8640,170 @@ "dev": true }, "esbuild": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.34.tgz", - "integrity": "sha512-QIWdPT/gFF6hCaf4m7kP0cJ+JIuFkdHibI7vVFvu3eJS1HpVmYHWDulyN5WXwbRA0SX/7ZDaJ/1DH8SdY9xOJg==", - "dev": true, - "requires": { - "esbuild-android-64": "0.14.34", - "esbuild-android-arm64": "0.14.34", - "esbuild-darwin-64": "0.14.34", - "esbuild-darwin-arm64": "0.14.34", - "esbuild-freebsd-64": "0.14.34", - "esbuild-freebsd-arm64": "0.14.34", - "esbuild-linux-32": "0.14.34", - "esbuild-linux-64": "0.14.34", - "esbuild-linux-arm": "0.14.34", - "esbuild-linux-arm64": "0.14.34", - "esbuild-linux-mips64le": "0.14.34", - "esbuild-linux-ppc64le": "0.14.34", - "esbuild-linux-riscv64": "0.14.34", - "esbuild-linux-s390x": "0.14.34", - "esbuild-netbsd-64": "0.14.34", - "esbuild-openbsd-64": "0.14.34", - "esbuild-sunos-64": "0.14.34", - "esbuild-windows-32": "0.14.34", - "esbuild-windows-64": "0.14.34", - "esbuild-windows-arm64": "0.14.34" + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.42.tgz", + "integrity": "sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw==", + "dev": true, + "requires": { + "esbuild-android-64": "0.14.42", + "esbuild-android-arm64": "0.14.42", + "esbuild-darwin-64": "0.14.42", + "esbuild-darwin-arm64": "0.14.42", + "esbuild-freebsd-64": "0.14.42", + "esbuild-freebsd-arm64": "0.14.42", + "esbuild-linux-32": "0.14.42", + "esbuild-linux-64": "0.14.42", + "esbuild-linux-arm": "0.14.42", + "esbuild-linux-arm64": "0.14.42", + "esbuild-linux-mips64le": "0.14.42", + "esbuild-linux-ppc64le": "0.14.42", + "esbuild-linux-riscv64": "0.14.42", + "esbuild-linux-s390x": "0.14.42", + "esbuild-netbsd-64": "0.14.42", + "esbuild-openbsd-64": "0.14.42", + "esbuild-sunos-64": "0.14.42", + "esbuild-windows-32": "0.14.42", + "esbuild-windows-64": "0.14.42", + "esbuild-windows-arm64": "0.14.42" } }, "esbuild-android-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.34.tgz", - "integrity": "sha512-XfxcfJqmMYsT/LXqrptzFxmaR3GWzXHDLdFNIhm6S00zPaQF1TBBWm+9t0RZ6LRR7iwH57DPjaOeW20vMqI4Yw==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.42.tgz", + "integrity": "sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A==", "dev": true, "optional": true }, "esbuild-android-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.34.tgz", - "integrity": "sha512-T02+NXTmSRL1Mc6puz+R9CB54rSPICkXKq6+tw8B6vxZFnCPzbJxgwIX4kcluz9p8nYBjF3+lSilTGWb7+Xgew==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.42.tgz", + "integrity": "sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.34.tgz", - "integrity": "sha512-pLRip2Bh4Ng7Bf6AMgCrSp3pPe/qZyf11h5Qo2mOfJqLWzSVjxrXW+CFRJfrOVP7TCnh/gmZSM2AFdCPB72vtw==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.42.tgz", + "integrity": "sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.34.tgz", - "integrity": "sha512-vpidSJEBxx6lf1NWgXC+DCmGqesJuZ5Y8aQVVsaoO4i8tRXbXb0whChRvop/zd3nfNM4dIl5EXAky0knRX5I6w==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.42.tgz", + "integrity": "sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.34.tgz", - "integrity": "sha512-m0HBjePhe0hAQJgtMRMNV9kMgIyV4/qSnzPx42kRMQBcPhgjAq1JRu4Il26czC+9FgpMbFkUktb07f/Lwnc6CA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.42.tgz", + "integrity": "sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.34.tgz", - "integrity": "sha512-cpRc2B94L1KvMPPYB4D6G39jLqpKlD3noAMY4/e86iXXXkhUYJJEtTuyNFTa9JRpWM0xCAp4mxjHjoIiLuoCLA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.42.tgz", + "integrity": "sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.34.tgz", - "integrity": "sha512-8nQaEaoW7MH/K/RlozJa+lE1ejHIr8fuPIHhc513UebRav7HtXgQvxHQ6VZRUkWtep23M6dd7UqhwO1tMOfzQQ==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.42.tgz", + "integrity": "sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.34.tgz", - "integrity": "sha512-Y3of4qQoLLlAgf042MlrY1P+7PnN9zWj8nVtw9XQG5hcLOZLz7IKpU35oeu7n4wvyaZHwvQqDJ93gRLqdJekcQ==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.42.tgz", + "integrity": "sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.34.tgz", - "integrity": "sha512-9lpq1NcJqssAF7alCO6zL3gvBVVt/lKw4oetUM7OgNnRX0OWpB+ZIO9FwCrSj/dMdmgDhPLf+119zB8QxSMmAg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.42.tgz", + "integrity": "sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.34.tgz", - "integrity": "sha512-IlWaGtj9ir7+Nrume1DGcyzBDlK8GcnJq0ANKwcI9pVw8tqr+6GD0eqyF9SF1mR8UmAp+odrx1H5NdR2cHdFHA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.42.tgz", + "integrity": "sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.34.tgz", - "integrity": "sha512-k3or+01Rska1AjUyNjA4buEwB51eyN/xPQAoOx1CjzAQC3l8rpjUDw55kXyL63O/1MUi4ISvtNtl8gLwdyEcxw==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.42.tgz", + "integrity": "sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.34.tgz", - "integrity": "sha512-+qxb8M9FfM2CJaVU7GgYpJOHM1ngQOx+/VrtBjb4C8oVqaPcESCeg2anjl+HRZy8VpYc71q/iBYausPPbJ+Keg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.42.tgz", + "integrity": "sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg==", "dev": true, "optional": true }, "esbuild-linux-riscv64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.34.tgz", - "integrity": "sha512-Y717ltBdQ5j5sZIHdy1DV9kieo0wMip0dCmVSTceowCPYSn1Cg33Kd6981+F/3b9FDMzNWldZFOBRILViENZSA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.42.tgz", + "integrity": "sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ==", "dev": true, "optional": true }, "esbuild-linux-s390x": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.34.tgz", - "integrity": "sha512-bDDgYO4LhL4+zPs+WcBkXph+AQoPcQRTv18FzZS0WhjfH8TZx2QqlVPGhmhZ6WidrY+jKthUqO6UhGyIb4MpmA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.42.tgz", + "integrity": "sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.34.tgz", - "integrity": "sha512-cfaFGXdRt0+vHsjNPyF0POM4BVSHPSbhLPe8mppDc7GDDxjIl08mV1Zou14oDWMp/XZMjYN1kWYRSfftiD0vvQ==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.42.tgz", + "integrity": "sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.34.tgz", - "integrity": "sha512-vmy9DxXVnRiI14s8GKuYBtess+EVcDALkbpTqd5jw4XITutIzyB7n4x0Tj5utAkKsgZJB22lLWGekr0ABnSLow==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.42.tgz", + "integrity": "sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.34.tgz", - "integrity": "sha512-eNPVatNET1F7tRMhii7goL/eptfxc0ALRjrj9SPFNqp0zmxrehBFD6BaP3R4LjMn6DbMO0jOAnTLFKr8NqcJAA==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.42.tgz", + "integrity": "sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ==", "dev": true, "optional": true }, "esbuild-windows-32": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.34.tgz", - "integrity": "sha512-EFhpXyHEcnqWYe2rAHFd8dRw8wkrd9U+9oqcyoEL84GbanAYjiiIjBZsnR8kl0sCQ5w6bLpk7vCEIA2VS32Vcg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.42.tgz", + "integrity": "sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.34.tgz", - "integrity": "sha512-a8fbl8Ky7PxNEjf1aJmtxdDZj32/hC7S1OcA2ckEpCJRTjiKslI9vAdPpSjrKIWhws4Galpaawy0nB7fjHYf5Q==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.42.tgz", + "integrity": "sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.14.34", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.34.tgz", - "integrity": "sha512-EYvmKbSa2B3sPnpC28UEu9jBK5atGV4BaVRE7CYGUci2Hlz4AvtV/LML+TcDMT6gBgibnN2gcltWclab3UutMg==", + "version": "0.14.42", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.42.tgz", + "integrity": "sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw==", "dev": true, "optional": true }, @@ -7372,12 +8825,43 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, "estree-walker": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -7385,20 +8869,20 @@ "dev": true }, "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, "requires": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" } }, "external-editor": { @@ -7410,23 +8894,12 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } } }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -7436,6 +8909,12 @@ "micromatch": "^4.0.4" } }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -7454,6 +8933,12 @@ "escape-string-regexp": "^1.0.5" } }, + "file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -7499,12 +8984,29 @@ "mime-types": "^2.1.12" } }, + "form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", + "dev": true + }, "fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -7518,6 +9020,42 @@ "dev": true, "optional": true }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dev": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -7566,6 +9104,20 @@ "get-intrinsic": "^1.1.1" } }, + "get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + } + }, "git-up": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", @@ -7617,6 +9169,27 @@ "ini": "2.0.0" } }, + "globby": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "dependencies": { + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -7707,10 +9280,54 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http2-wrapper": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", + "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true }, "iconv-lite": { @@ -7742,9 +9359,9 @@ "dev": true }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "import-cwd": { @@ -7818,9 +9435,9 @@ "dev": true }, "inquirer": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", - "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -7833,10 +9450,73 @@ "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^7.2.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + } } }, "internal-slot": { @@ -7856,6 +9536,12 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", @@ -7887,6 +9573,15 @@ "has-bigints": "^1.0.1" } }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -7939,7 +9634,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -7968,9 +9663,9 @@ } }, "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true }, "is-map": { @@ -8071,9 +9766,9 @@ } }, "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "is-string": { @@ -8101,9 +9796,9 @@ "dev": true }, "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", + "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", "dev": true }, "is-weakref": { @@ -8185,6 +9880,15 @@ "minimist": "^1.2.0" } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -8209,6 +9913,16 @@ "package-json": "^6.3.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "lilconfig": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", @@ -8263,13 +9977,21 @@ "dev": true }, "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "dependencies": { + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true + } } }, "lower-case": { @@ -8297,9 +10019,9 @@ } }, "macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.0.1.tgz", + "integrity": "sha512-3l6OrhdDg2H2SigtuN3jBh+5dRJRWxNKuJTPBbGeNJTsmt/pj9PO25wYaNb05NuNmAsl435j4rDP6rgNXz7s7g==", "dev": true }, "magic-string": { @@ -8347,13 +10069,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime-db": { @@ -8372,9 +10094,9 @@ } }, "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true }, "mimic-response": { @@ -8444,24 +10166,30 @@ "dev": true }, "nanoid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", - "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true }, "new-github-release-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", - "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", "dev": true, "requires": { - "type-fest": "^0.4.1" + "type-fest": "^2.5.1" }, "dependencies": { "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz", + "integrity": "sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==", "dev": true } } @@ -8491,6 +10219,12 @@ "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -8504,12 +10238,20 @@ "dev": true }, "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "requires": { - "path-key": "^3.0.0" + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } } }, "nth-check": { @@ -8555,55 +10297,127 @@ } }, "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" } }, "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dev": true, "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.0.tgz", + "integrity": "sha512-CxEP6845hLK+NHFWZ+LplGO4zfw4QSfxTlqMfvlJ988GoiUeZDMzCvqsZkFHv69sPICmJH1MDxZoQFOKXerAVw==", + "dev": true, + "requires": { + "bl": "^5.0.0", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz", + "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==", "dev": true, "requires": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" + "macos-release": "^3.0.1", + "windows-release": "^5.0.1" } }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, "p-cancelable": { @@ -8637,6 +10451,34 @@ "p-finally": "^1.0.0" } }, + "pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + } + }, + "pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dev": true, + "requires": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + } + }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -8743,18 +10585,18 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "dev": true, "requires": { - "nanoid": "^3.3.1", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -9108,6 +10950,12 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -9153,6 +11001,45 @@ "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", "dev": true }, + "proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dev": true, + "requires": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -9205,6 +11092,24 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -9236,6 +11141,15 @@ "util-deprecate": "^1.0.1" } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -9264,61 +11178,165 @@ } }, "release-it": { - "version": "14.14.2", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.14.2.tgz", - "integrity": "sha512-+TE5Zg7x5BE/xw6i8SN9rmsGxCE2GVqH1v8Ay1L09nsLQx1HJhihAqUtCCDdgOuLvGpX0xgDMsSzakDlDLpOkA==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.0.0.tgz", + "integrity": "sha512-Dnio6p+1O88UdQZmPjdXqq+Nrrn5t0USZyOctTPK5M36kOOfQTdp8V1Wlagz9QYIYr93NwovEZ+f4wK0P/kHbw==", "dev": true, "requires": { "@iarna/toml": "2.2.5", "@octokit/rest": "18.12.0", "async-retry": "1.3.3", - "chalk": "4.1.2", + "chalk": "5.0.1", "cosmiconfig": "7.0.1", - "debug": "4.3.4", - "execa": "5.1.1", + "execa": "6.1.0", "form-data": "4.0.0", "git-url-parse": "11.6.0", - "globby": "11.0.4", - "got": "9.6.0", - "import-cwd": "3.0.0", - "inquirer": "8.2.0", + "globby": "13.1.1", + "got": "12.0.4", + "inquirer": "8.2.4", "is-ci": "3.0.1", "lodash": "4.17.21", "mime-types": "2.1.35", - "new-github-release-url": "1.0.0", - "open": "7.4.2", - "ora": "5.4.1", - "os-name": "4.0.1", - "parse-json": "5.2.0", + "new-github-release-url": "2.0.0", + "open": "8.4.0", + "ora": "6.1.0", + "os-name": "5.0.1", "promise.allsettled": "1.0.5", - "semver": "7.3.5", + "proxy-agent": "5.0.0", + "semver": "7.3.7", "shelljs": "0.8.5", "update-notifier": "5.1.0", - "url-join": "4.0.1", - "uuid": "8.3.2", + "url-join": "5.0.0", "wildcard-match": "5.1.2", - "yaml": "1.10.2", - "yargs-parser": "20.2.9" + "yargs-parser": "21.0.1" }, "dependencies": { - "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==", + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "got": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/got/-/got-12.0.4.tgz", + "integrity": "sha512-2Eyz4iU/ktq7wtMFXxzK7g5p35uNYLLdiZarZ5/Yn3IJlNEpBd5+dCgcAyxN8/8guZLszffwe3wVyw+DEVrpBg==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true + } + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "keyv": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.0.tgz", + "integrity": "sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "compress-brotli": "^1.3.8", + "json-buffer": "3.0.1" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" } } } @@ -9340,6 +11358,12 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -9371,6 +11395,23 @@ "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } } }, "retry": { @@ -9386,9 +11427,9 @@ "dev": true }, "rollup": { - "version": "2.70.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz", - "integrity": "sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg==", + "version": "2.75.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.5.tgz", + "integrity": "sha512-JzNlJZDison3o2mOxVmb44Oz7t74EfSd1SQrplQk0wSaXV7uLQXtVdHbxlcT3w+8tZ1TL4r/eLfc7nAbz38BBA==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -9500,26 +11541,18 @@ } }, "rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", "dev": true, "requires": { - "tslib": "~2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } + "tslib": "^2.1.0" } }, "sade": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", - "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, "requires": { "mri": "^1.1.0" @@ -9573,9 +11606,9 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9598,6 +11631,12 @@ } } }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -9636,9 +11675,9 @@ } }, "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "sirv": { @@ -9674,6 +11713,33 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + } + }, "sorcery": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", @@ -9716,6 +11782,12 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, "strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -9778,9 +11850,9 @@ } }, "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true }, "strip-indent": { @@ -9821,22 +11893,22 @@ "dev": true }, "svelte": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.47.0.tgz", - "integrity": "sha512-4JaJp3HEoTCGARRWZQIZDUanhYv0iyoHikklVHVLH9xFE9db22g4TDv7CPeNA8HD1JgjXI1vlhR1JZvvhaTu2Q==", + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.48.0.tgz", + "integrity": "sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==", "dev": true }, "svelte-hmr": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.9.tgz", - "integrity": "sha512-bKE9+4qb4sAnA+TKHiYurUl970rjA0XmlP9TEP7K/ncyWz3m81kA4HOgmlZK/7irGK7gzZlaPDI3cmf8fp/+tg==", + "version": "0.14.12", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", + "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", "dev": true, "requires": {} }, "svelte-preprocess": { - "version": "4.10.6", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.6.tgz", - "integrity": "sha512-I2SV1w/AveMvgIQlUF/ZOO3PYVnhxfcpNyGt8pxpUVhPfyfL/CZBkkw/KPfuFix5FJ9TnnNYMhACK3DtSaYVVQ==", + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", + "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", "dev": true, "requires": { "@types/pug": "^2.0.4", @@ -9848,15 +11920,15 @@ } }, "svelte-tiny-virtual-list": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.3.tgz", - "integrity": "sha512-f2V8xlB+5bnsQ2w02MqQvD/vTUrVr1QLacbDU8DNVNby/YMKX8b8IOft//eJId9Wv3ATaiIpnFpRD5ojt9MYtw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.5.tgz", + "integrity": "sha512-xg9ckb8UeeIme4/5qlwCrl2QNmUZ8SCQYZn3Ji83cUsoASqRNy3KWjpmNmzYvPDqCHSZjruBBsoB7t5hwuzw5g==", "dev": true }, "svelte2tsx": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.9.tgz", - "integrity": "sha512-xTDASjlh+rKo4QRhTRYSH87sS7fRoyX67xhGIMPKa3FYqftRHRmMes6nVgEskiuhBovslNHYYpMMg5YM5n/STg==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.10.tgz", + "integrity": "sha512-nokQ0HTTWMcNX6tLrDLiOmJCuqjKZU9nCZ6/mVuCL3nusXdbp+9nv69VG2pCy7uQC66kV4Ls+j0WfvvJuGVnkg==", "dev": true, "requires": { "dedent-js": "^1.0.1", @@ -9910,6 +11982,15 @@ "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", "dev": true }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -9925,6 +12006,12 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, "totalist": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", @@ -9949,6 +12036,15 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -9965,9 +12061,9 @@ } }, "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", + "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", "dev": true }, "unbox-primitive": { @@ -10003,6 +12099,18 @@ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", "dev": true }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, "update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", @@ -10043,9 +12151,9 @@ } }, "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true }, "url-parse-lax": { @@ -10063,12 +12171,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, "vendors": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", @@ -10076,18 +12178,28 @@ "dev": true }, "vite": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.1.tgz", - "integrity": "sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==", + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.9.tgz", + "integrity": "sha512-ffaam+NgHfbEmfw/Vuh6BHKKlI/XIAhxE5QSS7gFLIngxg171mg1P3a4LSRME0z2ZU1ScxoKzphkipcYwSD5Ew==", "dev": true, "requires": { "esbuild": "^0.14.27", "fsevents": "~2.3.2", - "postcss": "^8.4.12", + "postcss": "^8.4.13", "resolve": "^1.22.0", "rollup": "^2.59.0" } }, + "vm2": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + } + }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -10151,48 +12263,81 @@ "dev": true }, "windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz", + "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==", "dev": true, "requires": { - "execa": "^4.0.2" + "execa": "^5.1.1" }, "dependencies": { "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "pump": "^3.0.0" + "path-key": "^3.0.0" } }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true } } }, + "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==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -10228,6 +12373,12 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -10241,9 +12392,9 @@ "dev": true }, "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true } } diff --git a/package.json b/package.json index 3eb52c99..1a39fb8b 100644 --- a/package.json +++ b/package.json @@ -17,14 +17,14 @@ }, "devDependencies": { "@rollup/plugin-alias": "^3.1.9", - "@sveltejs/kit": "1.0.0-next.335", + "@sveltejs/kit": "1.0.0-next.348", "autoprefixer": "^10.4.7", "cross-env": "^7.0.3", "find-in-files": "^0.5.0", "prettier": "~2.6.2", "prettier-plugin-svelte": "^2.7.0", "release-it": "^15.0.0", - "rollup": "^2.73.0", + "rollup": "^2.75.5", "rollup-plugin-cleaner": "^1.0.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", @@ -32,11 +32,11 @@ "rollup-plugin-svelte": "^7.1.0", "sirv-cli": "^2.0.2", "svelte": "^3.48.0", - "svelte-preprocess": "^4.10.6", + "svelte-preprocess": "^4.10.7", "svelte-tiny-virtual-list": "^2.0.5", "svelte2tsx": "^0.5.10", "tape-modern": "^1.1.2", - "typescript": "^4.6.4" + "typescript": "^4.7.3" }, "author": "Robert Balfré (https://github.com/rob-balfre)", "license": "ISC", diff --git a/src/app.html b/src/app.html index 7473edde..86f305f9 100644 --- a/src/app.html +++ b/src/app.html @@ -4,9 +4,9 @@ - %svelte.head% + %sveltekit.head% -
%svelte.body%
+
%sveltekit.body%
diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 6b19c25e..f5f0eff8 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -52,7 +52,13 @@ false ); - if (hoverItemIndex === 0 && items[hoverItemIndex] && items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable) hoverItemIndex = 1; + if ( + hoverItemIndex === 0 && + items[hoverItemIndex] && + items[hoverItemIndex].isGroupHeader && + !items[hoverItemIndex].isSelectable + ) + hoverItemIndex = 1; }); beforeUpdate(() => { @@ -76,7 +82,6 @@ function handleClick(args) { const { item, i, event } = args; - // event.stopPropagation(); if (value && !isMulti && value[optionIdentifier] === item[optionIdentifier]) return closeList(); @@ -89,8 +94,8 @@ } } - function closeList(args) { - dispatch('closeList', args); + function closeList() { + dispatch('closeList'); } async function updateHoverItem(increment) { @@ -122,13 +127,15 @@ case 'ArrowDown': e.preventDefault(); items.length && updateHoverItem(1); - if (items[hoverItemIndex] && items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable) hoverItemIndex += 1; + if (items[hoverItemIndex] && items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable) + hoverItemIndex += 1; break; case 'ArrowUp': e.preventDefault(); items.length && updateHoverItem(-1); - if (items[hoverItemIndex] && items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable) hoverItemIndex > 0 ? hoverItemIndex -= 1 : hoverItemIndex = items.length - 1; - + if (items[hoverItemIndex] && items[hoverItemIndex].isGroupHeader && !items[hoverItemIndex].isSelectable) + hoverItemIndex > 0 ? (hoverItemIndex -= 1) : (hoverItemIndex = items.length - 1); + break; case 'Enter': e.preventDefault(); @@ -221,7 +228,12 @@ -
+
{#if items.length > 0} {#if VirtualList} - \ No newline at end of file + diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 57432744..57e86572 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -1,5 +1,5 @@ + +
+ {#if showList} +
+ +
+ {/if} + {#if isFocused} {ariaSelection} @@ -659,23 +704,12 @@ {/if}
-{#if mounted && listOpen} - -{/if} - diff --git a/src/lib/filter.js b/src/lib/filter.js index 5f82bbc9..0cf5b116 100644 --- a/src/lib/filter.js +++ b/src/lib/filter.js @@ -11,7 +11,7 @@ export default function filter({ convertStringItemsToObjects, filterGroupedItems, addCreatableItem, - getOptionLabel + getOptionLabel, }) { if (loadOptions && filterText.length > 0) return; if (!items) return []; @@ -20,7 +20,6 @@ export default function filter({ items = convertStringItemsToObjects(items); } - let filterResults = items.filter((item) => { let matchesFilter = itemFilter(getOptionLabel(item, filterText), filterText, item); diff --git a/src/lib/getItems.js b/src/lib/get-items.js similarity index 94% rename from src/lib/getItems.js rename to src/lib/get-items.js index 2473084d..b6d6ba1d 100644 --- a/src/lib/getItems.js +++ b/src/lib/get-items.js @@ -4,7 +4,7 @@ export default async function getItems({ dispatch, loadOptions, convertStringIte dispatch('error', { type: 'loadOptions', details: err }); }); - if (res && !res.cancelled) { + if (res && !res.cancelled) { if (res) { if (res && res.length > 0 && typeof res[0] !== 'object') { res = convertStringItemsToObjects(res); diff --git a/test/src/tests.js b/test/src/tests.js index d541f4e0..b2c5533f 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -11,14 +11,13 @@ import {assert, test} from 'tape-modern'; import VirtualList from 'svelte-tiny-virtual-list'; import getName from '../utils/nameGen'; - function querySelectorClick(selector) { document.querySelector(selector).click(); return new Promise(f => setTimeout(f, 0)); } -function handleKeyboard(key, target=window) { - target.dispatchEvent(new KeyboardEvent('keydown', {'key': key})); +function handleKeyboard(key) { + window.dispatchEvent(new KeyboardEvent('keydown', {'key': key})); return new Promise(f => setTimeout(f, 0)); } @@ -172,7 +171,6 @@ test('when isFocused true container adds focused class', async (t) => { const select = new Select({ target, props: { - isFocused: true } }); @@ -185,17 +183,12 @@ test('when isFocused true container adds focused class', async (t) => { test('when isFocused changes to true input should focus', async (t) => { const select = new Select({ target, - props: { - - isFocused: false - } }); - const setFocus = () => { select.$set({isFocused: true}); - }; - const hasFocused = await focus(target.querySelector('.svelte-select input'), setFocus); + + const hasFocused = target.querySelector('.svelte-select input'); t.ok(hasFocused); select.$destroy(); }); @@ -204,12 +197,11 @@ test('default empty list', async (t) => { const select = new Select({ target, props: { - listOpen: true } }); - t.ok(target.querySelector('.empty')); + t.ok(document.querySelector('.empty')); select.$destroy(); }); @@ -224,7 +216,7 @@ test('default list with five items', async (t) => { } }); - t.ok(target.getElementsByClassName('list-item').length); + t.ok(document.getElementsByClassName('list-item').length); select.$destroy(); }); @@ -240,7 +232,7 @@ test('should highlight active list item', async (t) => { } }); - t.ok(target.querySelector('.list-item .active').innerHTML === 'Pizza'); + t.ok(document.querySelector('.list-item .active').innerHTML === 'Pizza'); select.$destroy(); }); @@ -263,7 +255,7 @@ test('list scrolls to active item', async (t) => { }); let offsetBounding; - const container = target.querySelector('.list'); + const container = document.querySelector('.list'); const focusedElemBounding = container.querySelector('.list-item .active'); if (focusedElemBounding) { offsetBounding = container.getBoundingClientRect().bottom - focusedElemBounding.getBoundingClientRect().bottom; @@ -283,13 +275,12 @@ test('list scrolls to hovered item when navigating with keys', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: itemsWithIndex.concat(extras) } }); - const container = target.querySelector('.list'); + const container = document.querySelector('.list'); const totalListItems = container.querySelectorAll('.list-item').length; let selectedItemsAreWithinBounds = true; let loopCount = 1; @@ -320,8 +311,8 @@ test('hover item updates on keyUp or keyDown', async (t) => { } }); - await handleKeyboard('ArrowDown'); - const focusedElemBounding = target.querySelector('.list-item .hover'); + await handleKeyboard('ArrowDown', document.querySelector('.list')); + const focusedElemBounding = document.querySelector('.list-item .hover'); t.equal(focusedElemBounding.innerHTML.trim(), `Pizza`); select.$destroy(); }); @@ -461,7 +452,7 @@ test('Select opens List populated with items', async (t) => { }); await querySelectorClick('.svelte-select'); - t.ok(target.querySelector('.list-item')); + t.ok(document.querySelector('.list-item')); select.$destroy(); }); @@ -476,7 +467,7 @@ test('List starts with first item in hover state', async (t) => { }); await querySelectorClick('.svelte-select'); - t.ok(target.querySelector('.list-item .hover').innerHTML === 'Chocolate'); + t.ok(document.querySelector('.list-item .hover').innerHTML === 'Chocolate'); select.$destroy(); }); @@ -593,7 +584,7 @@ test('clicking Select with selected item should open list with item listed as ac await wait(0); document.querySelector('.svelte-select').click(); await wait(0); - t.ok(document.querySelector('.list-item .hover').innerHTML === 'Cake'); + t.ok(document.querySelector('.list-item .active').innerHTML === 'Cake'); select.$destroy(); }); @@ -842,7 +833,7 @@ test('clicking Select toggles List open state', async (t) => { const select = new Select({ target, props: { - + items } }); @@ -852,7 +843,6 @@ test('clicking Select toggles List open state', async (t) => { t.ok(document.querySelector('.list')); await querySelectorClick('.svelte-select'); t.ok(!document.querySelector('.list')); - select.$destroy(); }); @@ -860,7 +850,6 @@ test('Select filter text filters list', async (t) => { const select = new Select({ target, props: { - items } }); @@ -1046,7 +1035,6 @@ test(`show ellipsis for overflowing text in a List item`, async (t) => { const select = new Select({ target, props: { - listOpen: true, items: [ { @@ -1061,6 +1049,7 @@ test(`show ellipsis for overflowing text in a List item`, async (t) => { } }); + await wait(0); const first = document.querySelector('.list-item:first-child .item'); const last = document.querySelector('.list-item:last-child .item'); @@ -1078,18 +1067,13 @@ test('focusing in an external textarea should close and blur it', async (t) => { const select = new Select({ target, props: { - + listOpen: true, items, - } }); - const input = document.querySelector('.svelte-select input'); - input.focus(); - input.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - t.ok(select.listOpen); - await wait(0); textarea.focus(); + await wait(0); t.ok(!select.listOpen); textarea.remove(); select.$destroy(); @@ -1450,7 +1434,7 @@ test('group headers label should be created by getGroupHeaderLabel(item)', async const groupHeaderItem = select.getFilteredItems()[0]; - t.equal(target.querySelector('.list-group-title').textContent, getGroupHeaderLabel(groupHeaderItem)); + t.equal(document.querySelector('.list-group-title').textContent, getGroupHeaderLabel(groupHeaderItem)); select.$destroy(); }); @@ -1469,8 +1453,8 @@ test('groups should be sorted by expression', async (t) => { await wait(); - t.ok(target.querySelector('.list-group-title').textContent.trim() === 'Savory'); - t.ok(target.querySelector('.list-item').textContent.trim() === 'Pizza'); + t.ok(document.querySelector('.list-group-title').textContent.trim() === 'Savory'); + t.ok(document.querySelector('.list-item').textContent.trim() === 'Pizza'); select.$destroy(); }); @@ -1713,7 +1697,6 @@ test('when isMulti and value has items and list opens then first item in list sh Multi, isMulti: true, items, - isFocused: true } }); @@ -1857,15 +1840,13 @@ test('when getOptionLabel method and items is supplied then display result of ge const select = new Select({ target, props: { - getOptionLabel: (option) => option.notLabel, - isFocused: true, + listOpen: true, items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], } }); - await handleKeyboard('ArrowDown', select.input); - t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); + t.ok(document.querySelector('.item')?.innerHTML === 'This is not a label'); select.$destroy(); }); @@ -1874,14 +1855,12 @@ test('when getOptionLabel method and items is supplied then display result of ge const select = new Select({ target, props: { - getOptionLabel: (option) => option.notLabel, - isFocused: true, + listOpen: true, items: [{notLabel: 'This is not a label', value: 'not important #1'}, {notLabel: 'This is not also not a label', value: 'not important #2'}], } }); - await handleKeyboard('ArrowDown', select.input); t.ok(document.querySelector('.item').innerHTML === 'This is not a label'); select.$destroy(); @@ -1894,14 +1873,13 @@ test('when a custom Item component is supplied then use to display each item', a props: { Item: CustomItem, getOptionLabel: (option) => option.name, - isFocused: true, + listOpen: true, items: [{ image_url: 'https://images.punkapi.com/v2/keg.png', name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], } }); - await handleKeyboard('ArrowDown', select.input); t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); select.$destroy(); @@ -1921,7 +1899,7 @@ test('when a custom Selection component is supplied then use to display selectio } }); - await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('ArrowDown'); await handleKeyboard('Enter'); t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); @@ -1946,7 +1924,7 @@ test('when loadOptions method is supplied, isMulti is true and filterText has le await wait(0); await handleSet(select, {filterText: 'Juniper'}); await wait(600); - await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('ArrowDown'); await handleKeyboard('Enter'); t.ok(document.querySelector('.multi-item_label').innerHTML === 'Juniper Wheat Beer'); select.$destroy(); @@ -1978,33 +1956,12 @@ test('when getOptionLabel contains HTML then render the HTML', async (t) => { } }); - await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('ArrowDown'); t.ok(document.querySelector('.item').innerHTML === '

Chocolate

'); select.$destroy(); }); -test('when isMulti is true, value populated and arrowLeft is pressed then no items in list should be active', async (t) => { - const select = new Select({ - target, - props: { - Multi, - isMulti: true, - items, - value: [ - {value: 'pizza', label: 'Pizza'}, - {value: 'chips', label: 'Chips'}, - ], - isFocused: true - } - }); - - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); - window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowLeft'})); - t.ok(!document.querySelector('.hover')); - select.$destroy(); -}); - test('when hideEmptyState true then do not show "no items" div ', async (t) => { const select = new Select({ target, @@ -2028,7 +1985,7 @@ test('when value changes then select event should fire', async (t) => { const select = new Select({ target, props: { - + listOpen: true, items, } }); @@ -2039,8 +1996,7 @@ test('when value changes then select event should fire', async (t) => { selectEvent = event; }); - await handleSet(select, {isFocused: true}); - await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('ArrowDown'); await handleKeyboard('Enter'); t.ok(selectEvent); @@ -2103,12 +2059,11 @@ test('when items in list filter or update then first item in list should highlig isFocused: true } }); - - await handleKeyboard('ArrowDown', select.input); + await handleKeyboard('ArrowDown'); await handleKeyboard('ArrowDown'); - - t.ok(document.querySelector('.hover').innerHTML === 'Cake'); + await handleKeyboard('ArrowDown'); + t.ok(document.querySelector('.list .hover').innerHTML === 'Chips'); await handleSet(select, {filterText: 'c'}); t.ok(document.querySelector('.hover').innerHTML === 'Chocolate'); @@ -2560,7 +2515,6 @@ test('When creator selected, selected item is set to created item', async (t) => const select = new Select({ target, props: { - items, isCreatable: true, isFocused: true, @@ -2682,7 +2636,6 @@ test('When isCreatable with non-default item structure, item creator displays ge const select = new Select({ target, props: { - optionIdentifier: 'food', getOptionLabel: itemDisplay, getSelectionLabel: itemDisplay, @@ -2782,6 +2735,7 @@ test('When isCreatable and isMulti and optionIdentifier is supplied multiple cre test('When isCreatable and item is created then createItem method should only run once', async (t) => { let createItemRun = 0; + const createItem = (filterText) => { createItemRun += 1; return { @@ -2793,7 +2747,6 @@ test('When isCreatable and item is created then createItem method should only ru const select = new Select({ target, props: { - isCreatable: true, items, createItem @@ -2804,7 +2757,6 @@ test('When isCreatable and item is created then createItem method should only ru select.$set({ filterText: 'foo' }); await wait(0); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.ok(createItemRun === 2); select.$destroy(); @@ -3279,14 +3231,15 @@ test('losing focus of Select should close list', async (t) => { const select = new Select({ target, props: { - items, + isFocused: true } }); - await querySelectorClick('.svelte-select'); + t.ok(select.listOpen); document.querySelector('.svelte-select input').blur(); + await wait(); t.ok(!select.listOpen); select.$destroy(); @@ -3298,12 +3251,11 @@ test('clicking on an external textarea should close and blur it', async (t) => { const select = new Select({ target, props: { - + listOpen: true, items, } }); - await querySelectorClick('.svelte-select'); t.ok(select.listOpen); document.querySelector('textarea').focus(); t.ok(!select.listOpen); @@ -3464,7 +3416,7 @@ test('When listOffset is set list position offset changes', async (t) => { }, }); - let elem = target.querySelector('.list'); + let elem = document.querySelector('.list'); t.ok(elem.style.top === '50px'); select.$destroy(); @@ -3841,6 +3793,7 @@ test('When ariaListOpen, listOpen, then aria-context uses default updated', asyn }, }); + await wait(0); let aria = document.querySelector('#aria-context'); t.equal(aria.innerHTML, 'label: Chocolate, count: 5'); @@ -3851,16 +3804,15 @@ test('When ariaFocused, focused value supplied, then aria-context uses default u const select = new Select({ target, props: { - items: items, isFocused: true, + listOpen: false, ariaFocused: () => `nothing to see here.` }, }); let aria = document.querySelector('#aria-context'); t.equal(aria.innerHTML, 'nothing to see here.'); - select.$destroy(); }); From 9259af6b2b73c786092f1f40988e7b8eabfa80ad Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 9 Jun 2022 08:53:27 +1000 Subject: [PATCH 399/635] Release 5.0.0-beta.12 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ef681ed..ca94ba86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "svelte-select", - "version": "5.0.0-beta.11", + "version": "5.0.0-beta.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "svelte-select", - "version": "5.0.0-beta.11", + "version": "5.0.0-beta.12", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 1a39fb8b..f71c979f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.11", + "version": "5.0.0-beta.12", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A component for Svelte apps", "scripts": { From 9cf0efb1485dbac81bf905750af9d594c6968cbe Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 9 Jun 2022 09:44:31 +1000 Subject: [PATCH 402/635] #403 chevron pointer events fix --- src/lib/Select.svelte | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index ee42b446..b1afca9f 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -882,11 +882,7 @@ color: var(--chevron-color, --icons-color); box-shadow: var(--chevron-box-shadow, -1px 0 0 0 #c5cacf); padding: var(--chevron-padding, 0 8px); - pointer-events: all; - } - - .svelte-select.list-open .chevron { - pointer-events: none; + pointer-events: var(--chevron-pointer-events, none); } .svelte-select.multi.two-icons { From 45c41e73154f3a0a1c8d82ac79e868fbae6f67eb Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 9 Jun 2022 09:44:57 +1000 Subject: [PATCH 403/635] Release 5.0.0-beta.14 --- docs/theming_variables.md | 1 + package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/theming_variables.md b/docs/theming_variables.md index 610595bf..e9292531 100644 --- a/docs/theming_variables.md +++ b/docs/theming_variables.md @@ -14,6 +14,7 @@ Override the following CSS custom properties (variables) to style svelte-select - `--chevron-icon-colour` - `--chevron-icon-width` - `--chevron-padding` +- `--chevron-pointer-events` - `--chevron-width` - `--clear-icon-color` - `--clear-icon-width` diff --git a/package-lock.json b/package-lock.json index cc7bf9b1..159d70ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "svelte-select", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "svelte-select", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index f141a1d0..7ba46fa0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A +``` + +### CSS Camel to kebab: + +CSS classes and custom properties changed (only depreciated, no need to update if upgrading from v4) from camel to kebab case. For example `selectedItem` → `selected-item` and `--borderRadius` → `--border-radius` + +### Redundant CSS custom properties: + +The following CSS custom properties were removed in v5. + +```css +--clearSelectColor +--clearSelectFocusColor +--clearSelectHoverColor +--groupTitleTextTransform +--indicatorColor +--indicatorFill +--indicatorHeight +--listLeft +--listRight +--multiClearBG +--multiClearFill +--multiClearHeight +--multiClearHoverBG +--multiClearHoverFill +--multiClearPadding +--multiClearRadius +--multiClearTextAlign +--multiClearTop +--multiClearWidth +--multiItemActiveBG +--multiItemActiveColor +--spinnerLeft +--spinnerRight +--virtualListHeight +``` + + +### Other CSS class name changes: +`selectContainer` → `svelte-select`
+`listContainer` → `svelte-select-list`
+`indicator` → `chevron`
+`--clear-icon-colour` → `--clear-icon-color`
+`virtual-list` removed + + +### Prop changes: +`containerClasses` → `class`
+`MultiSelection` → `Multi`
+`indicatorSvg` → `ChevronIcon`
+`showIndicator` → `showChevron`
+`selectedValue` removed (was already deprecated in v4 in favour of `value`)
+`loadOptionsInterval` → `debounceWait` + + +### Event change: +The `select` event now only fires when the user selects an item. If you also want to track programmatic changes use the new `change` event. \ No newline at end of file diff --git a/README.md b/README.md index 0abc9bac..135f51dd 100644 --- a/README.md +++ b/README.md @@ -25,80 +25,12 @@ npm install svelte-select@beta ``` -## Migrating for v4 to v5 - -v5 is a major release that that includes some ⚠️ BREAKING CHANGES ⚠️ - -Removed `isVirtualList` instead `npm i svelte-tiny-virtual-list -D` and - -```svelte - - - ``` +### Change where List gets appended + +By default List gets appended to the `document.body`. For most use-cases this is fine. If you want more control then supply a `appendListTarget` Element + +```svelte + + +
+ ``` ## A11y (Accessibility) diff --git a/rollup.config.js b/rollup.config.js index 0f3649fa..1bab1149 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -19,6 +19,10 @@ export default [ find: /\$lib\/(.*)/, replacement: path.join(__dirname, 'src/lib/$1'), }, + { + find: '$app/env', + replacement: path.join(__dirname, 'test/src/env'), + } ], }), svelte({ diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 5e516f04..08fb46ad 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -24,6 +24,7 @@ export let hoverItemIndex = 0; export let activeItemIndex = 0; export let suggestionMode; + export let computePlacement; let isScrollingTimer = null; let isScrolling = false; @@ -193,45 +194,17 @@ return (item.isGroupHeader && item.isSelectable) || item.selectable || !item.hasOwnProperty('selectable'); } - let listStyle; - let placementClass; - function computePlacement() { - if (!parent || !list) return; - - const { top, bottom, left, height, width } = parent.getBoundingClientRect(); - - let styles; - - const base = `position:fixed;left:${left}px;min-width:${width}px;width:${ - listAutoWidth ? width + 'px' : 'auto' - };`; - - const _top = `bottom:${window.innerHeight - bottom + height + listOffset}px;`; - const _bottom = `top:${top + height + listOffset}px;`; - - if (listPlacement === 'top') { - styles = base + _top; - placementClass = 'top'; - } else if (listPlacement === 'bottom') { - styles = base + _bottom; - placementClass = 'bottom'; - } else { - styles = base + _bottom; - placementClass = 'bottom'; - - if (bottom + listOffset + list.offsetHeight > window.innerHeight) { - styles = base + _top; - placementClass = 'top'; - } - } - - listStyle = styles; + let computed; + function handleWindow() { + computed = computePlacement({parent, list, listPlacement, listOffset, listAutoWidth}); } - $: if (parent && list) computePlacement(); + $: if (parent && list) handleWindow(); + $: placementClass = computed && computed.placementClass; + $: listStyle = computed && computed.listStyle; - +
import { beforeUpdate, createEventDispatcher, onDestroy, onMount } from 'svelte'; + import { browser } from '$app/env'; + const dispatch = createEventDispatcher(); import _Item from './Item.svelte'; @@ -12,6 +14,7 @@ import _filter from '$lib/filter'; import _getItems from '$lib/get-items'; + import _computePlacement from '$lib/compute-placement'; export let justValue = null; // read-only @@ -20,6 +23,7 @@ export let Selection = _Selection; export let filter = _filter; export let getItems = _getItems; + export let computePlacement = _computePlacement; export let Multi = _Multi; export let ChevronIcon = _ChevronIcon; @@ -319,6 +323,7 @@ listAutoWidth, listOffset, suggestionMode, + computePlacement }; $: filteredItems = filter({ @@ -594,7 +599,8 @@ showList = true; } - $: if (listApp) document.body.appendChild(listApp); + export let appendListTarget = browser && document && document.body; + $: if (listApp && appendListTarget) appendListTarget.appendChild(listApp); function handleClickOutside(event) { if (container && !container.contains(event.target) && !listApp?.contains(event.target)) { diff --git a/src/lib/compute-placement.js b/src/lib/compute-placement.js new file mode 100644 index 00000000..29e3abb8 --- /dev/null +++ b/src/lib/compute-placement.js @@ -0,0 +1,30 @@ +export default function computePlacement({ parent, list, listPlacement, listOffset, listAutoWidth }) { + const { top, bottom, left, height, width } = parent.getBoundingClientRect(); + + let listStyle; + let placementClass; + + const base = `position:fixed;left:${left}px;min-width:${width}px;width:${listAutoWidth ? width + 'px' : 'auto'};`; + const _top = `bottom:${window.innerHeight - bottom + height + listOffset}px;`; + const _bottom = `top:${top + height + listOffset}px;`; + + if (listPlacement === 'top') { + listStyle = base + _top; + placementClass = 'top'; + } else if (listPlacement === 'bottom') { + listStyle = base + _bottom; + placementClass = 'bottom'; + } else { + listStyle = base + _bottom; + placementClass = 'bottom'; + if (bottom + listOffset + list.offsetHeight > window.innerHeight) { + listStyle = base + _top; + placementClass = 'top'; + } + } + + return { + placementClass, + listStyle, + }; +} diff --git a/test/src/env.js b/test/src/env.js new file mode 100644 index 00000000..27522f6c --- /dev/null +++ b/test/src/env.js @@ -0,0 +1 @@ +export const browser = true; \ No newline at end of file diff --git a/test/src/tests.js b/test/src/tests.js index ea53f252..58ccc6fc 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -4198,7 +4198,7 @@ test('when items are grouped and filter text results in no items then list rende select.$destroy(); }); -test('sanitiseLabel method filters label from items and selection', async (t) => { +test('when < is supplied in filterText then sanitiseLabel method coverts to HTML entity', async (t) => { const select = new Select({ target, props: { @@ -4215,4 +4215,21 @@ test('sanitiseLabel method filters label from items and selection', async (t) => await wait(0); let selection = document.querySelector('.selected-item .selection').innerHTML; t.ok(selection === '<test />'); + + select.$destroy(); +}) + +test('when appendListTarget is supplied then list is appended to parent target', async (t) => { + const select = new Select({ + target, + props: { + items, + listOpen: true, + appendListTarget: document.querySelector('main') + } + }); + + t.ok(document.querySelector('main .svelte-select-list')); + + select.$destroy(); }) \ No newline at end of file From b3a4dba1802e3f0f453afab2502108acd212d05e Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Thu, 14 Jul 2022 14:23:55 +1000 Subject: [PATCH 411/635] Release 5.0.0-beta.15 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16793335..ff23da21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "svelte-select", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "svelte-select", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "license": "ISC", "devDependencies": { "@rollup/plugin-alias": "^3.1.9", diff --git a/package.json b/package.json index 7ba46fa0..70ee3b91 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte-select", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "repository": "https://rob-balfre@github.com/rob-balfre/svelte-select.git", "description": "A - +
+
+ +
+
+ diff --git a/test/src/SelectionSlotTest.svelte b/test/src/SelectionSlotTest.svelte new file mode 100644 index 00000000..d5c8a46c --- /dev/null +++ b/test/src/SelectionSlotTest.svelte @@ -0,0 +1,12 @@ + + + diff --git a/test/src/tests.js b/test/src/tests.js index 58ccc6fc..6b0153f3 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -10,6 +10,7 @@ import ParentContainer from './Select/ParentContainer.svelte' import {assert, test} from 'tape-modern'; import VirtualList from 'svelte-tiny-virtual-list'; import getName from '../utils/nameGen'; +import SelectionSlotTest from './SelectionSlotTest.svelte'; function querySelectorClick(selector) { document.querySelector(selector).click(); @@ -390,12 +391,11 @@ test('selected item\'s default view', async (t) => { const select = new Select({ target, props: { - value: {value: 'chips', label: 'Chips'}, } }); - t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); + t.ok(target.querySelector('.selected-item').innerHTML === 'Chips'); select.$destroy(); }); @@ -405,7 +405,7 @@ test('select view updates with value updates', async (t) => { }); await handleSet(select, {value: {value: 'chips', label: 'Chips'}}); - t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); + t.ok(target.querySelector('.selected-item').innerHTML === 'Chips'); select.$destroy(); }); @@ -421,7 +421,7 @@ test('clear wipes value and updates view', async (t) => { await wait(0); await handleSet(select, {value: undefined}); - t.ok(!target.querySelector('.selected-item .selection')); + t.ok(!target.querySelector('.selected-item')); select.$destroy(); }); @@ -484,7 +484,7 @@ test('select item from list', async (t) => { await handleKeyboard('ArrowDown'); await handleKeyboard('ArrowDown'); await handleKeyboard('Enter'); - t.ok(document.querySelector('.selection').innerHTML === 'Cake'); + t.ok(document.querySelector('.selected-item').innerHTML === 'Cake'); select.$destroy(); }); @@ -1009,18 +1009,18 @@ test(`two way binding between Select and it's parent component`, async (t) => { } }); - t.equal(document.querySelector('.selection').innerHTML, document.querySelector('.result').innerHTML); + t.equal(document.querySelector('.selected-item').innerHTML, document.querySelector('.result').innerHTML); parent.$set({ value: {value: 'ice-cream', label: 'Ice Cream'}, }); - t.equal(document.querySelector('.selection').innerHTML, document.querySelector('.result').innerHTML); + t.equal(document.querySelector('.selected-item').innerHTML, document.querySelector('.result').innerHTML); document.querySelector('.svelte-select').click(); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'ArrowDown'})); window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); - t.equal(document.querySelector('.selection').innerHTML, document.querySelector('.result').innerHTML); + t.equal(document.querySelector('.selected-item').innerHTML, document.querySelector('.result').innerHTML); parent.$destroy(); }); @@ -1458,12 +1458,12 @@ test('groups should be sorted by expression', async (t) => { select.$destroy(); }); -test('when isMulti is true show each item in value', async (t) => { +test('when multiple is true show each item in value', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [ {value: 'pizza', label: 'Pizza'}, @@ -1479,12 +1479,12 @@ test('when isMulti is true show each item in value', async (t) => { select.$destroy(); }); -test('when isMulti is true and value is undefined show placeholder text', async (t) => { +test('when multiple is true and value is undefined show placeholder text', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: undefined } @@ -1495,12 +1495,12 @@ test('when isMulti is true and value is undefined show placeholder text', async select.$destroy(); }); -test('when isMulti is true clicking item in List will populate value', async (t) => { +test('when multiple is true clicking item in List will populate value', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: undefined } @@ -1514,12 +1514,12 @@ test('when isMulti is true clicking item in List will populate value', async (t) select.$destroy(); }); -test('when isMulti is true items in value will not appear in List', async (t) => { +test('when multiple is true items in value will not appear in List', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] } @@ -1537,13 +1537,13 @@ test('when isMulti is true items in value will not appear in List', async (t) => select.$destroy(); }); -test('when isMulti is true both value and filterText filters List', async (t) => { +test('when multiple is true both value and filterText filters List', async (t) => { const select = new Select({ target, props: { Multi, listOpen: true, - isMulti: true, + multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] } @@ -1558,12 +1558,12 @@ test('when isMulti is true both value and filterText filters List', async (t) => select.$destroy(); }); -test('when isMulti is true clicking X on a selected item will remove it from value', async (t) => { +test('when multiple is true clicking X on a selected item will remove it from value', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] } @@ -1575,12 +1575,12 @@ test('when isMulti is true clicking X on a selected item will remove it from val select.$destroy(); }); -test('when isMulti is true and all selected items have been removed then placeholder should show and clear all should hide', async (t) => { +test('when multiple is true and all selected items have been removed then placeholder should show and clear all should hide', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] } @@ -1591,12 +1591,12 @@ test('when isMulti is true and all selected items have been removed then placeho select.$destroy(); }); -test('when isMulti is true and items are selected then clear all should wipe all selected items', async (t) => { +test('when multiple is true and items are selected then clear all should wipe all selected items', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] } @@ -1608,12 +1608,12 @@ test('when isMulti is true and items are selected then clear all should wipe all select.$destroy(); }); -test('when isMulti and groupBy is active then items should be selectable', async (t) => { +test('when multiple and groupBy is active then items should be selectable', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items: itemsWithGroup, groupBy: (item) => item.group } @@ -1627,12 +1627,12 @@ test('when isMulti and groupBy is active then items should be selectable', async select.$destroy(); }); -test('when isMulti and selected items reach edge of container then Select height should increase and selected items should wrap to new line', async (t) => { +test('when multiple and selected items reach edge of container then Select height should increase and selected items should wrap to new line', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items } }); @@ -1644,12 +1644,12 @@ test('when isMulti and selected items reach edge of container then Select height select.$destroy(); }); -test('when isMulti and value is populated then navigating with LeftArrow updates activeValue', async (t) => { +test('when multiple and value is populated then navigating with LeftArrow updates activeValue', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], isFocused: true @@ -1667,12 +1667,12 @@ test('when isMulti and value is populated then navigating with LeftArrow updates select.$destroy(); }); -test('when isMulti and value is populated then navigating with ArrowRight updates activeValue', async (t) => { +test('when multiple and value is populated then navigating with ArrowRight updates activeValue', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], isFocused: true @@ -1689,12 +1689,12 @@ test('when isMulti and value is populated then navigating with ArrowRight update select.$destroy(); }); -test('when isMulti and value has items and list opens then first item in list should be active', async (t) => { +test('when multiple and value has items and list opens then first item in list should be active', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, } }); @@ -1709,12 +1709,12 @@ test('when isMulti and value has items and list opens then first item in list sh select.$destroy(); }); -test('when isMulti, isDisabled, and value has items then items should be locked', async (t) => { +test('when multiple, isDisabled, and value has items then items should be locked', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, isDisabled: true, value: [{value: 'chocolate', label: 'Chocolate'}], @@ -1726,12 +1726,12 @@ test('when isMulti, isDisabled, and value has items then items should be locked' select.$destroy(); }); -test('when isMulti is true show each item in value if simple arrays are used', async (t) => { +test('when multiple is true show each item in value if simple arrays are used', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items: ['pizza', 'chips', 'chocolate'], value: ['pizza', 'chocolate'] } @@ -1757,7 +1757,7 @@ test('when labelIdentifier is set you can pass a string and see the right label' } }); - t.ok(document.querySelector('.selection').innerHTML === 'ONE'); + t.ok(document.querySelector('.selected-item').innerHTML === 'ONE'); select.$destroy(); }); @@ -1788,7 +1788,6 @@ test('when loadOptions method is supplied and filterText has length then items s target, props: { Item: CustomItem, - Selection: CustomItem, getOptionLabel: (option) => option.name, loadOptions: getPosts, optionIdentifier: 'id', @@ -1830,7 +1829,7 @@ test('when getSelectionLabel method is supplied and value are no items then disp }); - t.ok(document.querySelector('.selection').innerHTML === 'This is not a label'); + t.ok(document.querySelector('.selected-item').innerHTML === 'This is not a label'); select.$destroy(); }); @@ -1884,29 +1883,7 @@ test('when a custom Item component is supplied then use to display each item', a select.$destroy(); }); -test('when a custom Selection component is supplied then use to display selection', async (t) => { - const select = new Select({ - target, - props: { - Item: CustomItem, - Selection: CustomItem, - getOptionLabel: (option) => option.name, - isFocused: true, - items: [{ - image_url: 'https://images.punkapi.com/v2/keg.png', - name: 'A Name', tagline: 'A tagline', abv: 'A abv'}], - } - }); - - await handleKeyboard('ArrowDown'); - await handleKeyboard('Enter'); - - t.ok(document.querySelector('.customItem_name').innerHTML === 'A Name'); - - select.$destroy(); -}); - -test('when loadOptions method is supplied, isMulti is true and filterText has length then items should populate via promise resolve', async (t) => { +test('when loadOptions method is supplied, multiple is true and filterText has length then items should populate via promise resolve', async (t) => { const select = new Select({ target, props: { @@ -1916,7 +1893,7 @@ test('when loadOptions method is supplied, isMulti is true and filterText has le getSelectionLabel: (option) => option.name, loadOptions: getPosts, optionIdentifier: 'id', - isMulti: true + multiple: true } }); @@ -1929,17 +1906,12 @@ test('when loadOptions method is supplied, isMulti is true and filterText has le select.$destroy(); }); -test('when getSelectionLabel contains HTML then render the HTML', async (t) => { - const select = new Select({ - target, - props: { - - value: items[0], - getSelectionLabel: (option) => `

${option.label}

`, - } +test('when selection slot render slot content', async (t) => { + const select = new SelectionSlotTest({ + target }); - t.ok(document.querySelector('.selection').innerHTML === '

Chocolate

'); + t.ok(document.querySelector('.selected-item').innerHTML === 'Slot: one'); select.$destroy(); }); @@ -2031,7 +2003,7 @@ test('when multi item is cleared the clear event is fired with removed item', as target, props: { Multi, - isMulti: true, + multiple: true, items, value: [itemToRemove] } @@ -2090,12 +2062,12 @@ test('when item is selected or state changes then check value[optionIdentifier] select.$destroy(); }); -test('when isMulti and item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { +test('when multiple and item is selected or state changes then check value[optionIdentifier] has changed before firing "select" event', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [ {value: 'pizza', label: 'Pizza'}, @@ -2218,7 +2190,7 @@ test('when items are just strings then value should render', async (t) => { } }); - t.ok(document.querySelector('.selection').innerHTML === 'one'); + t.ok(document.querySelector('.selected-item').innerHTML === 'one'); select.$destroy(); }); @@ -2247,12 +2219,12 @@ test('when VirtualList then render list', async (t) => { select.$destroy(); }); -test('when isMulti and value has items then check each item is unique', async (t) => { +test('when multiple and value has items then check each item is unique', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [ {value: 'pizza', label: 'Pizza'}, @@ -2267,12 +2239,12 @@ test('when isMulti and value has items then check each item is unique', async (t select.$destroy(); }); -test('when isMulti and textFilter has length then enter should select item', async (t) => { +test('when multiple and textFilter has length then enter should select item', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, isFocused: true, filterText: 'p', @@ -2287,12 +2259,12 @@ test('when isMulti and textFilter has length then enter should select item', asy select.$destroy(); }); -test('when isMulti and textFilter has length and no items in list then enter should do nothing', async (t) => { +test('when multiple and textFilter has length and no items in list then enter should do nothing', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, isFocused: true, filterText: 'zc', @@ -2306,12 +2278,12 @@ test('when isMulti and textFilter has length and no items in list then enter sho select.$destroy(); }); -test('When isMulti and no selected item then delete should do nothing', async (t) => { +test('When multiple and no selected item then delete should do nothing', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, isFocused: true, listOpen: true @@ -2342,7 +2314,7 @@ test('When list is open, filterText applied and Enter/Tab key pressed should sel window.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'})); t.equal(select.value.value, 'A5'); await wait(0); - t.ok(target.querySelector('.selected-item .selection').innerHTML === 'A5'); + t.ok(target.querySelector('.selected-item').innerHTML === 'A5'); select.$destroy(); }); @@ -2379,17 +2351,17 @@ test('when items and value supplied as just strings then value should render cor } }); - t.equal(document.querySelector('.selected-item .selection').innerHTML, 'Pizza'); + t.equal(document.querySelector('.selected-item').innerHTML, 'Pizza'); select.$destroy(); }); -test('when isMulti with items and value supplied as just strings then value should render correctly', async (t) => { +test('when multiple with items and value supplied as just strings then value should render correctly', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items: ['Pizza', 'Chocolate', 'Crisps'], value: ['Pizza'] } @@ -2400,7 +2372,7 @@ test('when isMulti with items and value supplied as just strings then value shou select.$destroy(); }); -test('when isMulti, groupBy and value are supplied then list should be filtered', async (t) => { +test('when multiple, groupBy and value are supplied then list should be filtered', async (t) => { let _items = [ { id: 1, name: "Foo", group: "first" }, { id: 2, name: "Bar", group: "second" }, @@ -2413,7 +2385,7 @@ test('when isMulti, groupBy and value are supplied then list should be filtered' target, props: { Multi, - isMulti: true, + multiple: true, items: _items, groupBy: (item) => item.group, optionIdentifier: 'id', @@ -2544,7 +2516,7 @@ test('When creator is selected, created item it added to multi selection', async isCreatable: true, isFocused: true, listOpen: true, - isMulti: true + multiple: true } }); @@ -2572,7 +2544,7 @@ test('When creator is selected multiple times, items are all added to multi sele isCreatable: true, isFocused: true, listOpen: true, - isMulti: true + multiple: true } }); @@ -2592,7 +2564,7 @@ test('When creator is selected multiple times, items are all added to multi sele select.$destroy(); }); -test('When isMulti and an items remove icon is clicked then item should be removed from value', async (t) => { +test('When multiple and an items remove icon is clicked then item should be removed from value', async (t) => { const select = new Select({ target, props: { @@ -2603,7 +2575,7 @@ test('When isMulti and an items remove icon is clicked then item should be remov {value: 'pizza', label: 'Pizza'}, {value: 'cake', label: 'Cake'}, ], - isMulti: true + multiple: true } }); @@ -2658,7 +2630,7 @@ test('When isCreatable with non-default item structure, item creator displays ge select.$destroy(); }); -test('When isCreatable and isMulti and optionIdentifier is supplied creator displays getCreatorLabel label', async (t) => { +test('When isCreatable and multiple and optionIdentifier is supplied creator displays getCreatorLabel label', async (t) => { const filterText = 'abc'; const _items = [ {foo: 'chocolate', label: 'Chocolate'}, @@ -2670,7 +2642,7 @@ test('When isCreatable and isMulti and optionIdentifier is supplied creator disp props: { Multi, optionIdentifier: 'foo', - isMulti: true, + multiple: true, items: _items, isCreatable: true } @@ -2685,7 +2657,7 @@ test('When isCreatable and isMulti and optionIdentifier is supplied creator disp select.$destroy(); }); -test('When isCreatable and isMulti and optionIdentifier is supplied multiple creatable items can be added', async (t) => { +test('When isCreatable and multiple and optionIdentifier is supplied multiple creatable items can be added', async (t) => { const filterText = 'foo'; const filterText2 = 'bar'; @@ -2707,7 +2679,7 @@ test('When isCreatable and isMulti and optionIdentifier is supplied multiple cre props: { Multi, optionIdentifier, - isMulti: true, + multiple: true, items: _items, isCreatable: true, getOptionLabel, @@ -2927,8 +2899,6 @@ test('When noOptionsMessage is changed after List component has been created the getOptionLabel: (option) => option.name, loadOptions: getPosts, optionIdentifier: 'id', - Item: CustomItem, - Selection: CustomItem, noOptionsMessage: 'FIRST' }, }); @@ -3036,7 +3006,7 @@ test('When items change then value should also update', async (t) => { await wait(0); t.ok(select.value.label === 'Loaded Fries'); - t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Loaded Fries'); + t.ok(target.querySelector('.selected-item').innerHTML === 'Loaded Fries'); select.$destroy(); @@ -3046,7 +3016,7 @@ test('When items change then value should also update', async (t) => { target, props: { Multi, - isMulti: true, + multiple: true, items, value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], }, @@ -3093,17 +3063,17 @@ test('When items change then value should also update but only if found in items await wait(0); t.ok(select.value.label === 'Chips'); - t.ok(target.querySelector('.selected-item .selection').innerHTML === 'Chips'); + t.ok(target.querySelector('.selected-item').innerHTML === 'Chips'); select.$destroy(); }); -test('When isMulti and multiFullItemClearable then clicking anywhere on the item will remove item', async (t) => { +test('When multiple and multiFullItemClearable then clicking anywhere on the item will remove item', async (t) => { const multiSelect = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, multiFullItemClearable: true, value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], @@ -3118,12 +3088,12 @@ test('When isMulti and multiFullItemClearable then clicking anywhere on the item multiSelect.$destroy(); }); -test('When isMulti and filterText then items should filter out already selected items', async (t) => { +test('When multiple and filterText then items should filter out already selected items', async (t) => { const multiSelect = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items, value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], }, @@ -3173,7 +3143,7 @@ test('when isCreatable and item created then event "itemCreated" should dispatch isCreatable: true, isFocused: true, listOpen: true, - isMulti: true + multiple: true } }); @@ -3263,7 +3233,7 @@ test('clicking on an external textarea should close and blur it', async (t) => { select.$destroy(); }); -test('when switching between isMulti true/false ensure Select continues working', async (t) => { +test('when switching between multiple true/false ensure Select continues working', async (t) => { const select = new Select({ target, props: { @@ -3274,13 +3244,13 @@ test('when switching between isMulti true/false ensure Select continues working' } }); - select.isMulti = true; + select.multiple = true; select.loadOptions = itemsPromise; t.ok(JSON.stringify(select.value) === JSON.stringify([{value: 'chips', label: 'Chips'}])); t.ok(Array.isArray(select.value)); - select.isMulti = false; + select.multiple = false; select.loadOptions = null; select.items = [...items]; @@ -3325,7 +3295,7 @@ test('when esc key pressed should close list', async (t) => { }); -test('when isMulti and placeholderAlwaysShow then always show placeholder text', async (t) => { +test('when multiple and placeholderAlwaysShow then always show placeholder text', async (t) => { const select = new Select({ target, props: { @@ -3333,7 +3303,7 @@ test('when isMulti and placeholderAlwaysShow then always show placeholder text', items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'},], - isMulti: true, + multiple: true, placeholderAlwaysShow: true, placeholder: 'foo bar' } @@ -3375,7 +3345,7 @@ test('when loadOptions and value then items should show on promise resolve',asyn select.$destroy(); }); -test('when loadOptions, isMulti and value then filterText should remain on promise resolve',async (t) => { +test('when loadOptions, multiple and value then filterText should remain on promise resolve',async (t) => { const loadOptionsFn = async () => { return Promise.resolve([ {value: 'chocolate', label: 'Chocolate'}, @@ -3388,7 +3358,7 @@ test('when loadOptions, isMulti and value then filterText should remain on promi target, props: { Multi, - isMulti: true, + multiple: true, value: { value: 'chocolate', label: 'Chocolate' }, @@ -3560,13 +3530,13 @@ test('When groupBy, optionIdentifier, labelIdentifier and createGroupHeaderItem }); -test('When isMulti on:select events should fire on each item removal (including the last item)', async (t) => { +test('When multiple on:select events should fire on each item removal (including the last item)', async (t) => { const select = new Select({ target, props: { Multi, items, - isMulti: true, + multiple: true, value: ['Cake', 'Chips'] }, }); @@ -3674,12 +3644,12 @@ test('When value then hidden field should have value', async (t) => { select.$destroy(); }); -test('When isMulti and no value then hidden field should no value', async (t) => { +test('When multiple and no value then hidden field should no value', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items: items, }, }); @@ -3690,12 +3660,12 @@ test('When isMulti and no value then hidden field should no value', async (t) => select.$destroy(); }); -test('When isMulti and value then hidden fields should list value items', async (t) => { +test('When multiple and value then hidden fields should list value items', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items: items, value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},] }, @@ -3744,12 +3714,12 @@ test('When listOpen and value then aria-selection describes value', async (t) => select.$destroy(); }); -test('When listOpen, value and isMulti then aria-selection describes value', async (t) => { +test('When listOpen, value and multiple then aria-selection describes value', async (t) => { const select = new Select({ target, props: { Multi, - isMulti: true, + multiple: true, items: items, value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},], isFocused: true @@ -4213,8 +4183,8 @@ test('when < is supplied in filterText then sanitiseLabel method coverts to HTML t.ok(item.innerHTML === 'Create "<test />"'); item.click(); await wait(0); - let selection = document.querySelector('.selected-item .selection').innerHTML; - t.ok(selection === '<test />'); + let selection = document.querySelector('.selected-item').innerHTML; + t.ok(selection === '&lt;test />'); select.$destroy(); }) From 3ef74341b9f76d7dc0f75d90cfb41da24e02d059 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Fri, 22 Jul 2022 11:14:00 +1000 Subject: [PATCH 416/635] Removed Multi, now uses named slot --- CHANGELOG.md | 1 + README.md | 1 - src/lib/Multi.svelte | 68 -------- src/lib/Select.svelte | 90 +++++++--- src/lib/tailwind.css | 6 +- test/src/SelectionSlotMultipleTest.svelte | 12 ++ test/src/tests.js | 195 +++------------------- 7 files changed, 102 insertions(+), 271 deletions(-) delete mode 100644 src/lib/Multi.svelte create mode 100644 test/src/SelectionSlotMultipleTest.svelte diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f923c1d..ba0e24cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 5.0.0 +* Removed Multi component * Added named slot `selection` * Removed Selection component * isMulti -> multiple diff --git a/README.md b/README.md index 299dc55a..06e73428 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,6 @@ See [migration guide](/MIGRATION_GUIDE.md) if upgrading from v4 to v5. | Import | Type | Description | | ----------- | ----------- | --------------------- | | Item | `component` | Item component | -| Multi | `component` | Multi select support | | ChevronIcon | `component` | Chevron Icon | | ClearIcon | `component` | Clear Icon | | LoadingIcon | `component` | Spinning Loading Icon | diff --git a/src/lib/Multi.svelte b/src/lib/Multi.svelte deleted file mode 100644 index dc724260..00000000 --- a/src/lib/Multi.svelte +++ /dev/null @@ -1,68 +0,0 @@ - - -{#each value as item, i} -
(multiFullItemClearable ? handleClear(i, event) : {})}> -
- {@html getSelectionLabel(item)} -
- {#if !isDisabled && !multiFullItemClearable && ClearIcon} -
handleClear(i, event)}> - -
- {/if} -
-{/each} - - - \ No newline at end of file diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index 7837ae9d..9566d199 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -6,7 +6,6 @@ import _Item from './Item.svelte'; import _List from './List.svelte'; import _ClearIcon from './ClearIcon.svelte'; - import _Multi from './Multi.svelte'; import _ChevronIcon from './ChevronIcon.svelte'; import _LoadingIcon from './LoadingIcon.svelte'; @@ -22,7 +21,6 @@ export let getItems = _getItems; export let computePlacement = _computePlacement; - export let Multi = _Multi; export let ChevronIcon = _ChevronIcon; export let ClearIcon = _ClearIcon; export let LoadingIcon = _LoadingIcon; @@ -288,9 +286,9 @@ } } - $: hasValue = multiple ? value && value.length > 1 : value; + $: hasValue = multiple ? value && value.length > 0 : value; $: _showChevron = showChevron && ChevronIcon; - $: showSelectedItem = hasValue && filterText.length === 0; + $: showSelectedItem = hasValue && (filterText.length === 0 || multiple); $: showClear = showSelectedItem && isClearable && !isDisabled && !isWaiting; $: placeholderText = placeholderAlwaysShow && multiple ? placeholder : value ? '' : placeholder; $: showMultiSelect = multiple && value && value.length > 0; @@ -374,7 +372,9 @@ if (!items || items.length === 0 || items.some((item) => typeof item !== 'object')) return; if ( !value || - (multiple ? value.some((selection) => !selection || !selection[optionIdentifier]) : !value[optionIdentifier]) + (multiple + ? value.some((selection) => !selection || !selection[optionIdentifier]) + : !value[optionIdentifier]) ) return; @@ -385,9 +385,8 @@ } } - function handleMultiItemClear(event) { - const { detail } = event; - const itemToRemove = value[detail ? detail.i : value.length - 1]; + function handleMultiItemClear(i) { + const itemToRemove = value[i]; if (value.length === 1) { value = undefined; @@ -652,17 +651,30 @@ {/if} - {#if showMultiSelect} - + {#if showSelectedItem} + {#if multiple} + {#each value as item, i} +
(multiFullItemClearable ? handleMultiItemClear(i) : {})}> + + {getSelectionLabel(item)} + + + {#if !isDisabled && !multiFullItemClearable && ClearIcon} +
handleMultiItemClear(i)}> + +
+ {/if} +
+ {/each} + {:else} +
+ + {getSelectionLabel(value)} + +
+ {/if} {/if} - {#if !multiple && showSelectedItem} -
- - { getSelectionLabel(value) } - -
- {/if} +
{#if showClear} @@ -907,9 +913,9 @@ padding: var(--multi-select-padding, 0 35px 0 16px); min-height: 38px; flex-wrap: wrap; - align-items: stretch; display: flex; height: auto; + align-items: center; } .svelte-select.multi input { @@ -938,4 +944,34 @@ .multi input { flex: 1 1 40px; } + + .multi-item { + background: var(--multi-item-bg, #ebedef); + margin: var(--multi-item-margin, 4px 5px 0 0); + border: var(--multi-item-border, 1px solid #ddd); + border-radius: var(--multi-item-border-radius, 4px); + height: var(--multi-item-height, 32px); + line-height: var(--multi-item-height, 32px); + display: flex; + cursor: default; + padding: var(--multi-item-padding, 0 6px 0 6px); + max-width: var(--multi-max-width, calc(100% - 8px)); + box-sizing: border-box; + margin: var(--multi-label-margin, 0 5px 0 0); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .multi-item.disabled:hover { + background: var(--multi-item-disabled-hover-bg, #ebedef); + color: var(--multi-item-disabled-hover-color, #c1c6cc); + } + + .multi-item_clear { + display: flex; + align-items: center; + justify-content: center; + --clear-icon-color: var(--multi-item-clear-icon-color, #000); + } diff --git a/src/lib/tailwind.css b/src/lib/tailwind.css index 28da96cc..1d17559d 100644 --- a/src/lib/tailwind.css +++ b/src/lib/tailwind.css @@ -114,11 +114,7 @@ } .multi-item { - @apply bg-gray-100 mt-1 mr-1 border border-gray-200 rounded-sm h-8 leading-8 flex cursor-default pr-1 pl-1 max-w-full items-center; -} - -.multi-item_label { - @apply mr-1 overflow-hidden overflow-ellipsis whitespace-nowrap; + @apply bg-gray-100 mt-1 mr-1 border border-gray-200 rounded-sm h-8 leading-8 flex cursor-default pr-1 pl-1 max-w-full items-center mr-1 overflow-hidden overflow-ellipsis whitespace-nowrap; } .multi-item.disabled { diff --git a/test/src/SelectionSlotMultipleTest.svelte b/test/src/SelectionSlotMultipleTest.svelte new file mode 100644 index 00000000..83a89914 --- /dev/null +++ b/test/src/SelectionSlotMultipleTest.svelte @@ -0,0 +1,12 @@ + + + diff --git a/test/src/tests.js b/test/src/tests.js index 6b0153f3..91226f06 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -1,7 +1,6 @@ import normalizeHtml from '../utils/normalizeHtml'; import CustomItem from './CustomItem.svelte'; import Select from '../../src/lib/Select.svelte'; -import Multi from '../../src/lib/Multi.svelte'; import ChevronIcon from '../../src/lib/ChevronIcon.svelte'; import TestIcon from './TestIcon.svelte'; import TestClearIcon from './TestClearIcon.svelte'; @@ -11,6 +10,7 @@ import {assert, test} from 'tape-modern'; import VirtualList from 'svelte-tiny-virtual-list'; import getName from '../utils/nameGen'; import SelectionSlotTest from './SelectionSlotTest.svelte'; +import SelectionSlotMultipleTest from './SelectionSlotMultipleTest.svelte'; function querySelectorClick(selector) { document.querySelector(selector).click(); @@ -211,7 +211,6 @@ test('default list with five items', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: itemsWithIndex } @@ -226,7 +225,6 @@ test('should highlight active list item', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: itemsWithIndex, value: {value: 'pizza', label: 'Pizza', index: 1} @@ -305,7 +303,6 @@ test('hover item updates on keyUp or keyDown', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: items } @@ -321,7 +318,6 @@ test('on enter active item fires a select event', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: itemsWithIndex } @@ -345,7 +341,6 @@ test('on tab active item fires a select event', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: itemsWithIndex } @@ -368,7 +363,6 @@ test('on selected of current active item does not fire a select event', async (t const select = new Select({ target, props: { - listOpen: true, items: itemsWithIndex, value: { value: 'chocolate', label: 'Chocolate', index: 0 } @@ -414,7 +408,6 @@ test('clear wipes value and updates view', async (t) => { const select = new Select({ target, props: { - value: {value: 'chips', label: 'Chips'}, } }); @@ -430,7 +423,6 @@ test('clicking on Select opens List', async (t) => { const select = new Select({ target, props: { - } }); @@ -445,7 +437,6 @@ test('Select opens List populated with items', async (t) => { const select = new Select({ target, props: { - items } }); @@ -460,7 +451,6 @@ test('List starts with first item in hover state', async (t) => { const select = new Select({ target, props: { - items } }); @@ -475,7 +465,6 @@ test('select item from list', async (t) => { const select = new Select({ target, props: { - items, } }); @@ -493,7 +482,6 @@ test('when listPosition is set to top list should be above the input', async (t) const select = new Select({ target, props: { - items, listOpen: true, listPlacement: 'top' @@ -512,7 +500,6 @@ test('when listPlacement is set to bottom the list should be below the input', a const select = new Select({ target, props: { - items, listOpen: true, listPlacement: 'bottom' @@ -535,7 +522,6 @@ test('blur should close list and remove focus from select', async (t) => { const select = new Select({ target, props: { - items } }); @@ -552,7 +538,6 @@ test('selecting item should close list but keep focus on select', async (t) => { const select = new Select({ target, props: { - items } }); @@ -570,7 +555,6 @@ test('clicking Select with selected item should open list with item listed as ac const select = new Select({ target, props: { - items } }); @@ -591,7 +575,6 @@ test('focus on Select input updates focus state', async (t) => { const select = new Select({ target, props: { - items } }); @@ -606,7 +589,6 @@ test('key up and down when Select focused opens list', async (t) => { const select = new Select({ target, props: { - items } }); @@ -626,7 +608,6 @@ test('List should keep width of parent Select', async (t) => { const select = new Select({ target, props: { - items, isFocused: true } @@ -650,7 +631,6 @@ test('Placeholder text should reappear when List is closed', async (t) => { const select = new Select({ target, props: { - items } }); @@ -668,7 +648,6 @@ test('typing in Select filter will hide selected Item', async (t) => { const select = new Select({ target, props: { - items } }); @@ -687,7 +666,6 @@ test('clearing selected item closes List if open', async (t) => { const select = new Select({ target, props: { - items } }); @@ -712,7 +690,6 @@ test('closing List clears Select filter text', async (t) => { const select = new Select({ target, props: { - items } }); @@ -735,7 +712,6 @@ test('closing List clears Select filter text', async (t) => { const select = new Select({ target, props: { - items } }); @@ -758,7 +734,6 @@ test('closing List item clears Select filter text', async (t) => { const select = new Select({ target, props: { - items } }); @@ -778,7 +753,6 @@ test('typing while Select is focused populates Select filter text', async (t) => const select = new Select({ target, props: { - items } }); @@ -798,7 +772,6 @@ test('Select input placeholder wipes while item is selected', async (t) => { const select = new Select({ target, props: { - items, value: {name: 'Item #2'}, } @@ -814,7 +787,6 @@ test('Select listOpen state controls List', async (t) => { const select = new Select({ target, props: { - items, listOpen: true } @@ -832,7 +804,6 @@ test('clicking Select toggles List open state', async (t) => { const select = new Select({ target, props: { - items } }); @@ -864,7 +835,6 @@ test('Select filter text filters list with itemFilter', async (t) => { const select = new Select({ target, props: { - items, itemFilter: (label, filterText, option) => label === 'Ice Cream' } @@ -881,7 +851,6 @@ test('Typing in the Select filter opens List', async (t) => { const select = new Select({ target, props: { - items, isFocused: true } @@ -896,7 +865,6 @@ test('While filtering, the first item in List should receive hover class', async const select = new Select({ target, props: { - items, isFocused: true } @@ -912,7 +880,6 @@ test('Select container styles can be overridden', async (t) => { const select = new Select({ target, props: { - items, value: {name: 'Item #2'}, containerStyles: `padding-left: 40px;` @@ -927,7 +894,6 @@ test('Select can be disabled', async (t) => { const select = new Select({ target, props: { - items, isDisabled: true, } @@ -942,7 +908,6 @@ test('Select List closes when you click enter', async (t) => { const select = new Select({ target, props: { - items, isFocused: true } @@ -960,7 +925,6 @@ test('tabbing should move between tabIndexes and others Selects', async (t) => { const select = new Select({ target, props: { - items, isFocused: false } @@ -969,7 +933,6 @@ test('tabbing should move between tabIndexes and others Selects', async (t) => { const other = new Select({ target: extraTarget, props: { - items, isFocused: false } @@ -986,7 +949,6 @@ test(`shouldn't be able to clear a disabled Select`, async (t) => { const select = new Select({ target, props: { - items, isDisabled: true, value: {name: 'Item #4'} @@ -1003,7 +965,6 @@ test(`two way binding between Select and it's parent component`, async (t) => { const parent = new ParentContainer({ target, props: { - items, value: {value: 'chips', label: 'Chips'}, } @@ -1082,7 +1043,6 @@ test('clicking between Selects should close and blur other Select', async (t) => const select = new Select({ target, props: { - items, isFocused: false } @@ -1091,7 +1051,6 @@ test('clicking between Selects should close and blur other Select', async (t) => const other = new Select({ target: extraTarget, props: { - items, isFocused: false } @@ -1117,7 +1076,6 @@ test('if only one item in list it should have hover state', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: [{ index: 0, @@ -1135,7 +1093,6 @@ test(`hovered item in a filtered list shows hover state`, async (t) => { const select = new Select({ target, props: { - items } }); @@ -1154,7 +1111,6 @@ test(`data shouldn't be stripped from item - currently only saves name`, async ( const select = new Select({ target, props: { - items } }); @@ -1170,7 +1126,6 @@ test('should not be able to clear when clearing is disabled', async (t) => { const select = new Select({ target, props: { - items, isClearable: false } @@ -1189,7 +1144,6 @@ test('should not be able to search when searching is disabled', async (t) => { const select = new Select({ target, props: { - items, isSearchable: false } @@ -1210,7 +1164,6 @@ test('placeholder should be prop value', async (t) => { const select = new Select({ target, props: { - items: itemsWithGroup, placeholder } @@ -1229,7 +1182,6 @@ test('should display loading icon when waiting is enabled', async (t) => { const select = new Select({ target, props: { - items, isWaiting: true } @@ -1244,7 +1196,6 @@ test('inputStyles prop applies css to select input', async (t) => { const select = new Select({ target, props: { - items, value: {value: 'pizza', label: 'Pizza'}, inputStyles: `padding-left: 40px;` @@ -1259,7 +1210,6 @@ test('items should be grouped by groupBy expression', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: itemsWithGroup, groupBy @@ -1282,7 +1232,6 @@ test('clicking group header should not make a selected', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1301,7 +1250,6 @@ test('clicking an item with selectable: false should not make a selected', async const select = new Select({ target, props: { - listOpen: true, items: itemsWithSelectable } @@ -1321,7 +1269,6 @@ test('clicking an item with selectable not specified should make a selected', as const select = new Select({ target, props: { - listOpen: true, items: itemsWithSelectable } @@ -1340,7 +1287,6 @@ test('clicking an item with selectable: true should make a selected', async (t) const select = new Select({ target, props: { - listOpen: true, items: itemsWithSelectable } @@ -1356,7 +1302,6 @@ test('when groupBy, no active item and keydown enter is fired then list should c const select = new Select({ target, props: { - listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1375,7 +1320,6 @@ test('when isGroupHeaderSelectable clicking group header should select createGro const select = new Select({ target, props: { - listOpen: true, items: itemsWithGroup, isGroupHeaderSelectable: true, @@ -1413,7 +1357,6 @@ test('group headers label should be created by getGroupHeaderLabel(item)', async const select = new Select({ target, props: { - listOpen: true, items: itemsWithGroup, groupBy, @@ -1442,7 +1385,6 @@ test('groups should be sorted by expression', async (t) => { const select = new Select({ target, props: { - listOpen: true, items: itemsWithGroup, groupBy: (item) => item.group, @@ -1462,7 +1404,6 @@ test('when multiple is true show each item in value', async (t) => { const select = new Select({ target, props: { - Multi, multiple: true, items, value: [ @@ -1472,9 +1413,10 @@ test('when multiple is true show each item in value', async (t) => { } }); - const all = target.querySelectorAll('.multi-item .multi-item_label'); - t.ok(all[0].innerHTML === 'Pizza'); - t.ok(all[1].innerHTML === 'Chips'); + const all = target.querySelectorAll('.multi-item'); + + t.ok(all[0].innerHTML.startsWith('Pizza')); + t.ok(all[1].innerHTML.startsWith('Chips')); select.$destroy(); }); @@ -1483,7 +1425,6 @@ test('when multiple is true and value is undefined show placeholder text', async const select = new Select({ target, props: { - Multi, multiple: true, items, value: undefined @@ -1499,7 +1440,6 @@ test('when multiple is true clicking item in List will populate value', async (t const select = new Select({ target, props: { - Multi, multiple: true, items, value: undefined @@ -1518,7 +1458,6 @@ test('when multiple is true items in value will not appear in List', async (t) = const select = new Select({ target, props: { - Multi, multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1541,7 +1480,6 @@ test('when multiple is true both value and filterText filters List', async (t) = const select = new Select({ target, props: { - Multi, listOpen: true, multiple: true, items, @@ -1562,7 +1500,6 @@ test('when multiple is true clicking X on a selected item will remove it from va const select = new Select({ target, props: { - Multi, multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] @@ -1579,7 +1516,6 @@ test('when multiple is true and all selected items have been removed then placeh const select = new Select({ target, props: { - Multi, multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}] @@ -1595,7 +1531,6 @@ test('when multiple is true and items are selected then clear all should wipe al const select = new Select({ target, props: { - Multi, multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}] @@ -1612,7 +1547,6 @@ test('when multiple and groupBy is active then items should be selectable', asyn const select = new Select({ target, props: { - Multi, multiple: true, items: itemsWithGroup, groupBy: (item) => item.group @@ -1631,7 +1565,6 @@ test('when multiple and selected items reach edge of container then Select heigh const select = new Select({ target, props: { - Multi, multiple: true, items } @@ -1648,7 +1581,6 @@ test('when multiple and value is populated then navigating with LeftArrow update const select = new Select({ target, props: { - Multi, multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], @@ -1671,7 +1603,6 @@ test('when multiple and value is populated then navigating with ArrowRight updat const select = new Select({ target, props: { - Multi, multiple: true, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'}, {value: 'chips', label: 'Chips'},], @@ -1693,7 +1624,6 @@ test('when multiple and value has items and list opens then first item in list s const select = new Select({ target, props: { - Multi, multiple: true, items, } @@ -1713,7 +1643,6 @@ test('when multiple, isDisabled, and value has items then items should be locked const select = new Select({ target, props: { - Multi, multiple: true, items, isDisabled: true, @@ -1730,16 +1659,15 @@ test('when multiple is true show each item in value if simple arrays are used', const select = new Select({ target, props: { - Multi, multiple: true, items: ['pizza', 'chips', 'chocolate'], value: ['pizza', 'chocolate'] } }); - const all = target.querySelectorAll('.multi-item .multi-item_label'); - t.ok(all[0].innerHTML === 'pizza'); - t.ok(all[1].innerHTML === 'chocolate'); + const all = target.querySelectorAll('.multi-item'); + t.ok(all[0].innerHTML.startsWith('pizza')); + t.ok(all[1].innerHTML.startsWith('chocolate')); select.$destroy(); }); @@ -1749,7 +1677,6 @@ test('when labelIdentifier is set you can pass a string and see the right label' const select = new Select({ target, props: { - items: [{id: 0, name: 'ONE'}, {id: 1, name: 'TWO'}], value: {id: 0, name: 'ONE'}, optionIdentifier: 'id', @@ -1767,7 +1694,6 @@ test('when getValue method is set should use that key to update value', async (t const select = new Select({ target, props: { - items: [{id: 0, label: 'ONE'}, {id: 1, label: 'TWO'}], value: {id: 0, label: 'ONE'}, optionIdentifier: 'id' @@ -1807,7 +1733,6 @@ test('when noOptionsMessage is set and there are no items then show message', as const select = new Select({ target, props: { - noOptionsMessage: 'SO SO SO SCANDALOUS', listOpen: true } @@ -1822,7 +1747,6 @@ test('when getSelectionLabel method is supplied and value are no items then disp const select = new Select({ target, props: { - getSelectionLabel: (option) => option.notLabel, value: {notLabel: 'This is not a label', value: 'not important'}, } @@ -1888,7 +1812,6 @@ test('when loadOptions method is supplied, multiple is true and filterText has l target, props: { Item: CustomItem, - Multi, getOptionLabel: (option) => option.name, getSelectionLabel: (option) => option.name, loadOptions: getPosts, @@ -1902,7 +1825,7 @@ test('when loadOptions method is supplied, multiple is true and filterText has l await wait(600); await handleKeyboard('ArrowDown'); await handleKeyboard('Enter'); - t.ok(document.querySelector('.multi-item_label').innerHTML === 'Juniper Wheat Beer'); + t.ok(document.querySelector('.multi-item').innerHTML.startsWith('Juniper Wheat Beer')); select.$destroy(); }); @@ -1916,11 +1839,24 @@ test('when selection slot render slot content', async (t) => { select.$destroy(); }); +test('when multiple and selection slot render slot content', async (t) => { + const select = new SelectionSlotMultipleTest({ + target + }); + + const items = document.querySelectorAll('.multi-item'); + + t.ok(items[0].innerHTML.startsWith('Slot: one')); + t.ok(items[1].innerHTML.startsWith('Slot: two')); + + select.$destroy(); +}); + + test('when getOptionLabel contains HTML then render the HTML', async (t) => { const select = new Select({ target, props: { - items, getOptionLabel: (option) => `

${option.label}

`, isFocused: true @@ -1937,7 +1873,6 @@ test('when hideEmptyState true then do not show "no items" div ', async (t) => { const select = new Select({ target, props: { - items, listOpen: true, filterText: 'x', @@ -1979,7 +1914,6 @@ test('when value is cleared the clear event is fired', async (t) => { const select = new Select({ target, props: { - items, value: items[0], } @@ -2002,7 +1936,6 @@ test('when multi item is cleared the clear event is fired with removed item', as const select = new Select({ target, props: { - Multi, multiple: true, items, value: [itemToRemove] @@ -2025,7 +1958,6 @@ test('when items in list filter or update then first item in list should highlig const select = new Select({ target, props: { - items, isFocused: true } @@ -2066,7 +1998,6 @@ test('when multiple and item is selected or state changes then check value[optio const select = new Select({ target, props: { - Multi, multiple: true, items, value: [ @@ -2095,7 +2026,6 @@ test('when isFocused turns to false then check Select is no longer in focus', as const select = new Select({ target, props: { - isFocused: true, items, } @@ -2104,7 +2034,6 @@ test('when isFocused turns to false then check Select is no longer in focus', as const selectSecond = new Select({ target: extraTarget, props: { - isFocused: false, items, } @@ -2140,7 +2069,6 @@ test('when items and loadOptions method are both supplied then fallback to items const select = new Select({ target, props: { - getOptionLabel: (option) => option.name, getSelectionLabel: (option) => option.name, loadOptions: getPosts, @@ -2166,7 +2094,6 @@ test('when items is just an array of strings then render list', async (t) => { const select = new Select({ target, props: { - items, listOpen: true } @@ -2184,7 +2111,6 @@ test('when items are just strings then value should render', async (t) => { const select = new Select({ target, props: { - items, value: {value: 'one', label: 'one', index: 0} } @@ -2223,7 +2149,6 @@ test('when multiple and value has items then check each item is unique', async ( const select = new Select({ target, props: { - Multi, multiple: true, items, value: [ @@ -2243,7 +2168,6 @@ test('when multiple and textFilter has length then enter should select item', as const select = new Select({ target, props: { - Multi, multiple: true, items, isFocused: true, @@ -2263,7 +2187,6 @@ test('when multiple and textFilter has length and no items in list then enter sh const select = new Select({ target, props: { - Multi, multiple: true, items, isFocused: true, @@ -2282,7 +2205,6 @@ test('When multiple and no selected item then delete should do nothing', async ( const select = new Select({ target, props: { - Multi, multiple: true, items, isFocused: true, @@ -2301,7 +2223,6 @@ test('When list is open, filterText applied and Enter/Tab key pressed should sel const select = new Select({ target, props: { - listOpen: true, isFocused: true, filterText: 'A5', @@ -2324,7 +2245,6 @@ test('When inputAttributes is supplied each attribute is placed on the Select in const select = new Select({ target, props: { - items, inputAttributes: { id: 'testId', @@ -2345,7 +2265,6 @@ test('when items and value supplied as just strings then value should render cor const select = new Select({ target, props: { - items: ['Pizza', 'Chocolate', 'Crisps'], value: 'Pizza' } @@ -2360,14 +2279,13 @@ test('when multiple with items and value supplied as just strings then value sho const select = new Select({ target, props: { - Multi, multiple: true, items: ['Pizza', 'Chocolate', 'Crisps'], value: ['Pizza'] } }); - t.equal(document.querySelector('.multi-item_label').innerHTML, 'Pizza'); + t.ok(document.querySelector('.multi-item').innerHTML.startsWith('Pizza')); select.$destroy(); }); @@ -2384,7 +2302,6 @@ test('when multiple, groupBy and value are supplied then list should be filtered const select = new Select({ target, props: { - Multi, multiple: true, items: _items, groupBy: (item) => item.group, @@ -2407,7 +2324,6 @@ test('When isCreatable disabled, creator is not displayed', async (t) => { const select = new Select({ target, props: { - items, isFocused: true, listOpen: true @@ -2435,7 +2351,6 @@ test('When isCreatable enabled, creator displays getOptionLabel for isCreator', const select = new Select({ target, props: { - items, isCreatable: true, isFocused: true, @@ -2463,7 +2378,6 @@ test('When isCreatable enabled, creator is not displayed when duplicate item val const select = new Select({ target, props: { - items: [item], isCreatable: true, listOpen: true @@ -2511,7 +2425,6 @@ test('When creator is selected, created item it added to multi selection', async const select = new Select({ target, props: { - items, isCreatable: true, isFocused: true, @@ -2539,7 +2452,6 @@ test('When creator is selected multiple times, items are all added to multi sele const select = new Select({ target, props: { - items, isCreatable: true, isFocused: true, @@ -2568,7 +2480,6 @@ test('When multiple and an items remove icon is clicked then item should be remo const select = new Select({ target, props: { - Multi, items, isCreatable: true, value: [ @@ -2640,7 +2551,6 @@ test('When isCreatable and multiple and optionIdentifier is supplied creator dis const select = new Select({ target, props: { - Multi, optionIdentifier: 'foo', multiple: true, items: _items, @@ -2677,7 +2587,6 @@ test('When isCreatable and multiple and optionIdentifier is supplied multiple cr const select = new Select({ target, props: { - Multi, optionIdentifier, multiple: true, items: _items, @@ -2737,7 +2646,6 @@ test('When items are collection and value a string then lookup item using option const select = new Select({ target, props: { - items, value: 'cake' } @@ -2755,7 +2663,6 @@ test('When listAutoWidth is set to false list container should have style of wid const select = new Select({ target, props: { - items, listAutoWidth: false, listOpen: true @@ -2773,7 +2680,6 @@ test('When item is already active and is selected from list then close list', as const select = new Select({ target, props: { - items, listOpen: true, value: 'pizza' @@ -2792,7 +2698,6 @@ test('When Icon prop is supplied then render on Select', async (t) => { const select = new Select({ target, props: { - items, Icon: TestIcon } @@ -2807,7 +2712,6 @@ test('When showChevron prop is true only show chevron when there is no value on const select = new Select({ target, props: { - items, value: {value: 'chocolate', label: 'Chocolate'}, showChevron: true @@ -2855,7 +2759,6 @@ test('When items and loadItems then listOpen should be false', async (t) => { const select = new Select({ target, props: { - getSelectionLabel: (option) => option.name, getOptionLabel: (option) => option.name, loadOptions: getPosts, @@ -2877,7 +2780,6 @@ test('Select container classes can be injected', async (t) => { const select = new Select({ target, props: { - items, value: {value: 'cake', label: 'Cake'}, class: 'svelte-select testclass', @@ -2895,7 +2797,6 @@ test('When noOptionsMessage is changed after List component has been created the const select = new Select({ target, props: { - getOptionLabel: (option) => option.name, loadOptions: getPosts, optionIdentifier: 'id', @@ -2923,7 +2824,6 @@ test('When loadOptions promise is resolved then dispatch loaded', async (t) => { const select = new Select({ target, props: { - loadOptions: resolvePromise, }, }); @@ -2955,7 +2855,6 @@ test('When loadOptions promise is rejected then dispatch error', async (t) => { const select = new Select({ target, props: { - loadOptions: rejectPromise, }, }); @@ -2987,7 +2886,6 @@ test('When items change then value should also update', async (t) => { const select = new Select({ target, props: { - items, value: {value: 'chips', label: 'Chips'}, }, @@ -3015,7 +2913,6 @@ test('When items change then value should also update', async (t) => { const multiSelect = new Select({ target, props: { - Multi, multiple: true, items, value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], @@ -3044,7 +2941,6 @@ test('When items change then value should also update but only if found in items const select = new Select({ target, props: { - items, value: {value: 'chips', label: 'Chips'}, }, @@ -3072,7 +2968,6 @@ test('When multiple and multiFullItemClearable then clicking anywhere on the ite const multiSelect = new Select({ target, props: { - Multi, multiple: true, items, multiFullItemClearable: true, @@ -3092,7 +2987,6 @@ test('When multiple and filterText then items should filter out already selected const multiSelect = new Select({ target, props: { - Multi, multiple: true, items, value: [{value: 'chips', label: 'Chips'}, {value: 'pizza', label: 'Pizza'}], @@ -3117,7 +3011,6 @@ test('when loadOptions and items is supplied then list should close on blur', as const select = new Select({ target, props: { - items, loadOptions, } @@ -3138,7 +3031,6 @@ test('when isCreatable and item created then event "itemCreated" should dispatch const select = new Select({ target, props: { - items, isCreatable: true, isFocused: true, @@ -3169,7 +3061,6 @@ test('when loadOptions response returns cancelled true then dont end loading sta const select = new Select({ target, props: { - loadOptions: getCancelledRes, } }); @@ -3237,7 +3128,6 @@ test('when switching between multiple true/false ensure Select continues working const select = new Select({ target, props: { - items, listOpen: true, value: {value: 'chips', label: 'Chips'} @@ -3263,7 +3153,6 @@ test('when isSearchable is false then input should be readonly', async (t) => { const select = new Select({ target, props: { - items, isSearchable: false } @@ -3280,7 +3169,6 @@ test('when esc key pressed should close list', async (t) => { const select = new Select({ target, props: { - items, listOpen: true } @@ -3299,7 +3187,6 @@ test('when multiple and placeholderAlwaysShow then always show placeholder text' const select = new Select({ target, props: { - Multi, items, value: [{value: 'chocolate', label: 'Chocolate'}, {value: 'pizza', label: 'Pizza'},], @@ -3329,7 +3216,6 @@ test('when loadOptions and value then items should show on promise resolve',asyn const select = new Select({ target, props: { - value: { value: 'chocolate', label: 'Chocolate' }, @@ -3357,7 +3243,6 @@ test('when loadOptions, multiple and value then filterText should remain on prom const select = new Select({ target, props: { - Multi, multiple: true, value: { value: 'chocolate', label: 'Chocolate' @@ -3378,7 +3263,6 @@ test('When listOffset is set list position offset changes', async (t) => { const select = new Select({ target, props: { - items, listOffset: 0, listOpen: true @@ -3395,7 +3279,6 @@ test('When items are updated post onMount ensure filtering still works', async ( const select = new Select({ target, props: { - items: null }, }); @@ -3416,7 +3299,6 @@ test('When grouped items are updated post onMount ensure filtering still works', const select = new Select({ target, props: { - groupBy: item => item.group }, }); @@ -3440,10 +3322,8 @@ test('When groupBy and value selected ensure filtering still works', async (t) = const select = new Select({ target, props: { - items: itemsWithGroup, groupBy: (item) => item.group, - }, }); @@ -3459,7 +3339,6 @@ test('When value selected and filterText then ensure selecting the active value const select = new Select({ target, props: { - items, }, }); @@ -3481,7 +3360,6 @@ test('When groupBy, optionIdentifier and labelIdentifier then ensure list displa const select = new Select({ target, props: { - items: itemsWithGroupIds, optionIdentifier: '_id', labelIdentifier: 'name', @@ -3505,7 +3383,6 @@ test('When groupBy, optionIdentifier, labelIdentifier and createGroupHeaderItem const select = new Select({ target, props: { - items: itemsWithGroupIds, optionIdentifier: '_id', labelIdentifier: 'name', @@ -3534,7 +3411,6 @@ test('When multiple on:select events should fire on each item removal (including const select = new Select({ target, props: { - Multi, items, multiple: true, value: ['Cake', 'Chips'] @@ -3561,7 +3437,6 @@ test('When loadOptions and isCreatable then create new item is active when promi const select = new Select({ target, props: { - loadOptions: itemsPromiseEmpty, isCreatable: true, }, @@ -3579,7 +3454,6 @@ test('When loadOptions and isCreatable then create new item show at bottom of re const select = new Select({ target, props: { - loadOptions: itemsPromise, isCreatable: true, }, @@ -3598,7 +3472,6 @@ test('When inputAttributes.name supplied, add to hidden input', async (t) => { const select = new Select({ target, props: { - inputAttributes: { name: 'Foods' }, items: items, showChevron: true, @@ -3615,10 +3488,8 @@ test('When no value then hidden field should also have no value', async (t) => { const select = new Select({ target, props: { - inputAttributes: { name: 'Foods' }, items: items, - }, }); @@ -3632,7 +3503,6 @@ test('When value then hidden field should have value', async (t) => { const select = new Select({ target, props: { - items: items, value: {value: 'cake', label: 'Cake'}, }, @@ -3648,7 +3518,6 @@ test('When multiple and no value then hidden field should no value', async (t) = const select = new Select({ target, props: { - Multi, multiple: true, items: items, }, @@ -3664,7 +3533,6 @@ test('When multiple and value then hidden fields should list value items', async const select = new Select({ target, props: { - Multi, multiple: true, items: items, value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},] @@ -3683,7 +3551,6 @@ test('When listOpen then aria-context describes highlighted item', async (t) => const select = new Select({ target, props: { - items: items, listOpen: true }, @@ -3701,7 +3568,6 @@ test('When listOpen and value then aria-selection describes value', async (t) => const select = new Select({ target, props: { - items: items, value: {value: 'cake', label: 'Cake'}, isFocused: true @@ -3718,7 +3584,6 @@ test('When listOpen, value and multiple then aria-selection describes value', as const select = new Select({ target, props: { - Multi, multiple: true, items: items, value: [{value: 'cake', label: 'Cake'}, {value: 'pizza', label: 'Pizza'},], @@ -3737,7 +3602,6 @@ test('When ariaValues and value supplied, then aria-selection uses default updat const select = new Select({ target, props: { - items: items, value: {value: 'pizza', label: 'Pizza'}, isFocused: true, @@ -3755,7 +3619,6 @@ test('When ariaListOpen, listOpen, then aria-context uses default updated', asyn const select = new Select({ target, props: { - items: items, listOpen: true, ariaListOpen: (label, count) => `label: ${label}, count: ${count}` @@ -3790,7 +3653,6 @@ test('When id supplied then add to input', async (t) => { const select = new Select({ target, props: { - id: 'foods', items: items, }, @@ -3811,7 +3673,6 @@ test('allows the user to select an item by clicking with a focusable ancestor', const select = new Select({ target: ancestor, props: { - items, }, }); @@ -3828,7 +3689,6 @@ test('when listOpen true on page load then list should show onMount', async (t) const select = new Select({ target, props: { - items, listOpen: true, }, @@ -3845,7 +3705,6 @@ test('when listOpen true on page load then list should show onMount', async (t) const select = new Select({ target, props: { - items, listOpen: true, }, @@ -3863,7 +3722,6 @@ test('when suggestions and no filterText then list should show suggestions', asy const select = new Select({ target, props: { - loadOptions: () => { return Promise.resolve(['foo']) }, @@ -3882,7 +3740,6 @@ test('when suggestions items is selected, list should stay open and filterText s const select = new Select({ target, props: { - loadOptions: () => { return Promise.resolve(['foo']) }, @@ -3935,7 +3792,6 @@ test('when value is set check from item and show correct label', async (t) => { props: { items, listOpen: true, - } }); @@ -3965,7 +3821,6 @@ test('when component focuses fire on:focus event', async (t) => { const select = new Select({ target, props: { - items } }); @@ -4202,4 +4057,4 @@ test('when appendListTarget is supplied then list is appended to parent target', t.ok(document.querySelector('main .svelte-select-list')); select.$destroy(); -}) \ No newline at end of file +}); \ No newline at end of file From 8ef98ce9eded33a6f37e2bd6a8235adedbb22eb1 Mon Sep 17 00:00:00 2001 From: Rob Balfre Date: Mon, 25 Jul 2022 09:02:28 +1000 Subject: [PATCH 417/635] =?UTF-8?q?icons=20all=20now=20named=20slots=20and?= =?UTF-8?q?=20removed=20=E2=80=98is=E2=80=99=20from=20props?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 13 ++ MIGRATION_GUIDE.md | 17 +- README.md | 92 +++++----- src/lib/Item.svelte | 2 + src/lib/List.svelte | 5 + src/lib/LoadingIcon.svelte | 8 +- src/lib/Select.svelte | 234 +++++++++++-------------- src/lib/filter.js | 4 +- src/lib/get-items.js | 4 +- src/routes/index.svelte | 16 +- test/src/ChevronSlotTest.svelte | 17 ++ test/src/ClearIconSlotTest.svelte | 12 ++ test/src/PrependSlotTest.svelte | 12 ++ test/src/Select/Select--default.svelte | 1 - test/src/tests.js | 212 +++++++++++----------- test/utils/nameGen.js | 1 - 16 files changed, 351 insertions(+), 299 deletions(-) create mode 100644 test/src/ChevronSlotTest.svelte create mode 100644 test/src/ClearIconSlotTest.svelte create mode 100644 test/src/PrependSlotTest.svelte diff --git a/CHANGELOG.md b/CHANGELOG.md index ba0e24cb..56e5d046 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ ## 5.0.0 +* isGroupHeaderSelectable -> groupHeaderSelectable +* isSearchable -> searchable +* isFocused -> focused +* isCreatable -> creatable +* isClearable -> clearable +* isWaiting -> loading +* Added named slot `prepend` +* Added named slot `chevron-icon` +* Added named slot `clear-icon` +* Added named slot `loading-icon` +* Removed iconProps +* Removed ClearIcon component +* Removed ChevronIcon component * Removed Multi component * Added named slot `selection` * Removed Selection component diff --git a/MIGRATION_GUIDE.md b/MIGRATION_GUIDE.md index f5d38498..86b50c9b 100644 --- a/MIGRATION_GUIDE.md +++ b/MIGRATION_GUIDE.md @@ -2,13 +2,16 @@ v5 is a major release that that includes some ⚠️ BREAKING CHANGES ⚠️ -Removed `Selection` component, use named slot instead. + +Removed `Selection`, `ChevronIcon`, `ClearIcon`, `LoadingIcon`, `Icon` components, use named slots instead. ```html ``` @@ -74,6 +77,12 @@ The following CSS custom properties were removed in v5. `selectedValue` removed (was already deprecated in v4 in favour of `value`)
`loadOptionsInterval` → `debounceWait` `isMulti` → `multiple` +`isWaiting` → `loading` +`isClearable` → `clearable` +`isCreatable` → `creatable` +`isFocused` → `focused` +`isGroupHeaderSelectable` → `groupHeaderSelectable` +`isDisabled` → `disabled` ### Event change: diff --git a/README.md b/README.md index 06e73428..531f9505 100644 --- a/README.md +++ b/README.md @@ -31,62 +31,59 @@ See [migration guide](/MIGRATION_GUIDE.md) if upgrading from v4 to v5. ## Props -| Prop | Type | Default | Description | -| ----------------------- | ---------- | --------------- | ---------------------------------------------------------- | -| items | `any[]` | `[]` | Array of items available to display / filter | -| value | `any` | `null` | Selected value(s) | -| justValue | `any` | `null` | **READ-ONLY** Selected value(s) excluding container object | -| optionIdentifier | `string` | `value` | Override default identifier | -| labelIdentifier | `string` | `label` | Override default identifier | -| id | `string` | `null` | Add an id to the filter input field | -| filterText | `string` | `''` | Text to filter `items` by | -| placeholder | `string` | `Please select` | Placeholder text | -| noOptionsMessage | `string` | `No options` | Message displayed when no items | -| hideEmptyState | `boolean` | `false` | When no items hide list and `noOptionsMessage` | -| listOpen | `boolean` | `false` | Open/close list | -| class | `string` | `''` | container classes | -| containerStyles | `string` | `''` | Add inline styles to container | -| isClearable | `boolean` | `true` | Enable clearing of value(s) | -| isCreatable | `boolean` | `false` | Can create new item(s) to be added to `value` | -| isDisabled | `boolean` | `false` | Disable select | -| multiple | `boolean` | `false` | Enable multi-select | -| isSearchable | `boolean` | `true` | If `false` search/filtering is disabled | -| isGroupHeaderSelectable | `boolean` | `false` | Enable selectable group headers | -| isFocused | `boolean` | `false` | Controls input focus | -| listPlacement | `string` | `auto` | Display list `'auto'`, `'top'` or `'bottom'` | -| hasError | `boolean` | `false` | Show error styles around select input | -| listAutoWidth | `boolean` | `true` | If `false` will ignore width of select | -| showChevron | `boolean` | `false` | Show chevron at all times | -| inputAttributes | `object` | `{}` | Pass in HTML attributes to Select's input | -| iconProps | `object` | `{}` | Icon props | -| placeholderAlwaysShow | `boolean` | `false` | When `multiple` placeholder text will always show | -| isWaiting | `boolean` | `false` | Show LoadingIcon. `loadOptions` will override this | -| listOffset | `number` | `5` | `px` space between select and list | -| debounceWait | `number` | `300` | `milliseconds` debounce wait | -| suggestions | `string[]` | `null` | Show search suggestions before user input | -| appendListTarget | `Element` | `document.body` | Change where List gets appended | +| Prop | Type | Default | Description | +| --------------------- | ---------- | --------------- | ---------------------------------------------------------- | +| items | `any[]` | `[]` | Array of items available to display / filter | +| value | `any` | `null` | Selected value(s) | +| justValue | `any` | `null` | **READ-ONLY** Selected value(s) excluding container object | +| optionIdentifier | `string` | `value` | Override default identifier | +| labelIdentifier | `string` | `label` | Override default identifier | +| id | `string` | `null` | Add an id to the filter input field | +| filterText | `string` | `''` | Text to filter `items` by | +| placeholder | `string` | `Please select` | Placeholder text | +| noOptionsMessage | `string` | `No options` | Message displayed when no items | +| hideEmptyState | `boolean` | `false` | When no items hide list and `noOptionsMessage` | +| listOpen | `boolean` | `false` | Open/close list | +| class | `string` | `''` | container classes | +| containerStyles | `string` | `''` | Add inline styles to container | +| clearable | `boolean` | `true` | Enable clearing of value(s) | +| creatable | `boolean` | `false` | Can create new item(s) to be added to `value` | +| disabled | `boolean` | `false` | Disable select | +| multiple | `boolean` | `false` | Enable multi-select | +| searchable | `boolean` | `true` | If `false` search/filtering is disabled | +| groupHeaderSelectable | `boolean` | `false` | Enable selectable group headers | +| focused | `boolean` | `false` | Controls input focus | +| listPlacement | `string` | `auto` | Display list `'auto'`, `'top'` or `'bottom'` | +| hasError | `boolean` | `false` | Show error styles around select input | +| listAutoWidth | `boolean` | `true` | If `false` will ignore width of select | +| showChevron | `boolean` | `false` | Show chevron at all times | +| inputAttributes | `object` | `{}` | Pass in HTML attributes to Select's input | +| placeholderAlwaysShow | `boolean` | `false` | When `multiple` placeholder text will always show | +| loading | `boolean` | `false` | Shows `loading-icon`. `loadOptions` will override this | +| listOffset | `number` | `5` | `px` space between select and list | +| debounceWait | `number` | `300` | `milliseconds` debounce wait | +| suggestions | `string[]` | `null` | Show search suggestions before user input | +| appendListTarget | `Element` | `document.body` | Change where List gets appended | ## Named slots -### Selection - -```html +```svelte ``` + ### Replaceable components -| Import | Type | Description | -| ----------- | ----------- | --------------------- | -| Item | `component` | Item component | -| ChevronIcon | `component` | Chevron Icon | -| ClearIcon | `component` | Clear Icon | -| LoadingIcon | `component` | Spinning Loading Icon | +| Import | Type | Description | +| ------ | ----------- | -------------- | +| Item | `component` | Item component | ### Optional component imports @@ -94,7 +91,6 @@ See [migration guide](/MIGRATION_GUIDE.md) if upgrading from v4 to v5. | Import | Type | Description | | ----------- | ----------- | ------------------------------------------------------ | | VirtualList | `component` | Virtual list support (uses `svelte-tiny-virtual-list`) | -| Icon | `component` | Icon component | ## Events @@ -107,7 +103,7 @@ See [migration guide](/MIGRATION_GUIDE.md) if upgrading from v4 to v5. | blur | { detail } | fires when select > input on:blur | | clear | { detail } | fires when clear all is invoked or item is removed (by user) from multi select | | loaded | { options } | fires when `loadOptions` resolves | -| itemCreated | { options } | fires when `isCreatable` true and item is created | +| itemCreated | { options } | fires when `creatable` true and item is created | | error | { type, details } | fires when error is caught | diff --git a/src/lib/Item.svelte b/src/lib/Item.svelte index dda78924..4f903f24 100644 --- a/src/lib/Item.svelte +++ b/src/lib/Item.svelte @@ -28,6 +28,8 @@ text-overflow: ellipsis; overflow: hidden; white-space: nowrap; + box-sizing: border-box; + transition: all .2s; } .item.group-item { diff --git a/src/lib/List.svelte b/src/lib/List.svelte index 2f87dac1..971b680b 100644 --- a/src/lib/List.svelte +++ b/src/lib/List.svelte @@ -284,6 +284,11 @@ box-sizing: border-box; } + .list > * { + box-sizing: border-box; + transition: all .2s; + } + .list .list-group-title { color: var(--group-title-color, #8f8f8f); cursor: default; diff --git a/src/lib/LoadingIcon.svelte b/src/lib/LoadingIcon.svelte index 1acd210b..6bad9064 100644 --- a/src/lib/LoadingIcon.svelte +++ b/src/lib/LoadingIcon.svelte @@ -12,14 +12,12 @@ \ No newline at end of file diff --git a/src/lib/List.svelte b/src/lib/List.svelte deleted file mode 100644 index 971b680b..00000000 --- a/src/lib/List.svelte +++ /dev/null @@ -1,311 +0,0 @@ - - - - -
- {#if items.length > 0} - {#if VirtualList} - -
handleHover(index)} - on:focus={() => handleHover(index)} - on:click={(event) => handleClick({ item: items[index], i: index, event })} - class="list-item" - tabindex="-1"> - -
-
- {:else} - {#each items as item, i} - {#if item.isGroupHeader && !item.isSelectable} -
{@html getGroupHeaderLabel(item)}
- {:else} -
handleHover(i)} - on:focus={() => handleHover(i)} - on:click={(event) => handleClick({ item, i, event })} - class="list-item" - tabindex="-1"> - -
- {/if} - {/each} - {/if} - {:else if !hideEmptyState} -
{noOptionsMessage}
- {/if} -
- - diff --git a/src/lib/Select.svelte b/src/lib/Select.svelte index dd3033f1..6f6140fe 100644 --- a/src/lib/Select.svelte +++ b/src/lib/Select.svelte @@ -1,11 +1,8 @@ - +
- {#if showList} -
- {#if listApp} - + + {#if listStyle && listOpen} +
+ {#if filteredItems.length > 0} + {#each filteredItems as item, i} +
handleHover(i)} + on:focus={() => handleHover(i)} + on:click|stopPropagation={() => handleItemClick({ item, i })} + class="list-item" + tabindex="-1"> +
+ {@html getOptionLabel(item, filterText)} +
+
+ {/each} + {:else if !hideEmptyState} +
{noOptionsMessage}
{/if}
{/if} @@ -679,7 +791,7 @@ bind:value={filterText} placeholder={placeholderText} style={inputStyles} - disabled={disabled} /> + {disabled} /> {#if loading}