From 4dffb2f38a9be759afcf4dfe13414b73b0baade3 Mon Sep 17 00:00:00 2001 From: Alvaro Castro Date: Sat, 29 Jun 2024 22:32:11 -0300 Subject: [PATCH] test: add tests --- .../src/modifiers/draggable-item.js | 25 + .../src/utils/array.js | 15 +- packages/test-app/app/components/api/index.js | 6 - .../app/components/examples/board/index.hbs | 11 +- .../app/components/examples/board/index.js | 47 +- .../app/components/examples/handle/index.js | 19 +- .../components/examples/nested-lists/index.js | 42 +- .../components/examples/shared-lists/index.js | 18 +- .../examples/windows-desktop/index.hbs | 53 +- .../examples/windows-desktop/index.js | 71 ++- packages/test-app/app/components/header.hbs | 183 +------ .../app/components/introduction/index.hbs | 2 +- .../app/components/introduction/index.js | 18 +- .../test-app/app/components/theme-switcher.js | 15 +- .../test-app/app/components/ui/code/index.hbs | 2 +- .../test-app/app/components/ui/code/index.js | 17 +- .../test-app/app/components/ui/icon/index.js | 8 +- .../app/components/ui/section/index.js | 5 +- .../app/components/ui/subsection/index.js | 5 +- packages/test-app/app/styles/app.css | 477 +++++++++++++++++- .../test-app/app/templates/application.hbs | 62 +-- packages/test-app/package.json | 1 + packages/test-app/tests/integration/.gitkeep | 0 .../integration/modifiers/draggable-item.js | 45 -- .../tests/integration/sortable-list-test.js | 64 +++ packages/test-app/tests/unit/.gitkeep | 0 .../test-app/tests/unit/utils/array-test.js | 119 +++++ pnpm-lock.yaml | 158 +++--- 28 files changed, 951 insertions(+), 537 deletions(-) delete mode 100644 packages/test-app/app/components/api/index.js delete mode 100644 packages/test-app/tests/integration/.gitkeep delete mode 100644 packages/test-app/tests/integration/modifiers/draggable-item.js create mode 100644 packages/test-app/tests/integration/sortable-list-test.js delete mode 100644 packages/test-app/tests/unit/.gitkeep create mode 100644 packages/test-app/tests/unit/utils/array-test.js diff --git a/packages/ember-draggable-modifiers/src/modifiers/draggable-item.js b/packages/ember-draggable-modifiers/src/modifiers/draggable-item.js index 5e07c6a..7b5e693 100644 --- a/packages/ember-draggable-modifiers/src/modifiers/draggable-item.js +++ b/packages/ember-draggable-modifiers/src/modifiers/draggable-item.js @@ -2,6 +2,30 @@ import { modifier } from 'ember-modifier'; import { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'; import { CLASS, prepareDataForCallback } from './drop-target.js'; + + +import { setCustomNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview'; + + // onGenerateDragPreview: ({ nativeSetDragImage }) => { + // setCustomNativeDragPreview({ + // render({ container }) { + // // Create our preview element + // const preview = document.createElement('div'); + + // // Populate and style the preview element however you like + // preview.textContent = 'My Preview'; + // Object.assign(preview.style, { + // padding: '20px', + // backgroundColor: 'lightpink', + // }); + + // // put the "preview" element into the container element + // container.appendChild(preview); + // }, + // nativeSetDragImage, + // }); + // }, + /** * Modifier to make a DOM element draggable. * @@ -26,6 +50,7 @@ export default modifier( isDraggingClass = CLASS.DRAGGING, onDragStart = () => {}, onDragEnd = () => {}, + onGenerateDragPreview = () => {}, } = {}, ) { return draggable({ diff --git a/packages/ember-draggable-modifiers/src/utils/array.js b/packages/ember-draggable-modifiers/src/utils/array.js index 8cf986d..b134008 100644 --- a/packages/ember-draggable-modifiers/src/utils/array.js +++ b/packages/ember-draggable-modifiers/src/utils/array.js @@ -1,3 +1,5 @@ +import { assert } from '@ember/debug'; + /** * Insert an item to an array in the specified index. * @param {Array} arr @@ -6,6 +8,7 @@ * @returns {Array} [] */ export function insertAt(arr, index, item) { + // assert('index is out of bounds', index > 0 && index < arr.length); const clone = [...arr]; clone.splice(index, 0, item); return clone; @@ -31,7 +34,9 @@ export function removeAt(arr, index) { * @return {Array} [] */ export function insertBefore(arr, targetItem, item) { - return insertAt(arr, arr.indexOf(targetItem), item); + const index = arr.indexOf(targetItem); + assert('Item must exist', index >= 0); + return insertAt(arr, index, item); } /** @@ -42,7 +47,9 @@ export function insertBefore(arr, targetItem, item) { * @return {Array} [] */ export function insertAfter(arr, targetItem, item) { - return insertAt(arr, arr.indexOf(targetItem) + 1, item); + const index = arr.indexOf(targetItem); + assert('Item must exist', index >= 0); + return insertAt(arr, index + 1, item); } /** @@ -52,5 +59,7 @@ export function insertAfter(arr, targetItem, item) { * @return {Array} [] */ export function removeItem(arr, item) { - return removeAt(arr, arr.indexOf(item)); + const index = arr.indexOf(item); + assert('Item must exist', index >= 0); + return removeAt(arr, index); } diff --git a/packages/test-app/app/components/api/index.js b/packages/test-app/app/components/api/index.js deleted file mode 100644 index 7e2f7ff..0000000 --- a/packages/test-app/app/components/api/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import Component from '@glimmer/component'; -import { action } from '@ember/object'; -import { tracked } from '@glimmer/tracking'; - -export default class ApiComponent extends Component { -} diff --git a/packages/test-app/app/components/examples/board/index.hbs b/packages/test-app/app/components/examples/board/index.hbs index e95fc41..c746ac0 100644 --- a/packages/test-app/app/components/examples/board/index.hbs +++ b/packages/test-app/app/components/examples/board/index.hbs @@ -1,15 +1,8 @@ - -
{{#each this.columns as |column|}}
- + {{card.title}}
{{card.title}}

{{card.text}}

diff --git a/packages/test-app/app/components/examples/board/index.js b/packages/test-app/app/components/examples/board/index.js index 8747872..c779b77 100644 --- a/packages/test-app/app/components/examples/board/index.js +++ b/packages/test-app/app/components/examples/board/index.js @@ -1,18 +1,22 @@ import Component from '@glimmer/component'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; -import { insertBefore, insertAfter, removeItem } from 'ember-draggable-modifiers/utils/array'; +import { + insertBefore, + insertAfter, + removeItem, +} from 'ember-draggable-modifiers/utils/array'; class Column { @tracked cards = []; - constructor (name, cards = []) { + constructor(name, cards = []) { this.name = name; this.cards = cards; } } class Card { - constructor (title, text, seed) { + constructor(title, text, seed) { this.title = title; this.text = text; this.seed = seed; @@ -38,14 +42,9 @@ export default class ExamplesBoardComponent extends Component { ]), ]; - @action moveColumn ({ - source: { - data: draggedItem - }, - target: { - data: dropTarget, - edge - } + @action moveColumn({ + source: { data: draggedItem }, + target: { data: dropTarget, edge }, }) { this.columns = removeItem(this.columns, draggedItem); @@ -56,27 +55,29 @@ export default class ExamplesBoardComponent extends Component { } } - @action moveCard ({ + @action moveCard({ source: { - data: { - item: draggedItem, - parent: draggedItemParent, - } + data: { item: draggedItem, parent: draggedItemParent }, }, target: { - data: { - item: dropTarget, - parent: dropTargetParent, - }, - edge + data: { item: dropTarget, parent: dropTargetParent }, + edge, }, }) { draggedItemParent.cards = removeItem(draggedItemParent.cards, draggedItem); if (edge === 'top') { - dropTargetParent.cards = insertBefore(dropTargetParent.cards, dropTarget, draggedItem); + dropTargetParent.cards = insertBefore( + dropTargetParent.cards, + dropTarget, + draggedItem, + ); } else { - dropTargetParent.cards = insertAfter(dropTargetParent.cards, dropTarget, draggedItem); + dropTargetParent.cards = insertAfter( + dropTargetParent.cards, + dropTarget, + draggedItem, + ); } } } diff --git a/packages/test-app/app/components/examples/handle/index.js b/packages/test-app/app/components/examples/handle/index.js index bd5f74f..f33f48c 100644 --- a/packages/test-app/app/components/examples/handle/index.js +++ b/packages/test-app/app/components/examples/handle/index.js @@ -1,10 +1,14 @@ import Component from '@glimmer/component'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; -import { insertBefore, insertAfter, removeItem } from 'ember-draggable-modifiers/utils/array'; +import { + insertBefore, + insertAfter, + removeItem, +} from 'ember-draggable-modifiers/utils/array'; export default class ExamplesHandleComponent extends Component { - @tracked items = [ 'One', 'Two', 'Three', 'Four', 'Five' ]; + @tracked items = ['One', 'Two', 'Three', 'Four', 'Five']; hbsCode = `
    @@ -17,9 +21,9 @@ export default class ExamplesHandleComponent extends Component {
`; - get jsCode () { + get jsCode() { return ` - @tracked items = [ ${this.items.map(item => JSON.stringify(item)).join(', ')} ]; + @tracked items = [ ${this.items.map((item) => JSON.stringify(item)).join(', ')} ]; @action move ({ source: { data: draggedItem }, target: { data: dropTarget, edge } }) { this.items = removeItem(this.items, draggedItem); @@ -31,9 +35,12 @@ export default class ExamplesHandleComponent extends Component { } } `; - }; + } - @action move ({ source: { data: draggedItem }, target: { data: dropTarget, edge } }) { + @action move({ + source: { data: draggedItem }, + target: { data: dropTarget, edge }, + }) { this.items = removeItem(this.items, draggedItem); if (edge === 'top') { diff --git a/packages/test-app/app/components/examples/nested-lists/index.js b/packages/test-app/app/components/examples/nested-lists/index.js index 765d628..d3181ac 100644 --- a/packages/test-app/app/components/examples/nested-lists/index.js +++ b/packages/test-app/app/components/examples/nested-lists/index.js @@ -1,12 +1,16 @@ import Component from '@glimmer/component'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; -import { insertBefore, insertAfter, removeItem } from 'ember-draggable-modifiers/utils/array'; +import { + insertBefore, + insertAfter, + removeItem, +} from 'ember-draggable-modifiers/utils/array'; class Item { @tracked childs = []; - constructor (name, childs = []) { + constructor(name, childs = []) { this.name = name; this.childs = childs; } @@ -14,7 +18,7 @@ class Item { const dump = function (node, depth = 0, indent = ' ') { if (node.childs.length) { - return `new Item('${node.name}', [\n${indent.repeat(depth + 1)}${node.childs.map(child => dump(child, depth + 1, indent)).join(`,\n${indent.repeat(depth + 1)}`)}\n${indent.repeat(depth)}])`; + return `new Item('${node.name}', [\n${indent.repeat(depth + 1)}${node.childs.map((child) => dump(child, depth + 1, indent)).join(`,\n${indent.repeat(depth + 1)}`)}\n${indent.repeat(depth)}])`; } return `new Item('${node.name}')`; }; @@ -22,15 +26,10 @@ const dump = function (node, depth = 0, indent = ' ') { export default class ExamplesNestedListsComponent extends Component { @tracked root = new Item('root', [ new Item('One'), - new Item('Two', [ - new Item('Six'), - new Item('Seven', [ - new Item('Eight'), - ]), - ]), + new Item('Two', [new Item('Six'), new Item('Seven', [new Item('Eight')])]), new Item('Three'), new Item('Four'), - new Item('Five') + new Item('Five'), ]); hbsCode = ` @@ -61,7 +60,7 @@ export default class ExamplesNestedListsComponent extends Component { `; - get jsCode () { + get jsCode() { return ` class Item { @tracked childs = []; @@ -76,8 +75,8 @@ export default class ExamplesNestedListsComponent extends Component { @tracked root = ${dump(this.root, 4)}; @action move ({ source, target }) { - const { data: { item: draggedItem, parent: draggedItemParent }, group: fromList } = source; - const { data: { item: dropTarget, parent: dropTargetParent }, group: toList, edge, tree } = target; + const { data: { item: draggedItem, parent: draggedItemParent } } = source; + const { data: { item: dropTarget, parent: dropTargetParent }, edge, tree } = target; draggedItemParent.childs = removeItem(draggedItemParent.childs, draggedItem); @@ -92,11 +91,20 @@ export default class ExamplesNestedListsComponent extends Component { `; } - @action move ({ source, target }) { - const { data: { item: draggedItem, parent: draggedItemParent }, group: fromList } = source; - const { data: { item: dropTarget, parent: dropTargetParent }, group: toList, edge, tree } = target; + @action move({ source, target }) { + const { + data: { item: draggedItem, parent: draggedItemParent }, + } = source; + const { + data: { item: dropTarget, parent: dropTargetParent }, + edge, + tree, + } = target; - draggedItemParent.childs = removeItem(draggedItemParent.childs, draggedItem); + draggedItemParent.childs = removeItem( + draggedItemParent.childs, + draggedItem, + ); const parent = tree === 'make-child' ? dropTarget : dropTargetParent; if (edge === 'top') { diff --git a/packages/test-app/app/components/examples/shared-lists/index.js b/packages/test-app/app/components/examples/shared-lists/index.js index c4e90b5..bb3e704 100644 --- a/packages/test-app/app/components/examples/shared-lists/index.js +++ b/packages/test-app/app/components/examples/shared-lists/index.js @@ -1,11 +1,15 @@ import Component from '@glimmer/component'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; -import { insertBefore, insertAfter, removeItem } from 'ember-draggable-modifiers/utils/array'; +import { + insertBefore, + insertAfter, + removeItem, +} from 'ember-draggable-modifiers/utils/array'; export default class ExamplesSharedListsComponent extends Component { - @tracked itemsTop = [ 'One', 'Two', 'Three', 'Four', 'Five' ]; - @tracked itemsBottom = [ 'Six', 'Seven', 'Eight', 'Nine', 'Ten' ]; + @tracked itemsTop = ['One', 'Two', 'Three', 'Four', 'Five']; + @tracked itemsBottom = ['Six', 'Seven', 'Eight', 'Nine', 'Ten']; hbsCode = `
    @@ -38,10 +42,10 @@ export default class ExamplesSharedListsComponent extends Component {
`; - get jsCode () { + get jsCode() { return ` - @tracked itemsTop = [ ${this.itemsTop.map(item => JSON.stringify(item)).join(', ')} ]; - @tracked itemsBottom = [ ${this.itemsBottom.map(item => JSON.stringify(item)).join(', ')} ]; + @tracked itemsTop = [ ${this.itemsTop.map((item) => JSON.stringify(item)).join(', ')} ]; + @tracked itemsBottom = [ ${this.itemsBottom.map((item) => JSON.stringify(item)).join(', ')} ]; @action move ({ source, target }) { const { data: draggedItem, group: fromList } = source; @@ -58,7 +62,7 @@ export default class ExamplesSharedListsComponent extends Component { `; } - @action move ({ source, target }) { + @action move({ source, target }) { const { data: draggedItem, group: fromList } = source; const { data: dropTarget, group: toList, edge } = target; diff --git a/packages/test-app/app/components/examples/windows-desktop/index.hbs b/packages/test-app/app/components/examples/windows-desktop/index.hbs index 0200ecc..3f6ba9f 100644 --- a/packages/test-app/app/components/examples/windows-desktop/index.hbs +++ b/packages/test-app/app/components/examples/windows-desktop/index.hbs @@ -1,48 +1,3 @@ - -

This example showcases the separate uses of \{{draggable-item}} and \{{drop-target}}. @@ -56,20 +11,20 @@ {{#each this.icons as |icon|}}

- + {{icon.name}} {{icon.name}}
{{/each}}
- + {{this.trash.name}} {{this.trash.name}}
diff --git a/packages/test-app/app/components/examples/windows-desktop/index.js b/packages/test-app/app/components/examples/windows-desktop/index.js index f3a7b31..a914644 100644 --- a/packages/test-app/app/components/examples/windows-desktop/index.js +++ b/packages/test-app/app/components/examples/windows-desktop/index.js @@ -1,24 +1,23 @@ import Component from '@glimmer/component'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; -import { insertAt, removeFrom } from 'ember-draggable-modifiers/utils/array'; import { htmlSafe } from '@ember/template'; class Icon { @tracked x; @tracked y; - get position () { + get position() { return htmlSafe(`top: ${this.y}px; left: ${this.x}px`); } - constructor (x = 0, y = 0) { + constructor(x = 0, y = 0) { this.x = x; this.y = y; } } class GenericIcon extends Icon { - constructor (x, y, name, image) { + constructor(x, y, name, image) { super(...arguments); this.name = name; this.image = image; @@ -33,10 +32,10 @@ class TrashIcon extends Icon { name = 'Recycle Bin'; - get image () { - return this.isFull ? - 'https://win98icons.alexmeub.com/icons/png/recycle_bin_full-4.png' : - 'https://win98icons.alexmeub.com/icons/png/recycle_bin_empty-4.png'; + get image() { + return this.isFull + ? 'https://win98icons.alexmeub.com/icons/png/recycle_bin_full-4.png' + : 'https://win98icons.alexmeub.com/icons/png/recycle_bin_empty-4.png'; } } @@ -47,20 +46,52 @@ const GRID = { }; export default class ExamplesSharedListsComponent extends Component { @tracked icons = [ - new MyComputerIcon(GRID.MARGIN + GRID.WIDTH * 0, GRID.MARGIN + GRID.HEIGHT * 0), - new GenericIcon(GRID.MARGIN + GRID.WIDTH * 0, GRID.MARGIN + GRID.HEIGHT * 1, 'My Documents', 'https://win98icons.alexmeub.com/icons/png/directory_open_file_mydocs-4.png'), - new GenericIcon(GRID.MARGIN + GRID.WIDTH * 0, GRID.MARGIN + GRID.HEIGHT * 2, 'top secret', 'https://win98icons.alexmeub.com/icons/png/directory_closed-4.png'), - new GenericIcon(GRID.MARGIN + GRID.WIDTH * 0, GRID.MARGIN + GRID.HEIGHT * 3, 'fancy.html', 'https://win98icons.alexmeub.com/icons/png/html-5.png'), - new GenericIcon(GRID.MARGIN + GRID.WIDTH * 1, GRID.MARGIN + GRID.HEIGHT * 0, 'DELETE ME!.txt', 'https://win98icons.alexmeub.com/icons/png/notepad_file-2.png'), - new GenericIcon(GRID.MARGIN + GRID.WIDTH * 1, GRID.MARGIN + GRID.HEIGHT * 1, 'flower.bmp', 'https://win98icons.alexmeub.com/icons/png/paint_file-4.png'), + new MyComputerIcon( + GRID.MARGIN + GRID.WIDTH * 0, + GRID.MARGIN + GRID.HEIGHT * 0, + ), + new GenericIcon( + GRID.MARGIN + GRID.WIDTH * 0, + GRID.MARGIN + GRID.HEIGHT * 1, + 'My Documents', + 'https://win98icons.alexmeub.com/icons/png/directory_open_file_mydocs-4.png', + ), + new GenericIcon( + GRID.MARGIN + GRID.WIDTH * 0, + GRID.MARGIN + GRID.HEIGHT * 2, + 'top secret', + 'https://win98icons.alexmeub.com/icons/png/directory_closed-4.png', + ), + new GenericIcon( + GRID.MARGIN + GRID.WIDTH * 0, + GRID.MARGIN + GRID.HEIGHT * 3, + 'fancy.html', + 'https://win98icons.alexmeub.com/icons/png/html-5.png', + ), + new GenericIcon( + GRID.MARGIN + GRID.WIDTH * 1, + GRID.MARGIN + GRID.HEIGHT * 0, + 'DELETE ME!.txt', + 'https://win98icons.alexmeub.com/icons/png/notepad_file-2.png', + ), + new GenericIcon( + GRID.MARGIN + GRID.WIDTH * 1, + GRID.MARGIN + GRID.HEIGHT * 1, + 'flower.bmp', + 'https://win98icons.alexmeub.com/icons/png/paint_file-4.png', + ), ]; - trash = new TrashIcon(GRID.MARGIN + GRID.WIDTH * 5, GRID.MARGIN + GRID.HEIGHT * 3, 'Recycle Bin'); + trash = new TrashIcon( + GRID.MARGIN + GRID.WIDTH * 5, + GRID.MARGIN + GRID.HEIGHT * 3, + 'Recycle Bin', + ); - get isFatalErrorState () { - return !this.icons.find(icon => icon instanceof MyComputerIcon); + get isFatalErrorState() { + return !this.icons.find((icon) => icon instanceof MyComputerIcon); } - @action move (payload) { + @action move(payload) { const icon = payload.source.data; const { pageX: fromX, pageY: fromY } = payload.event.location.initial.input; const { pageX: toX, pageY: toY } = payload.event.location.current.input; @@ -69,11 +100,11 @@ export default class ExamplesSharedListsComponent extends Component { icon.y = icon.y + toY - fromY; } - @action delete ({ source: { data: icon }, target: { data: target } }) { + @action delete({ source: { data: icon }, target: { data: target } }) { if (!confirm(`Are you sure you want to delete "${icon.name}"?`)) { return; } - this.icons = this.icons.filter(i => i !== icon); + this.icons = this.icons.filter((i) => i !== icon); target.isFull = true; } } diff --git a/packages/test-app/app/components/header.hbs b/packages/test-app/app/components/header.hbs index 4191f5c..5b5a0e3 100644 --- a/packages/test-app/app/components/header.hbs +++ b/packages/test-app/app/components/header.hbs @@ -1,185 +1,4 @@ - - -
+

Ember draggable diff --git a/packages/test-app/app/components/introduction/index.hbs b/packages/test-app/app/components/introduction/index.hbs index c0115ea..bdc52ae 100644 --- a/packages/test-app/app/components/introduction/index.hbs +++ b/packages/test-app/app/components/introduction/index.hbs @@ -1,6 +1,6 @@

- Popular drag and drop libraries like Dragula and Sortable.js manipulate the DOM, which conflicts with Ember.js and Glimmer. This library is an implementation of the pragmatic drag and drop library from Atlassian which doesn't manipulate the DOM, allowing us to leverage that task to Ember.js. + Popular drag and drop libraries like Dragula and Sortable.js manipulate the DOM, which conflicts with Ember.js and Glimmer. This library is an implementation of the pragmatic drag and drop library from Atlassian which doesn't manipulate the DOM, allowing us to leverage that task to Ember.js.

diff --git a/packages/test-app/app/components/introduction/index.js b/packages/test-app/app/components/introduction/index.js index 47066dc..1f4bda5 100644 --- a/packages/test-app/app/components/introduction/index.js +++ b/packages/test-app/app/components/introduction/index.js @@ -1,10 +1,14 @@ import Component from '@glimmer/component'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; -import { insertBefore, insertAfter, removeItem } from 'ember-draggable-modifiers/utils/array'; +import { + insertBefore, + insertAfter, + removeItem, +} from 'ember-draggable-modifiers/utils/array'; export default class IntroductionComponent extends Component { - @tracked items = [ 'One', 'Two', 'Three', 'Four', 'Five' ]; + @tracked items = ['One', 'Two', 'Three', 'Four', 'Five']; hbsCode = `

    @@ -16,9 +20,9 @@ export default class IntroductionComponent extends Component {
`; - get jsCode () { + get jsCode() { return ` - @tracked items = [ ${this.items.map(item => JSON.stringify(item)).join(', ')} ]; + @tracked items = [ ${this.items.map((item) => JSON.stringify(item)).join(', ')} ]; @action move ({ source: { data: draggedItem }, target: { data: dropTarget, edge } }) { this.items = removeItem(this.items, draggedItem); @@ -32,7 +36,10 @@ export default class IntroductionComponent extends Component { `; } - @action move ({ source: { data: draggedItem }, target: { data: dropTarget, edge } }) { + @action move({ + source: { data: draggedItem }, + target: { data: dropTarget, edge }, + }) { this.items = removeItem(this.items, draggedItem); if (edge === 'top') { @@ -42,4 +49,3 @@ export default class IntroductionComponent extends Component { } } } - diff --git a/packages/test-app/app/components/theme-switcher.js b/packages/test-app/app/components/theme-switcher.js index eb87f9d..7d6741d 100644 --- a/packages/test-app/app/components/theme-switcher.js +++ b/packages/test-app/app/components/theme-switcher.js @@ -15,27 +15,28 @@ const THEME_ROTATION = { export default class ThemeSwitcherComponent extends Component { @tracked theme; - get icon () { - return ({ + get icon() { + return { [THEME.LIGHT]: 'bi-brightness-high-fill', [THEME.DARK]: 'bi-moon-stars-fill', - })[this.theme]; + }[this.theme]; } - constructor () { + constructor() { super(...arguments); this.theme = this.getCurrentTheme(); } - getCurrentTheme () { + getCurrentTheme() { return document.documentElement.dataset.bsTheme; } - @action toggle () { + @action toggle() { const theme = THEME_ROTATION[this.theme]; document.documentElement.dataset.bsTheme = theme; - document.getElementById('hljs-theme').href = `https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/stackoverflow-${theme}.min.css`; + document.getElementById('hljs-theme').href = + `https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/stackoverflow-${theme}.min.css`; this.theme = theme; } } diff --git a/packages/test-app/app/components/ui/code/index.hbs b/packages/test-app/app/components/ui/code/index.hbs index e99a171..15a04b7 100644 --- a/packages/test-app/app/components/ui/code/index.hbs +++ b/packages/test-app/app/components/ui/code/index.hbs @@ -1 +1 @@ -
{{this.languageName}}{{{this.highlightedCode}}}
\ No newline at end of file +
{{this.languageName}}{{this.highlightedCode}}
\ No newline at end of file diff --git a/packages/test-app/app/components/ui/code/index.js b/packages/test-app/app/components/ui/code/index.js index 7ee6695..0669081 100644 --- a/packages/test-app/app/components/ui/code/index.js +++ b/packages/test-app/app/components/ui/code/index.js @@ -1,7 +1,8 @@ import Component from '@glimmer/component'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; -import { stripIndent } from 'common-tags' +import { htmlSafe } from '@ember/template'; +import { stripIndent } from 'common-tags'; import he from 'he'; import hljs from 'highlight.js/lib/core'; import javascript from 'highlight.js/lib/languages/typescript'; @@ -17,24 +18,24 @@ export default class UiCodeComponent extends Component { @tracked lang; element; - get languageName () { - return ({ + get languageName() { + return { js: 'Javascript', hbs: 'Handlebars', bash: 'Terminal', - })[this.lang]; + }[this.lang]; } - @action init (element) { + @action onMount(element) { this.element = element; this.highlightCode(); } - @action update () { + @action update() { this.highlightCode(); } - highlightCode () { + highlightCode() { const code = this.args.code ?? he.decode(this.element.innerHTML); let result; if (this.args.lang) { @@ -43,6 +44,6 @@ export default class UiCodeComponent extends Component { result = hljs.highlightAuto(code); } this.lang = result.language; - this.highlightedCode = stripIndent(result.value); + this.highlightedCode = htmlSafe(stripIndent(result.value)); } } diff --git a/packages/test-app/app/components/ui/icon/index.js b/packages/test-app/app/components/ui/icon/index.js index f2d55cd..da6fc81 100644 --- a/packages/test-app/app/components/ui/icon/index.js +++ b/packages/test-app/app/components/ui/icon/index.js @@ -2,13 +2,15 @@ import Component from '@glimmer/component'; import { assert } from '@ember/debug'; export default class UiIconComponent extends Component { - get classStr () { + get classStr() { assert('Must pass an icon name', this.args.name); return [ `fa-${this.args.style ?? 'solid'}`, `fa-${this.args.name}`, - (this.args.fw ?? true) && 'fa-fw' - ].filter(Boolean).join(' '); + (this.args.fw ?? true) && 'fa-fw', + ] + .filter(Boolean) + .join(' '); } } diff --git a/packages/test-app/app/components/ui/section/index.js b/packages/test-app/app/components/ui/section/index.js index 4480708..2db66f2 100644 --- a/packages/test-app/app/components/ui/section/index.js +++ b/packages/test-app/app/components/ui/section/index.js @@ -1,11 +1,8 @@ import Component from '@glimmer/component'; -import { action } from '@ember/object'; -import { tracked } from '@glimmer/tracking'; import slugify from 'slugify'; export default class UiSectionComponent extends Component { - get anchorId () { + get anchorId() { return this.args.anchorId ?? slugify(this.args.title, { lower: true }); } } - diff --git a/packages/test-app/app/components/ui/subsection/index.js b/packages/test-app/app/components/ui/subsection/index.js index d1637d3..d73b5e7 100644 --- a/packages/test-app/app/components/ui/subsection/index.js +++ b/packages/test-app/app/components/ui/subsection/index.js @@ -1,11 +1,8 @@ import Component from '@glimmer/component'; -import { action } from '@ember/object'; -import { tracked } from '@glimmer/tracking'; import slugify from 'slugify'; export default class UiSubsectionComponent extends Component { - get anchorId () { + get anchorId() { return this.args.anchorId ?? slugify(this.args.title, { lower: true }); } } - diff --git a/packages/test-app/app/styles/app.css b/packages/test-app/app/styles/app.css index 2763afa..40129e1 100644 --- a/packages/test-app/app/styles/app.css +++ b/packages/test-app/app/styles/app.css @@ -1 +1,476 @@ -/* Ember supports plain CSS out of the box. More info: https://cli.emberjs.com/release/advanced-use/stylesheets/ */ +/* * * * * Drag Drop * * * * */ +.drop-target-item { + background: gray; +} + +.is-dragging { + opacity: 0.5; +} + +/* * / +[data-drop-edge]::before { + content: ""; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} +[data-drop-edge="top"]::before { + border-top: 3px solid red; bottom: auto; +} +[data-drop-edge="bottom"]::before { + border-top: 3px solid red; top: auto; +} +[data-drop-edge="left"]::before { + border-left: 3px solid red; right: auto; +} +[data-drop-edge="right"]::before { + border-left: 3px solid red; left: auto; +} +/ **/ +[data-drop-tree-intruction]::before { + content: ""; + position: absolute; + inset: 0; +} + +/* +[data-drop-tree-intruction="make-child"] { +} + +reorder-above +reorder-below +reparent +*/ + +/* * * * * Examples * * * * */ + +.board-column { + width: 260px; +} + +.desktop { + position: relative; + background: #008080; + height: 400px; + overflow: hidden; +} + +.desktop-icon { + position: absolute; + width: 96px; +} + +.desktop-icon img { + pointer-events: none; + margin: 0 auto 4px; + width: 48px; + height: 48px; + display: block; +} + +.desktop-icon span { + display: block; + font-size: 14px; + text-align: center; +} + +.bsod { + position: absolute; + width: 100%; + height: 100%; + background: blue; + font-family: monospace; +} + +.bsod .message { + max-width: 400px; +} + +.bsod .title { + text-align: center; +} + +.bsod .title span { + background: gray; + color: blue; + padding: 0 8px; +} + +/* * * * * Fancy backgrounds * * * * */ + +.fancy-background-1 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 200px; + --c1: var(--c); + --c2: hsl(from var(--c) h s calc(l + var(--v))); + --g: #0000 8%, var(--c1) 0 17%, #0000 0 58%; + + background: + linear-gradient(135deg, #0000 20.5%, var(--c1) 0 29.5%, #0000 0) 0 + calc(var(--s) / 4), + linear-gradient(45deg, var(--g)) calc(var(--s) / 2) 0, + linear-gradient(135deg, var(--g), var(--c1) 0 67%, #0000 0), + linear-gradient( + 45deg, + var(--g), + var(--c1) 0 67%, + #0000 0 83%, + var(--c1) 0 92%, + #0000 0 + ), + var(--c2); + background-size: var(--s) var(--s); +} + +.fancy-background-2 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 60px; + --c1: hsl(from var(--c) h s calc(l + var(--v))); + --c2: hsl(from var(--c) h s calc(l - var(--v))); + --c3: var(--c); + + background: + var(--s) var(--s) / calc(var(--s) * 2) calc(var(--s) * 2) + linear-gradient( + 135deg, + var(--c1) 10%, + var(--c2) 0 25%, + transparent 0 75%, + var(--c2) 0 90%, + var(--c1) 90% + ), + 0 0 / calc(var(--s) * 2) calc(var(--s) * 2) + linear-gradient( + 135deg, + var(--c1) 10%, + var(--c3) 0 25%, + transparent 0 75%, + var(--c3) 0 90%, + var(--c1) 90% + ), + 0 0 / calc(var(--s) * 2) calc(var(--s) * 2) + linear-gradient( + 45deg, + var(--c1) 10%, + var(--c2) 0 25%, + var(--c3) 0 40%, + var(--c1) 0 60%, + var(--c3) 0 75%, + var(--c2) 0 90%, + var(--c1) 90% + ); +} + +.fancy-background-3 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 50px; + --c1: hsl(from var(--c) h s calc(l + var(--v))); + --c2: var(--c); + + background: + radial-gradient( + circle at 100% 50%, + transparent 20%, + var(--c1) 21%, + var(--c1) 34%, + transparent 35%, + transparent + ), + radial-gradient( + circle at 0% 50%, + transparent 20%, + var(--c1) 21%, + var(--c1) 34%, + transparent 35%, + transparent + ) + 0 calc(var(--s) * -1); + background-color: var(--c2); + background-size: calc(var(--s) * 1.5) calc(var(--s) * 2); +} + +.fancy-background-4 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 150px; + --c1: var(--c); + --c2: hsl(from var(--c) h s calc(l + var(--v))); + --c3: hsl(from var(--c) h s calc(l + var(--v) * 2)); + --c4: hsl(from var(--c) h s calc(l + var(--v) * 3)); + --gp: 50% / var(--s) var(--s); + + background: + repeating-conic-gradient( + from 90deg at 75% 75%, + var(--c4) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 180deg at 50% 75%, + var(--c1) 0% 12.5%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 135deg at 62.5% 62.5%, + var(--c4) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 134.5deg at 25% 75%, + var(--c1) 0% 12.65%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 135deg at 12.5% 62.5%, + var(--c4) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 225deg at 12.5% 62.5%, + var(--c3) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 225deg at 25% 50%, + var(--c2) 0% 12.5%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 90deg at 75% 75%, + var(--c1) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 135deg at 50% 50%, + var(--c1) 0% 37.5%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 225deg at 75% 50%, + var(--c2) 0% 12.5%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 45deg at 62.5% 62.5%, + var(--c3) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 90deg at 75% 25%, + var(--c3) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 45deg at 62.5% 12.5%, + var(--c3) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from -45deg at 62.5% 12.5%, + var(--c4) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 45deg at 50% 25%, + var(--c2) 0% 12.5%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from -45deg at 12.5% 12.5%, + var(--c4) 0% 25%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from 0deg at 0% 25%, + var(--c3) 0% 12.5%, + #fff0 0% 100% + ) + var(--gp), + repeating-conic-gradient( + from -90deg at 25% 25%, + var(--c2) 0% 12.5%, + #fff0 0% 100% + ) + var(--gp), + repeating-linear-gradient( + 180deg, + var(--c1) 0 25%, + var(--c2) 0 50%, + var(--c1) 0 100% + ) + var(--gp); + background-color: var(--c1); +} + +.fancy-background-5 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 100px; /* diameter */ + --t: 4px; /* thickness */ + --o: 10px; /* offset */ + --c1: hsl(from var(--c) h s calc(l + var(--v))); + --c2: var(--c); + + background-color: var(--c2); + background-size: calc(var(--s) * 2 + var(--t) * 2) + calc(var(--s) * 2 + var(--t) * 2); + background-image: radial-gradient( + transparent var(--s), + var(--c1) var(--s), + var(--c1) calc(var(--s) + var(--t)), + transparent calc(var(--s) + var(--t)) + ), + radial-gradient( + transparent var(--s), + var(--c1) var(--s), + var(--c1) calc(var(--s) + var(--t)), + transparent calc(var(--s) + var(--t)) + ); + background-position: + var(--o) var(--o), + calc(var(--s) + var(--t) + var(--o)) calc(var(--s) + var(--t) + var(--o)); +} + +.fancy-background-6 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 200px; /* size */ + --c1: hsl(from var(--c) h s calc(l + var(--v))); + --c2: var(--c); + + background: linear-gradient(135deg, #0000 18.75%, var(--c2) 0 31.25%, #0000 0), + repeating-linear-gradient(45deg, var(--c2) -6.25% 6.25%, var(--c1) 0 18.75%); + background-size: var(--s) var(--s); +} + +.fancy-background-7 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 50px; /* size */ + --c1: hsl(from var(--c) h s calc(l + var(--v))); + --c2: var(--c); + + background: + linear-gradient(135deg, var(--c1) 25%, transparent 25%) + calc(var(--s) * -1.5) 0, + linear-gradient(225deg, var(--c1) 25%, transparent 25%) + calc(var(--s) * -1.5) 0, + linear-gradient(315deg, var(--c1) 25%, transparent 25%), + linear-gradient(45deg, var(--c1) 25%, transparent 25%); + background-size: var(--s) var(--s); + background-color: var(--c2); +} + +.fancy-background-8 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 90px; + --c1: hsl(from var(--c) h s calc(l + var(--v))); + --c2: hsl(from var(--c) h s calc(l - var(--v))); + --c3: var(--c); + --s1: calc(var(--s) * 0.5); + --s2: calc(var(--s) * 0.6); + + background: + radial-gradient( + circle, + var(--c1) calc(var(--s1) / 2), + #0000 calc(var(--s1) / 2), + #0000 var(--s1), + var(--c2) var(--s1), + var(--c2) var(--s2), + #0000 var(--s2) + ) + 0 0, + radial-gradient( + circle, + var(--c2) calc(var(--s1) / 2), + #0000 calc(var(--s1) / 2), + #0000 var(--s1), + var(--c1) var(--s1), + var(--c1) var(--s2), + #0000 var(--s2) + ) + var(--s) var(--s), + radial-gradient( + circle, + var(--c1) calc(var(--s1) / 4), + #0000 calc(var(--s1) / 4) + ) + var(--s) 0, + radial-gradient( + circle, + var(--c2) calc(var(--s1) / 5), + #0000 calc(var(--s1) / 5) + ) + 0 var(--s); + background-size: calc(var(--s) * 2) calc(var(--s) * 2); + background-color: var(--c3); + background-repeat: repeat; +} + +.fancy-background-9 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 110px; + --c1: hsl(from var(--c) h s calc(l + var(--v))); + --c2: var(--c); + + background: linear-gradient( + -45deg, + #0000 50%, + var(--c1) 50%, + var(--c1) 60%, + #0000 60% + ); + background-size: var(--s) var(--s); + background-color: var(--c2); +} + +.fancy-background-10 { + --c: var(--bs-tertiary-bg); + --v: 3; + --s: 100px; + --c1: hsl(from var(--c) h s calc(l + var(--v) * 6)); + --c2: hsl(from var(--c) h s calc(l + var(--v) * 2)); + --c3: var(--c); + --s1: var(--s); + --s2: calc(var(--s) / 5); + + background-color: var(--c3); + background-image: linear-gradient(var(--c1) 2px, transparent 2px), + linear-gradient(90deg, var(--c1) 2px, transparent 2px), + linear-gradient(var(--c2) 1px, transparent 1px), + linear-gradient(90deg, var(--c2) 1px, transparent 1px); + background-size: + var(--s1) var(--s1), + var(--s1) var(--s1), + var(--s2) var(--s2), + var(--s2) var(--s2); + background-position: + -10px -2px, + -2px -2px, + -1px -1px, + -1px -1px; +} diff --git a/packages/test-app/app/templates/application.hbs b/packages/test-app/app/templates/application.hbs index d41dea9..09e0115 100644 --- a/packages/test-app/app/templates/application.hbs +++ b/packages/test-app/app/templates/application.hbs @@ -1,64 +1,4 @@ -{{page-title "TestApp"}} - - - - +{{page-title "Ember Draggable Modifiers"}}
diff --git a/packages/test-app/package.json b/packages/test-app/package.json index 20975fa..662bbf7 100644 --- a/packages/test-app/package.json +++ b/packages/test-app/package.json @@ -81,6 +81,7 @@ "edition": "octane" }, "dependencies": { + "@atlaskit/pragmatic-drag-and-drop-unit-testing": "^1.0.0", "@ember/render-modifiers": "^2.1.0", "common-tags": "^1.8.2", "he": "^1.2.0", diff --git a/packages/test-app/tests/integration/.gitkeep b/packages/test-app/tests/integration/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/packages/test-app/tests/integration/modifiers/draggable-item.js b/packages/test-app/tests/integration/modifiers/draggable-item.js deleted file mode 100644 index e3aa0ca..0000000 --- a/packages/test-app/tests/integration/modifiers/draggable-item.js +++ /dev/null @@ -1,45 +0,0 @@ -/* -import { module, test } from 'qunit'; -import { setupRenderingTest } from 'ember-qunit'; -import { settled, find, findAll, render, triggerKeyEvent, waitUntil } from '@ember/test-helpers'; -import { set } from '@ember/object'; -import { reorder } from 'ember-sortable/test-support'; -import hbs from 'htmlbars-inline-precompile'; - -module('Integration | Modifier | sortable-group', function (hooks) { - setupRenderingTest(hooks); - - test('Works with items added after render', async function (assert) { - this.items = ['Uno', 'Dos', 'Tres']; - - this.update = (items) => { - set(this, 'items', items); - }; - - await render(hbs` -
    - {{#each this.items as |item|}} -
  1. {{item}}
  2. - {{/each}} -
- `); - - set(this, 'items', [...this.items, 'Quatro']); - - await settled(); - - let order = findAll('li'); - - await reorder('mouse', 'li', order[3], order[1], order[0], order[2]); - assert.equal(contents('#test-list'), 'Quatro Dos Uno Tres'); - - set(this, 'items', this.items.slice(1)); - - await settled(); - - await reorder('mouse', 'li', order[2], order[1], order[0]); - - assert.equal(contents('#test-list'), 'Tres Dos Uno'); - }); -}); -*/ diff --git a/packages/test-app/tests/integration/sortable-list-test.js b/packages/test-app/tests/integration/sortable-list-test.js new file mode 100644 index 0000000..ccce4b2 --- /dev/null +++ b/packages/test-app/tests/integration/sortable-list-test.js @@ -0,0 +1,64 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { find, render, triggerEvent, waitFor } from '@ember/test-helpers'; +import { set } from '@ember/object'; +import hbs from 'htmlbars-inline-precompile'; +// import { triggerDragEvent } from 'ember-draggable-modifiers/test-support'; + +// @todo move this code to the addon as a test-support -> ember-draggable-modifiers/test-support/index.js +class MockDataTransfer { + data; + constructor(data = {}) { + this.data = new Map(Object.entries(data)); + } + setDragImage() {} + setData(format, data) { + this.data.set(format, data); + } + getData(format) { + return this.data.get(format); + } +} +const triggerDragEvent = function (target, eventType, options = {}) { + const { top, left } = find(target).getBoundingClientRect(); + console.log('>>>', eventType, top, left); + return triggerEvent(target, eventType, { + ...options, + clientY: top, + clientX: left, + pageY: top, + pageX: left, + dataTransfer: new MockDataTransfer(options.dataTransfer), + }); +}; + +module('Integration | Sortable list', function (hooks) { + setupRenderingTest(hooks); + + test('Test drag', async function (assert) { + this.items = ['uno', 'dos', 'tres', 'cuatro', 'cinco']; + + this.update = (items) => { + console.log('>>> FART'); + set(this, 'items', items); + }; + + await render(hbs` +
    + {{#each this.items as |item|}} +
  1. {{item}}
  2. + {{/each}} +
+ `); + + assert.dom('#dos').doesNotHaveClass('is-dragging'); + + await triggerDragEvent('#dos', 'dragstart'); + + await waitFor('.is-dragging', { timeout: 500 }); + + assert.dom('#dos').hasClass('is-dragging'); + + await triggerDragEvent('#tres', 'dragend'); + }); +}); diff --git a/packages/test-app/tests/unit/.gitkeep b/packages/test-app/tests/unit/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/packages/test-app/tests/unit/utils/array-test.js b/packages/test-app/tests/unit/utils/array-test.js new file mode 100644 index 0000000..98aa1bb --- /dev/null +++ b/packages/test-app/tests/unit/utils/array-test.js @@ -0,0 +1,119 @@ +import { module, test } from 'qunit'; +import { + insertAt, + removeAt, + insertBefore, + insertAfter, + removeItem, +} from 'ember-draggable-modifiers/utils/array'; + +const baseArr = ['one', 'two', 'three', 'four', 'five']; + +module('Unit | Utils | array', function () { + test('insertAt: Inserts at middle index', function (assert) { + const arr = [...baseArr]; + const newArr = insertAt(arr, 2, 'NEW!'); + assert.deepEqual(newArr, ['one', 'two', 'NEW!', 'three', 'four', 'five']); + }); + test('insertAt: Inserts at start index', function (assert) { + const arr = [...baseArr]; + const newArr = insertAt(arr, 0, 'NEW!'); + assert.deepEqual(newArr, ['NEW!', 'one', 'two', 'three', 'four', 'five']); + }); + test('insertAt: Inserts at last index', function (assert) { + const arr = [...baseArr]; + const newArr = insertAt(arr, 5, 'NEW!'); + assert.deepEqual(newArr, ['one', 'two', 'three', 'four', 'five', 'NEW!']); + }); + test('insertAt: does not mutate the array', function (assert) { + const arr = [...baseArr]; + const newArr = insertAt(arr, 2, 'NEW!'); + assert.notDeepEqual(newArr, arr); + }); + + test('removeAt: Removes at middle index', function (assert) { + const arr = [...baseArr]; + const newArr = removeAt(arr, 2); + assert.deepEqual(newArr, ['one', 'two', 'four', 'five']); + }); + test('removeAt: Removes at start index', function (assert) { + const arr = [...baseArr]; + const newArr = removeAt(arr, 0); + assert.deepEqual(newArr, ['two', 'three', 'four', 'five']); + }); + test('removeAt: Removes at last index', function (assert) { + const arr = [...baseArr]; + const newArr = removeAt(arr, 4); + assert.deepEqual(newArr, ['one', 'two', 'three', 'four']); + }); + test('removeAt: does not mutate the array', function (assert) { + const arr = [...baseArr]; + const newArr = removeAt(arr, 2); + assert.notDeepEqual(newArr, arr); + }); + + test('insertBefore: inserts near the middle', function (assert) { + const arr = [...baseArr]; + const newArr = insertBefore(arr, 'three', 'NEW!'); + assert.deepEqual(newArr, ['one', 'two', 'NEW!', 'three', 'four', 'five']); + }); + test('insertBefore: inserts at the beginning', function (assert) { + const arr = [...baseArr]; + const newArr = insertBefore(arr, 'one', 'NEW!'); + assert.deepEqual(newArr, ['NEW!', 'one', 'two', 'three', 'four', 'five']); + }); + test('insertBefore: does not mutate the array', function (assert) { + const arr = [...baseArr]; + const newArr = insertBefore(arr, 'three', 'NEW!'); + assert.notDeepEqual(newArr, arr); + }); + test("insertBefore: throws an error if the reference item doesn't exists", function (assert) { + const arr = [...baseArr]; + assert.throws(() => insertBefore(arr, 'ten', 'NEW!')); + }); + + test('insertAfter: inserts near the middle', function (assert) { + const arr = [...baseArr]; + const newArr = insertAfter(arr, 'three', 'NEW!'); + assert.deepEqual(newArr, ['one', 'two', 'three', 'NEW!', 'four', 'five']); + }); + test('insertAfter: inserts at the end', function (assert) { + const arr = [...baseArr]; + const newArr = insertAfter(arr, 'five', 'NEW!'); + assert.deepEqual(newArr, ['one', 'two', 'three', 'four', 'five', 'NEW!']); + }); + test('insertAfter: does not mutate the array', function (assert) { + const arr = [...baseArr]; + const newArr = insertAfter(arr, 'three', 'NEW!'); + assert.notDeepEqual(newArr, arr); + }); + test("insertAfter: throws an error if the reference item doesn't exists", function (assert) { + const arr = [...baseArr]; + assert.throws(() => insertAfter(arr, 'ten', 'NEW!')); + }); + + test('removeItem: removes near the middle', function (assert) { + const arr = [...baseArr]; + const newArr = removeItem(arr, 'three'); + assert.deepEqual(newArr, ['one', 'two', 'four', 'five']); + }); + test('removeItem: removes at the start', function (assert) { + const arr = [...baseArr]; + const newArr = removeItem(arr, 'one'); + assert.deepEqual(newArr, ['two', 'three', 'four', 'five']); + }); + test('removeItem: removes at the end', function (assert) { + const arr = [...baseArr]; + const newArr = removeItem(arr, 'five'); + assert.deepEqual(newArr, ['one', 'two', 'three', 'four']); + }); + test('removeItem: does not mutate the array', function (assert) { + const arr = [...baseArr]; + const newArr = removeItem(arr, 'three'); + assert.notDeepEqual(newArr, arr); + }); + test("removeItem: throws an error if the reference item doesn't exists", function (assert) { + const arr = [...baseArr]; + assert.throws(() => removeItem(arr, 'ten')); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7e494c..2ccaf50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: version: 1.2.1(@babel/core@7.24.7) ember-modifier: specifier: ^4.1.0 - version: 4.1.0(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)) + version: 4.1.0(ember-source@5.8.0(@babel/core@7.24.7)) devDependencies: '@babel/core': specifier: ^7.23.6 @@ -102,6 +102,9 @@ importers: packages/test-app: dependencies: + '@atlaskit/pragmatic-drag-and-drop-unit-testing': + specifier: ^1.0.0 + version: 1.0.0 '@ember/render-modifiers': specifier: ^2.1.0 version: 2.1.0(@babel/core@7.24.7)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)) @@ -138,7 +141,7 @@ importers: version: 3.3.0(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1) '@embroider/test-setup': specifier: ^3.0.1 - version: 3.0.3(@embroider/core@3.4.13) + version: 3.0.3(@embroider/core@3.4.14) '@glimmer/component': specifier: ^1.1.2 version: 1.1.2(@babel/core@7.24.7) @@ -153,7 +156,7 @@ importers: version: 8.2.2 ember-auto-import: specifier: ^2.7.2 - version: 2.7.3(webpack@5.92.1) + version: 2.7.4(webpack@5.92.1) ember-cli: specifier: ~5.8.1 version: 5.8.1(handlebars@4.7.8)(underscore@1.13.6) @@ -195,7 +198,7 @@ importers: version: 2.1.2(@babel/core@7.24.7) ember-modifier: specifier: ^4.1.0 - version: 4.1.0(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)) + version: 4.1.0(ember-source@5.8.0(@babel/core@7.24.7)) ember-page-title: specifier: ^8.2.3 version: 8.2.3(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)) @@ -272,6 +275,9 @@ packages: '@atlaskit/pragmatic-drag-and-drop-hitbox@1.0.3': resolution: {integrity: sha512-/Sbu/HqN2VGLYBhnsG7SbRNg98XKkbF6L7XDdBi+izRybfaK1FeMfodPpm/xnBHPJzwYMdkE0qtLyv6afhgMUA==} + '@atlaskit/pragmatic-drag-and-drop-unit-testing@1.0.0': + resolution: {integrity: sha512-TsDWbauqLV4DQHTGd6dwdZILCy4W91OSfjmelWB7UzyNcjfjTQr/a9FSf0Gz3b7Jnmzdg+YNllEyxFLykBcnoA==} + '@atlaskit/pragmatic-drag-and-drop@1.1.12': resolution: {integrity: sha512-mg9fDg0T8XnxIbjnwUYL4U+zlpEJO24iS61FI071JFYaiX3A2J+zGMYzu3EyiWpamU8R7yeLoROtw1Fbs7MX6Q==} @@ -1113,12 +1119,12 @@ packages: resolution: {integrity: sha512-qyN64T1jMHZ99ihlk7VFHCWHYZHLE1DOdHi0J7lmn5waV1DoW7gD8JLi1i7FregzXtKhbDc7shyEmTmWPTs8MQ==} engines: {node: 12.* || 14.* || >= 16} - '@embroider/core@3.4.13': - resolution: {integrity: sha512-DQRVNJ3QwY6olZSOsaShNjSz74GReQzm6hMjydF5867v3conV61Pedgrn1thmvYrdLlOm20H+iqRDzllLiJZLg==} + '@embroider/core@3.4.14': + resolution: {integrity: sha512-WVVKup9j1LzciQDL3jfvADJIyLTPe3+cWKzZwqwSnDkYIx2Nsq5a/drKcjJZPJtwU1ddbMpDnUVgGtOurN1VcA==} engines: {node: 12.* || 14.* || >= 16} - '@embroider/macros@1.16.4': - resolution: {integrity: sha512-xGPke1N8uD+RM4RCM1brfPWawDs7aSP1JQ+4VsTp1g2goI7vNtdMRQmKWWUUTqeV/rqk21ENpvy3r2oyufGW1w==} + '@embroider/macros@1.16.5': + resolution: {integrity: sha512-Oz8bUZvZzOV1Gk3qSgIzZJJzs6acclSTcEFyB+KdKbKqjTC3uebn53aU2gAlLU7/YdTRZrg2gNbQuwAp+tGkGg==} engines: {node: 12.* || 14.* || >= 16} peerDependencies: '@glint/template': ^1.0.0 @@ -1126,8 +1132,8 @@ packages: '@glint/template': optional: true - '@embroider/shared-internals@2.6.1': - resolution: {integrity: sha512-STU1oDP36JQY+zpivyAfXGXadN664d+DOiVNBUW+4AAuWLVxIRWDIuFj8UxzREXZU9trZY8vOhKwKQtfEgdwSg==} + '@embroider/shared-internals@2.6.2': + resolution: {integrity: sha512-jL3Bjn8C73AUBlTex+VixP7YmqvPNN/BZFB85odTstzLFOuR8y2mmGiuWbq17qNuFyoxc6xtndMnAeqwCXBNkA==} engines: {node: 12.* || 14.* || >= 16} '@embroider/test-setup@3.0.3': @@ -1655,8 +1661,8 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.14.8': - resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==} + '@types/node@20.14.9': + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} '@types/node@9.6.61': resolution: {integrity: sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==} @@ -2436,8 +2442,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001636: - resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + caniuse-lite@1.0.30001637: + resolution: {integrity: sha512-1x0qRI1mD1o9e+7mBI7XtzFAP4XszbHaVWsMiGbSPLYekKTJF7K+FNk6AsXH4sUpc+qrsI3pVgf1Jdl/uGkuSQ==} capture-exit@2.0.0: resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} @@ -3190,11 +3196,11 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.4.811: - resolution: {integrity: sha512-CDyzcJ5XW78SHzsIOdn27z8J4ist8eaFLhdto2hSMSJQgsiwvbv2fbizcKUICryw1Wii1TI/FEkvzvJsR3awrA==} + electron-to-chromium@1.4.812: + resolution: {integrity: sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==} - ember-auto-import@2.7.3: - resolution: {integrity: sha512-EQzStGYxNvTPYWCFh0X57HFAzAvA2rHHRgBeWNDKHQ/rENNlHw0c0e0i1XebwEfv+yGHOodE4dN+f/mrYkQXLw==} + ember-auto-import@2.7.4: + resolution: {integrity: sha512-6CdXSegJJc8nwwK7+1lIcBUnMVrJRNd4ZdMgcKbCAwPvcGxMgRVBddSzrX/+q/UuflvTEO26Dk1g7Z6KHMXUhw==} engines: {node: 12.* || 14.* || >= 16} ember-cli-app-version@6.0.1: @@ -7484,6 +7490,10 @@ snapshots: '@atlaskit/pragmatic-drag-and-drop': 1.1.12 '@babel/runtime': 7.24.7 + '@atlaskit/pragmatic-drag-and-drop-unit-testing@1.0.0': + dependencies: + '@babel/runtime': 7.24.7 + '@atlaskit/pragmatic-drag-and-drop@1.1.12': dependencies: '@babel/runtime': 7.24.7 @@ -8386,7 +8396,7 @@ snapshots: '@ember-data/request-utils': 5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/store': 5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 ember-cli-path-utils: 1.0.0 @@ -8402,7 +8412,7 @@ snapshots: '@ember-data/request-utils': 5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/store': 5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 transitivePeerDependencies: @@ -8412,7 +8422,7 @@ snapshots: '@ember-data/graph@5.3.8(@ember-data/store@5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11))(@warp-drive/core-types@0.0.0-beta.11)': dependencies: '@ember-data/store': 5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11) - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 transitivePeerDependencies: @@ -8424,7 +8434,7 @@ snapshots: '@ember-data/graph': 5.3.8(@ember-data/store@5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11))(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/request-utils': 5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/store': 5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11) - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 transitivePeerDependencies: @@ -8437,7 +8447,7 @@ snapshots: '@ember-data/request-utils': 5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/store': 5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11) '@ember/test-waiters': 3.1.0 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 optionalDependencies: @@ -8454,7 +8464,7 @@ snapshots: '@ember-data/store': 5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/tracking': 5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 ember-cli-string-utils: 1.1.0 @@ -8469,7 +8479,7 @@ snapshots: '@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11)': dependencies: - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 optionalDependencies: @@ -8481,7 +8491,7 @@ snapshots: '@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11)': dependencies: '@ember/test-waiters': 3.1.0 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 transitivePeerDependencies: @@ -8496,7 +8506,7 @@ snapshots: '@ember-data/request-utils': 5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/store': 5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 ember-cli-path-utils: 1.0.0 @@ -8511,7 +8521,7 @@ snapshots: '@ember-data/request': 5.3.8(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/request-utils': 5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/tracking': 5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)) - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 transitivePeerDependencies: @@ -8520,7 +8530,7 @@ snapshots: '@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1))': dependencies: - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 ember-source: 5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1) @@ -8543,7 +8553,7 @@ snapshots: '@ember/render-modifiers@2.1.0(@babel/core@7.24.7)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1))': dependencies: - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 ember-cli-babel: 7.26.11 ember-modifier-manager-polyfill: 1.2.0(@babel/core@7.24.7) ember-source: 5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1) @@ -8560,12 +8570,12 @@ snapshots: '@ember/test-helpers@3.3.0(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1)': dependencies: '@ember/test-waiters': 3.1.0 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@simple-dom/interface': 1.4.0 broccoli-debug: 0.6.5 broccoli-funnel: 3.0.8 dom-element-descriptors: 0.5.0 - ember-auto-import: 2.7.3(webpack@5.92.1) + ember-auto-import: 2.7.4(webpack@5.92.1) ember-cli-babel: 7.26.11 ember-cli-htmlbars: 6.3.0 ember-source: 5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1) @@ -8585,7 +8595,7 @@ snapshots: '@embroider/addon-dev@4.3.1(rollup@4.18.0)': dependencies: - '@embroider/core': 3.4.13 + '@embroider/core': 3.4.14 '@rollup/pluginutils': 4.2.1 content-tag: 2.0.1 fs-extra: 10.1.0 @@ -8604,20 +8614,20 @@ snapshots: '@embroider/addon-shim@1.8.9': dependencies: - '@embroider/shared-internals': 2.6.1 + '@embroider/shared-internals': 2.6.2 broccoli-funnel: 3.0.8 common-ancestor-path: 1.0.1 semver: 7.6.2 transitivePeerDependencies: - supports-color - '@embroider/core@3.4.13': + '@embroider/core@3.4.14': dependencies: '@babel/core': 7.24.7 '@babel/parser': 7.24.7 '@babel/traverse': 7.24.7 - '@embroider/macros': 1.16.4 - '@embroider/shared-internals': 2.6.1 + '@embroider/macros': 1.16.5 + '@embroider/shared-internals': 2.6.2 assert-never: 1.2.1 babel-plugin-ember-template-compilation: 2.2.5 broccoli-node-api: 1.7.0 @@ -8644,9 +8654,9 @@ snapshots: - supports-color - utf-8-validate - '@embroider/macros@1.16.4': + '@embroider/macros@1.16.5': dependencies: - '@embroider/shared-internals': 2.6.1 + '@embroider/shared-internals': 2.6.2 assert-never: 1.2.1 babel-import-util: 2.1.1 ember-cli-babel: 7.26.11 @@ -8657,7 +8667,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/shared-internals@2.6.1': + '@embroider/shared-internals@2.6.2': dependencies: babel-import-util: 2.1.1 debug: 4.3.5 @@ -8672,12 +8682,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/test-setup@3.0.3(@embroider/core@3.4.13)': + '@embroider/test-setup@3.0.3(@embroider/core@3.4.14)': dependencies: lodash: 4.17.21 resolve: 1.22.8 optionalDependencies: - '@embroider/core': 3.4.13 + '@embroider/core': 3.4.14 '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: @@ -9206,7 +9216,7 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/chai-as-promised@7.1.8': dependencies: @@ -9216,13 +9226,13 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/cookie@0.4.1': {} '@types/cors@2.8.17': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/debug@4.1.12': dependencies: @@ -9242,7 +9252,7 @@ snapshots: '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -9256,21 +9266,21 @@ snapshots: '@types/fs-extra@5.1.0': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/fs-extra@8.1.5': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/glob@7.2.0': dependencies: - '@types/minimatch': 3.0.5 - '@types/node': 20.14.8 + '@types/minimatch': 5.1.2 + '@types/node': 20.14.9 '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/http-cache-semantics@4.0.4': {} @@ -9282,7 +9292,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/mdast@3.0.15': dependencies: @@ -9298,7 +9308,7 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@20.14.8': + '@types/node@20.14.9': dependencies: undici-types: 5.26.5 @@ -9312,22 +9322,22 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/rimraf@2.0.5': dependencies: '@types/glob': 8.1.0 - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/send': 0.17.4 '@types/symlink-or-copy@1.2.2': {} @@ -9339,7 +9349,7 @@ snapshots: '@warp-drive/build-config@0.0.0-beta.6': dependencies: '@embroider/addon-shim': 1.8.9 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 babel-import-util: 2.1.1 broccoli-funnel: 3.0.8 semver: 7.6.2 @@ -9349,7 +9359,7 @@ snapshots: '@warp-drive/core-types@0.0.0-beta.11': dependencies: - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 transitivePeerDependencies: - '@glint/template' @@ -10354,8 +10364,8 @@ snapshots: browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001636 - electron-to-chromium: 1.4.811 + caniuse-lite: 1.0.30001637 + electron-to-chromium: 1.4.812 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) @@ -10475,11 +10485,11 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.23.1 - caniuse-lite: 1.0.30001636 + caniuse-lite: 1.0.30001637 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001636: {} + caniuse-lite@1.0.30001637: {} capture-exit@2.0.0: dependencies: @@ -10872,7 +10882,7 @@ snapshots: debug@3.2.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 debug@4.3.5: dependencies: @@ -11039,9 +11049,9 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.4.811: {} + electron-to-chromium@1.4.812: {} - ember-auto-import@2.7.3(webpack@5.92.1): + ember-auto-import@2.7.4(webpack@5.92.1): dependencies: '@babel/core': 7.24.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.7) @@ -11049,8 +11059,8 @@ snapshots: '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.24.7) '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.7) '@babel/preset-env': 7.24.7(@babel/core@7.24.7) - '@embroider/macros': 1.16.4 - '@embroider/shared-internals': 2.6.1 + '@embroider/macros': 1.16.5 + '@embroider/shared-internals': 2.6.2 babel-loader: 8.3.0(@babel/core@7.24.7)(webpack@5.92.1) babel-plugin-ember-modules-api-polyfill: 3.5.0 babel-plugin-ember-template-compilation: 2.2.5 @@ -11520,7 +11530,7 @@ snapshots: '@ember-data/store': 5.3.8(@ember-data/request-utils@5.3.8(@ember/string@3.1.1)(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/request@5.3.8(@warp-drive/core-types@0.0.0-beta.11))(@ember-data/tracking@5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)))(@warp-drive/core-types@0.0.0-beta.11) '@ember-data/tracking': 5.3.8(@warp-drive/core-types@0.0.0-beta.11)(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)) '@ember/edition-utils': 1.2.0 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 '@warp-drive/build-config': 0.0.0-beta.6 '@warp-drive/core-types': 0.0.0-beta.11 optionalDependencies: @@ -11571,7 +11581,7 @@ snapshots: - '@babel/core' - supports-color - ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1)): + ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.7)): dependencies: '@embroider/addon-shim': 1.8.9 ember-cli-normalize-entity-name: 1.0.0 @@ -11593,7 +11603,7 @@ snapshots: dependencies: '@ember/test-helpers': 3.3.0(ember-source@5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1) '@embroider/addon-shim': 1.8.9 - '@embroider/macros': 1.16.4 + '@embroider/macros': 1.16.5 ember-cli-test-loader: 3.1.0 ember-source: 5.8.0(@babel/core@7.24.7)(@glimmer/component@1.1.2(@babel/core@7.24.7))(rsvp@4.8.5)(webpack@5.92.1) qunit: 2.21.0 @@ -11659,7 +11669,7 @@ snapshots: broccoli-funnel: 3.0.8 broccoli-merge-trees: 4.2.0 chalk: 4.1.2 - ember-auto-import: 2.7.3(webpack@5.92.1) + ember-auto-import: 2.7.4(webpack@5.92.1) ember-cli-babel: 7.26.11 ember-cli-get-component-path-option: 1.0.0 ember-cli-is-package-missing: 1.0.0 @@ -11794,7 +11804,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 20.14.8 + '@types/node': 20.14.9 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -13478,7 +13488,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 merge-stream: 2.0.0 supports-color: 8.1.1