diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 28954c0..42a117e 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -29,7 +29,7 @@ jobs: publish-npm: needs: build runs-on: ubuntu-latest - if: false # success() && github.ref == 'refs/heads/master' + if: success() && github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v3 - name: Use Node.js 18.x diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..08e0f3f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +arrows.d.ts +node_modules/ +*.tgz \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..f481df3 --- /dev/null +++ b/.npmignore @@ -0,0 +1,5 @@ +node_modules +.gitignore +.vscode +*.tgz +.github \ No newline at end of file diff --git a/README.md b/README.md index b196da8..01411c2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Timeline-arrow +# Timeline-arrows Following the issue of vis https://github.com/almende/vis/issues/1699, and thanks to the comments of @frboyer and @JimmyCheng, I have created a class to easily draw lines to connect items in the vis Timeline module. @@ -9,57 +9,56 @@ Following the issue of vis https://github.com/almende/vis/issues/1699, and thank 1 - Download the package -``` +```bash npm install timeline-arrows ``` -2 - Import the class `Arrow` from `arrow.js` in your project +2 - Import the class `Arrows` from `arrows.js` in your project 3 - Create your timeline as usual (see [vis-timeline docs](https://visjs.github.io/vis-timeline/docs/timeline/)). For instance: -``` -const my_timeline = new vis.Timeline(container, items, groups, options); +```bash +const myTimeline = new vis.Timeline(container, items, groups, options); ``` 4 - Create your arrows as an array of objects. These objets must have, at least, the following properties: * id -* id_item_1 (id of one timeline's items) -* id_item_2 (id of the other timeline's items that you want to connect with) +* item1Id (id of one timeline's items) +* item2Id (id of the other timeline's items that you want to connect with) And optionally: * title (insert a text and it will show a title if you hover the mouse in the arrow) For instance: -``` -var arrows_array = [ - { id: 2, id_item_1: 1, id_item_2: 2 }, - { id: 5, id_item_1: 3, id_item_2: 5, title:'Hello!!!' }, - { id: 7, id_item_1: 6, id_item_2: 7 }, - { id: 10, id_item_1: 3, id_item_2: 8, title:'I am a title!!!' } +```javascript +var arrowsSpecs = [ + { id: 2, item1Id: 1, item2Id: 2 }, + { id: 5, item1Id: 3, item2Id: 5, title:'Hello!!!' }, + { id: 7, item1Id: 6, item2Id: 7 }, + { id: 10, item1Id: 3, item2Id: 8, title:'I am a title!!!' } ]; ``` -5 - Create your Arrow instance for your timeline and your arrows. +5 - Create your Arrows instance for your timeline and your arrows. For instance: -``` -const my_Arrow = new Arrow(my_timeline, arrows_array); +```javascript +const myArrows = new Arrows(myTimeline, arrowsSpecs); ``` That's it :) - ## Options Options can be used to customize the arrows. Options are defined as a JSON object. All options are optional. -``` +```javascript const options = { followRelationships: true, color: "#039E00", @@ -68,7 +67,7 @@ const options = { }, }; -const my_Arrow = new Arrow(my_timeline, arrows_array, options); +const myArrows = new Arrows(myTimeline, arrowsSpecs, options); ``` **followRelationships** - defaults to false. @@ -77,10 +76,12 @@ If true, arrows can point backwards and will follow the relationships set in the **color** - defaults to "#9c0000". Sets the arrows color. +**strokeWidth** - defaults to 3 (px). +Sets the arrows width in pixels. + **tooltipConfig** - if arrows have a `title` property, the default behavior will add a title attribute that shows on hover. However, you might not want to use the title attribute, but instead your own tooltip configuration. This method takes two arguments, `el` - the arrow - and `title` - the content of the `title` property set in the arrow data. - ## Methods I have created the following methods: @@ -88,29 +89,33 @@ I have created the following methods: **getArrow ( *arrow id* )** Returns the arrow whith this arrow_id. For instance: -``` -my_Arrow.getArrow (2); + +```javascript +myArrows.getArrow(2); ``` **addArrow ( *arrow object* )** Inserts a new arrow. For instance: -``` -my_Arrow.addArrow ( { id: 13, id_item_1: 15, id_item_2: 16 } ); + +```javascript +myArrows.addArrow({ id: 13, item1Id: 15, item2Id: 16 }); ``` -**removeArrow ( *arrow_Id* )** Removes the arrows with this arrow_Id. +**removeArrow ( *arrow_Id* )** Removes the arrows with this arrow_Id. For instance: -``` -my_Arrow.removeArrow ( 10 ); + +```javascript +myArrows.removeArrow( 10 ); ``` -**removeArrowbyItemId ( *item_Id* )** Removes the arrows connected with Items with this item_Id. Returns an array with the id's of the removed arrows. +**removeItemArrows ( *item_Id* )** Removes the arrows connected with Items with this item_Id. Returns an array with the id's of the removed arrows. For instance: -``` -my_Arrow.removeArrowbyItemId ( 23 ); + +```javascript +myArrows.removeItemArrows( 23 ); ``` ## Examples @@ -118,3 +123,23 @@ my_Arrow.removeArrowbyItemId ( 23 ); You can see some working examples here: https://javdome.github.io/timeline-arrows/index.html + +... or by running following command: + +```shell +npm run serve +``` + +## Changes + +### Changes in 5.0.0 (breaking changes from 4.1.0) + +Class `Arrow` was renamed to `Arrows`, becuase that is what it represents. +It is also no longer the default export, so this is easier to consume in more modern JavaScript. + +The arrow spec fields were renamed from the snake_case notation `id_item_1` and `id_item_2` +to the JavaScript standard `item1Id` and `item2Id`. + +File `arrows.js` was renamed to `arrows.js`, which makes more sense in the import statement. + +`arrows.d.ts` is generated from JSDoc using Typescript transpiler. diff --git a/arrow.js b/arrows.js similarity index 56% rename from arrow.js rename to arrows.js index 5303c2b..c00c268 100644 --- a/arrow.js +++ b/arrows.js @@ -1,4 +1,13 @@ /** + * vis-timeline-arrows package is a fork of the timeline-arrows. + * The pull request is being ignored, hence this package was made to keep the good idea going. + * I was originally proposing fairly cosmetic changes in the pull request, + * but since I decided to fork, let's turn this into a more JavaScript looking and feeling code. + * I would be more than happy to get this code merged into the original repo + * and subsequently deprecating this npm package again. + * + * Original package description: + * * timeline-arrows * https://github.com/javdome/timeline-arrows * @@ -24,21 +33,79 @@ * timeline-arrows may be distributed under either license. */ -export default class Arrow { +// @ts-check +/** + * @typedef {(number | string)} VisIdType Timeline view item id. Equivalent to vis.IdType. + */ + +/** + * @typedef {(number | string)} ArrowIdType arrow id. + */ + +/** + * @typedef ArrowSpec Arrow specification + * @property {ArrowIdType} id arrow id + * @property {VisIdType} item1Id start timeline item id + * @property {VisIdType} item2Id end timeline item id + * @property {string} [title] optional arrow title + */ + +/** + * @typedef ArrowOptions Arrow configuration options + * @property {boolean} [followRelationships] if true, arrows can point backwards and will follow the relationships set in the data + * @property {(el: SVGPathElement, title: string) => string } [tooltipConfig] if arrows have a `title` property, the default behavior will add a title attribute that shows on hover. However, you might not want to use the title attribute, but instead your own tooltip configuration. + This method takes two arguments, `el` - the arrow - and `title` - the content of the `title` property set in the arrow data. + * @property {string} [color] arrow color + * @property {number} [strokeWidth] arrow thickness in pixels + */ + + +/** + * @typedef VisItem timeline item + * @property {VisIdType} group + */ + +/** + * @typedef Timeline Timeline object from vis-timeline + * @property {{center: Element, container: {id: string}}} dom dom + * @property {(event: "changed", callback: () => void) => void} on event handler + * @property {{get: (id: VisIdType) => VisItem}} itemsData all items + * @property {{get: (id: VisIdType) => any}} groupsData all groups + * @property {{items: any}} itemSet item set + * @property {() => [VisIdType]} getVisibleItems gets visible items + * @property {()=>void} redraw triggers re-draw + */ + +/** Arrow set for a vis.js Timeline. */ +export class Arrows { + + /** + * Creates arrows. + * @param {Timeline} timeline timeline object + * @param {ArrowSpec[]} dependencies arrows + * @param {ArrowOptions} [options] options + */ constructor(timeline, dependencies, options) { this._svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); this._timeline = timeline; + /** @private @type {boolean | undefined} if true, arrows can point backwards and will follow the relationships set in the data */ this._followRelationships = options?.followRelationships; + /** @private @type {((el: SVGPathElement, title: string) => string) | undefined } */ this._tooltipConfig = options?.tooltipConfig; + /** @private @type {string} color */ this._arrowsColor = options?.color ? options.color : "#9c0000" + /** @private @type {number} arrow thickness in pixels */ + this._arrowsStrokeWidth = options?.strokeWidth ?? 3; + /** @private @type {SVGMarkerElement} */ this._arrowHead = document.createElementNS( "http://www.w3.org/2000/svg", "marker" ); + /** @private @type {SVGPathElement} */ this._arrowHeadPath = document.createElementNS( "http://www.w3.org/2000/svg", "path" @@ -46,6 +113,7 @@ export default class Arrow { this._dependency = dependencies; + /** @private @type {SVGPathElement[]} */ this._dependencyPath = []; this._initialize(); @@ -77,7 +145,7 @@ export default class Arrow { this._arrowHead.appendChild(this._arrowHeadPath); this._svg.appendChild(this._arrowHead); //Create paths for the started dependency array - for (let i = 0; i < this._dependency.length; i++) { + for (const _element of this._dependency) { this._createPath(); } @@ -88,6 +156,7 @@ export default class Arrow { } + /** @private */ _createPath(){ //Add a new path to array dependencyPath and to svg let somePath = document.createElementNS( @@ -96,7 +165,7 @@ export default class Arrow { ); somePath.setAttribute("d", "M 0 0"); somePath.style.stroke = this._arrowsColor; - somePath.style.strokeWidth = "3px"; + somePath.style.strokeWidth = this._arrowsStrokeWidth + "px"; somePath.style.fill = "none"; somePath.style.pointerEvents = "auto"; this._dependencyPath.push(somePath); @@ -104,7 +173,7 @@ export default class Arrow { } - + /** @private */ _drawDependencies() { //Create paths for the started dependency array for (let i = 0; i < this._dependency.length; i++) { @@ -112,32 +181,33 @@ export default class Arrow { } } + /** + * @private + * @param {ArrowSpec} dep arrow specification + * @param {number} index arrow index + */ _drawArrows(dep, index) { //Checks if both items exist - //if( (typeof this._timeline.itemsData._data[dep.id_item_1] !== "undefined") && (typeof this._timeline.itemsData._data[dep.id_item_2] !== "undefined") ) { + //if( (typeof this._timeline.itemsData._data[dep.item1Id] !== "undefined") && (typeof this._timeline.itemsData._data[dep.item2Id] !== "undefined") ) { //debugger; - if( (this._timeline.itemsData.get(dep.id_item_1) !== null) && (this._timeline.itemsData.get(dep.id_item_2) !== null) ) { - var bothItemsExist = true; - } else { - var bothItemsExist = false; - } + const bothItemsExist = (this._timeline.itemsData.get(dep.item1Id) !== null) && (this._timeline.itemsData.get(dep.item2Id) !== null); //Checks if at least one item is visible in screen - var oneItemVisible = false; //Iniciamos a false + let oneItemVisible = false; //Iniciamos a false if (bothItemsExist) { - var visibleItems = this._timeline.getVisibleItems(); - for (let k = 0; k < visibleItems.length ; k++) { - if (dep.id_item_1 == visibleItems[k]) oneItemVisible = true; - if (dep.id_item_2 == visibleItems[k]) oneItemVisible = true; + const visibleItems = this._timeline.getVisibleItems(); + for (const item of visibleItems) { + if (dep.item1Id == item) oneItemVisible = true; + if (dep.item2Id == item) oneItemVisible = true; } //Checks if the groups of items are both visible var groupOf_1_isVisible = false; //Iniciamos a false var groupOf_2_isVisible = false; //Iniciamos a false - let groupOf_1 = this._timeline.itemsData.get(dep.id_item_1).group; //let groupOf_1 = items.get(dep.id_item_1).group; + let groupOf_1 = this._timeline.itemsData.get(dep.item1Id).group; //let groupOf_1 = items.get(dep.item1Id).group; - let groupOf_2 = this._timeline.itemsData.get(dep.id_item_2).group; //let groupOf_2 = items.get(dep.id_item_2).group; + let groupOf_2 = this._timeline.itemsData.get(dep.item2Id).group; //let groupOf_2 = items.get(dep.item2Id).group; if ( this._timeline.groupsData.get(groupOf_1) ) groupOf_1_isVisible = true; @@ -154,14 +224,14 @@ export default class Arrow { } if ( (groupOf_1_isVisible && groupOf_2_isVisible) && (oneItemVisible) && (bothItemsExist)) { - var item_1 = this._getItemPos(this._timeline.itemSet.items[dep.id_item_1]); - var item_2 = this._getItemPos(this._timeline.itemSet.items[dep.id_item_2]); + let item_1 = this._getItemPos(this._timeline.itemSet.items[dep.item1Id]); + let item_2 = this._getItemPos(this._timeline.itemSet.items[dep.item2Id]); if (!this._followRelationships && item_2.mid_x < item_1.mid_x) { [item_1, item_2] = [item_2, item_1]; // As demo, we put an arrow between item 0 and item1, from the one that is more on left to the one more on right. } - var curveLen = item_1.height * 2; // Length of straight Bezier segment out of the item. + const curveLen = item_1.height * 2; // Length of straight Bezier segment out of the item. if (this._followRelationships && item_2.mid_x < item_1.mid_x) { item_2.right += 10; // Space for the arrowhead. @@ -214,7 +284,7 @@ export default class Arrow { // Adding the title if property title has been added in the dependency if (dep.hasOwnProperty("title")) { this._tooltipConfig - ? this._tooltipConfig(this._dependencyPath[index], dep.title) + ? this._tooltipConfig(this._dependencyPath[index], dep.title ?? '') : this._dependencyPath[index].innerHTML = "" + dep.title + ""; } } else { @@ -224,7 +294,7 @@ export default class Arrow { } - //Función que recibe in Item y devuelve la posición en pantalla del item. + /** @private Función que recibe in Item y devuelve la posición en pantalla del item. */ _getItemPos (item) { let left_x = item.left; let top_y = item.parent.top + item.parent.height - item.top - item.height; @@ -241,41 +311,58 @@ export default class Arrow { } - addArrow (dep) { + /** + * Adds arrow between two timeline items. + * @param {ArrowSpec} dep item dependency + */ + addArrow(dep) { this._dependency.push(dep); this._createPath(); this._timeline.redraw(); } - getArrow (id) { - for (let i = 0; i < this._dependency.length; i++) { - if (this._dependency[i].id == id) { - return this._dependency[i]; - } - } - return null; + /** + * Get arrow by ID. + * @param {ArrowIdType} id arrow ID + * @returns {ArrowSpec | null} arrow spec, or null + */ + getArrow(id) { + return this._dependency.find(dep => dep.id === id) ?? null; } - //Función que recibe el id de una flecha y la elimina. + /** + * Finds arrow with the given id and removes it. + * Función que recibe el id de una flecha y la elimina. + * @param {ArrowIdType} id arrow id + */ removeArrow(id) { - for (let i = 0; i < this._dependency.length; i++) { - if (this._dependency[i].id == id) var index = i; - } + const index = this._dependency.findIndex(dep => dep.id === id); + + if (index >= 0) { - //var list = document.getElementsByTagName("path"); //FALTA QUE ESTA SELECCION LA HAGA PARA EL DOM DEL TIMELINE INSTANCIADO!!!! - var list = document.querySelectorAll("#" +this._timeline.dom.container.id +" path"); + //var list = document.getElementsByTagName("path"); //FALTA QUE ESTA SELECCION LA HAGA PARA EL DOM DEL TIMELINE INSTANCIADO!!!! + const list = document.querySelectorAll("#" + this._timeline.dom.container.id + " path"); - this._dependency.splice(index, 1); //Elimino del array dependency - this._dependencyPath.splice(index, 1); //Elimino del array dependencyPath + this._dependency.splice(index, 1); //Elimino del array dependency + this._dependencyPath.splice(index, 1); //Elimino del array dependencyPath - list[index + 1].parentNode.removeChild(list[index + 1]); //Lo elimino del dom + const parentNode = list[index + 1].parentNode; // may be null + if (parentNode) { + parentNode.removeChild(list[index + 1]); //Lo elimino del dom + } + } } - //Función que recibe el id de un item y elimina la flecha. - removeArrowbyItemId(id) { + /** + * Finds all arrows related to one view item and removes them all. + * Función que recibe el id de un item y elimina la flecha. + * @param {VisIdType} id view item id + * @returns {(ArrowIdType)[]} list of removed arrow ids + */ + removeItemArrows(id) { let listOfRemovedArrows = []; for (let i = 0; i < this._dependency.length; i++) { - if ( (this._dependency[i].id_item_1 == id) || (this._dependency[i].id_item_2 == id) ) { + if ( (this._dependency[i].item1Id == id) || (this._dependency[i].item2Id == id) ) { listOfRemovedArrows.push(this._dependency[i].id); this.removeArrow(this._dependency[i].id); i--; @@ -284,6 +371,12 @@ export default class Arrow { return listOfRemovedArrows; } - + /** + * For backward compatibility + * @deprecated use the removeItemArrows method instead. + */ + removeArrowbyItemId(id) { + this.removeItemArrows(id); + } } \ No newline at end of file diff --git a/examples/2timelines.html b/examples/2timelines.html index 3b9e68d..2e529bd 100644 --- a/examples/2timelines.html +++ b/examples/2timelines.html @@ -1,5 +1,5 @@ - + Timeline | Group example, with an arrow @@ -27,11 +27,12 @@ rel="stylesheet" type="text/css" /> + - - - + + +

visible items:

@@ -43,9 +44,5 @@

- - - - diff --git a/examples/2timelines.js b/examples/2timelines.js index 494f2c9..39d38c1 100644 --- a/examples/2timelines.js +++ b/examples/2timelines.js @@ -1,239 +1,236 @@ - /** - *CREATING THE TIMELINE 1 - */ - import Arrow from '../arrow.js'; - - - const options = { - groupOrder: "content", // groupOrder can be a property name or a sorting function - selectable: true, - editable: true, - groupTemplate: function(group) { //function to hide groups - var container = document.createElement('div'); - var label = document.createElement('span'); - label.innerHTML = group.content + ' '; - container.insertAdjacentElement('afterBegin',label); - - var hide = document.createElement('span'); - hide.setAttribute("class", "oi oi-eye"); - hide.addEventListener('click',function(){ - groups.update({id: group.id, visible: false}); - }); - container.insertAdjacentElement('beforeEnd',hide); - return container; - } - }; - - // Generate some - var now = vis.moment() - .minutes(0) - .seconds(0) - .milliseconds(0); - var names = ["John", "Alston", "Lee", "Grant"]; - var itemCount = 20; - // create a data set with groups - var groups = new vis.DataSet(); - for (var g = 0; g < names.length; g++) { - groups.add({ id: g, content: names[g] }); - } - // create a dataset with items - var items = new vis.DataSet(); - for (var i = 0; i < itemCount; i++) { - var start = now.clone().add(Math.random() * 200, "hours"); - var end = start + 100000000; - var group = Math.floor(Math.random() * names.length); - items.add({ - id: i, - group: group, - content: - "item " + - i + - ' (' + - names[group] + - ")", - start: start, - end: end, - //type: "box" - }); - } - // Create visualization. - const container = document.getElementById("visualization"); - const timelinevis = new vis.Timeline(container, items, groups, options); - - - - /** - *CREATING THE TIMELINE 2 - */ - - const options2 = { - groupOrder: "content", // groupOrder can be a property name or a sorting function - selectable: true, - editable: true, - groupTemplate: function(group) { //function to hide groups - var container = document.createElement('div'); - var label = document.createElement('span'); - label.innerHTML = group.content + ' '; - container.insertAdjacentElement('afterBegin',label); - - var hide = document.createElement('span'); - hide.setAttribute("class", "oi oi-eye"); - hide.addEventListener('click',function(){ - groups2.update({id: group.id, visible: false}); - }); - container.insertAdjacentElement('beforeEnd',hide); - return container; - } - }; - - // Generate some - var now2 = vis.moment() - .minutes(0) - .seconds(0) - .milliseconds(0); - var names2 = ["Juan", "Alfredo", "Luis", "David"]; - var itemCount2 = 20; - // create a data set with groups - var groups2 = new vis.DataSet(); - for (var g = 0; g < names2.length; g++) { - groups2.add({ id: g, content: names2[g] }); - } - // create a dataset with items - var items2 = new vis.DataSet(); - for (var i = 0; i < itemCount2; i++) { - var start = now2.clone().add(Math.random() * 200, "hours"); - var end = start + 100000000; - var group = Math.floor(Math.random() * names2.length); - items2.add({ - id: i, - group: group, - content: - "item " + - i + - ' (' + - names2[group] + - ")", - start: start, - end: end, - //type: "box" - }); - } - // Create visualization. - const container2 = document.getElementById("visualization2"); - const timelinevis2 = new vis.Timeline(container2, items2, groups2, options2); - - - - - /* SYNCHRONIZATION OF MOVEMENT OF BOTH TIMELINES */ - - timelinevis2.on('rangechange', function () { - onrangechange2(); - }); - timelinevis.on('rangechange', function () { - onrangechange1(); - }); - function onrangechange1() { - var range = timelinevis.getWindow(); - timelinevis2.setWindow(range.start, range.end, {animation: false}); - } - function onrangechange2() { - var range = timelinevis2.getWindow(); - timelinevis.setWindow(range.start, range.end, {animation: false}); - } - - - - /** - *CREATING 2 ARRAYS OF ARROWS - */ - var dependency = [ - { - id: 2, - id_item_1: 1, - id_item_2: 2, - title: 'Hola' - }, - { - id: 5, - id_item_1: 3, - id_item_2: 5 - }, - { - id: 7, - id_item_1: 6, - id_item_2: 7, - title: 'Hello' - }, - { - id: 10, - id_item_1: 3, - id_item_2: 8 - } - ]; - - - - var dependency2 = [ - { - id: 2, - id_item_1: 1, - id_item_2: 2, - title: 'Hola 2' - }, - { - id: 5, - id_item_1: 3, - id_item_2: 5 - }, - { - id: 7, - id_item_1: 6, - id_item_2: 7, - title: 'Hello 2' - }, - { - id: 10, - id_item_1: 3, - id_item_2: 8 - } - ]; - - - // Create instance of Arrow for a timeline objetc and its denpedencies - const myArrow = new Arrow(timelinevis, dependency); - - const myArrow2 = new Arrow(timelinevis2, dependency2); - - //Example of adding a new arrow (between items 15 and 16) - myArrow.addArrow( - { - id: 13, - id_item_1: 15, - id_item_2: 16 - } - ); - - - - - /*ANOTHER FUNCTIONS (NO IMPORTANT)*/ - const showVisibleItems = function () { - var a = timelinevis.getVisibleItems(); - document.getElementById("visibleItemsContainer").innerHTML = "" - document.getElementById("visibleItemsContainer").innerHTML += a; - }; - Window.showVisibleItems = showVisibleItems; - - const showGroups = function (){ - groups.forEach(function(group){ - groups.update({id: group.id, visible: true}); - }) - }; - Window.showGroups = showGroups; - - const remove = function () { - myArrow.removeArrow(10); - myArrow2.removeArrow(10); - } - Window.remove = remove; +/** +*CREATING THE TIMELINE 1 +*/ +import { Arrows } from '../arrows.js'; + + +const options = { + groupOrder: "content", // groupOrder can be a property name or a sorting function + selectable: true, + editable: true, + groupTemplate: function (group) { //function to hide groups + const container = document.createElement('div'); + const label = document.createElement('span'); + label.innerHTML = group.content + ' '; + container.insertAdjacentElement('afterBegin', label); + + const hide = document.createElement('span'); + hide.setAttribute("class", "oi oi-eye"); + hide.addEventListener('click', function () { + groups.update({ id: group.id, visible: false }); + }); + container.insertAdjacentElement('beforeEnd', hide); + return container; + } +}; + +// Generate some +const now = vis.moment() + .minutes(0) + .seconds(0) + .milliseconds(0); +const names = ["John", "Alston", "Lee", "Grant"]; +const itemCount = 20; +// create a data set with groups +const groups = new vis.DataSet(); +for (let g = 0; g < names.length; g++) { + groups.add({ id: g, content: names[g] }); +} +// create a dataset with items +const items = new vis.DataSet(); +for (let i = 0; i < itemCount; i++) { + const start = now.clone().add(Math.random() * 200, "hours"); + const end = start + 100000000; + const group = Math.floor(Math.random() * names.length); + items.add({ + id: i, + group: group, + content: + "item " + + i + + ' (' + + names[group] + + ")", + start: start, + end: end, + //type: "box" + }); +} +// Create visualization. +const container = document.getElementById("visualization"); +const timelinevis = new vis.Timeline(container, items, groups, options); + + + +/** +*CREATING THE TIMELINE 2 +*/ + +const options2 = { + groupOrder: "content", // groupOrder can be a property name or a sorting function + selectable: true, + editable: true, + groupTemplate: function (group) { //function to hide groups + const container = document.createElement('div'); + const label = document.createElement('span'); + label.innerHTML = group.content + ' '; + container.insertAdjacentElement('afterBegin', label); + + const hide = document.createElement('span'); + hide.setAttribute("class", "oi oi-eye"); + hide.addEventListener('click', function () { + groups2.update({ id: group.id, visible: false }); + }); + container.insertAdjacentElement('beforeEnd', hide); + return container; + } +}; + +// Generate some +const now2 = vis.moment() + .minutes(0) + .seconds(0) + .milliseconds(0); +const names2 = ["Juan", "Alfredo", "Luis", "David"]; +const itemCount2 = 20; +// create a data set with groups +const groups2 = new vis.DataSet(); +for (let g = 0; g < names2.length; g++) { + groups2.add({ id: g, content: names2[g] }); +} +// create a dataset with items +const items2 = new vis.DataSet(); +for (let i = 0; i < itemCount2; i++) { + const start = now2.clone().add(Math.random() * 200, "hours"); + const end = start + 100000000; + const group = Math.floor(Math.random() * names2.length); + items2.add({ + id: i, + group: group, + content: + "item " + + i + + ' (' + + names2[group] + + ")", + start: start, + end: end, + //type: "box" + }); +} +// Create visualization. +const container2 = document.getElementById("visualization2"); +const timelinevis2 = new vis.Timeline(container2, items2, groups2, options2); + + + + +/* SYNCHRONIZATION OF MOVEMENT OF BOTH TIMELINES */ + +timelinevis2.on('rangechange', function () { + onrangechange2(); +}); +timelinevis.on('rangechange', function () { + onrangechange1(); +}); +function onrangechange1() { + const range = timelinevis.getWindow(); + timelinevis2.setWindow(range.start, range.end, { animation: false }); +} +function onrangechange2() { + const range = timelinevis2.getWindow(); + timelinevis.setWindow(range.start, range.end, { animation: false }); +} + + + +/** +*CREATING 2 ARRAYS OF ARROWS +*/ +const dependency = [ + { + id: 2, + item1Id: 1, + item2Id: 2, + title: 'Hola' + }, + { + id: 5, + item1Id: 3, + item2Id: 5 + }, + { + id: 7, + item1Id: 6, + item2Id: 7, + title: 'Hello' + }, + { + id: 10, + item1Id: 3, + item2Id: 8 + } +]; + + + +const dependency2 = [ + { + id: 2, + item1Id: 1, + item2Id: 2, + title: 'Hola 2' + }, + { + id: 5, + item1Id: 3, + item2Id: 5 + }, + { + id: 7, + item1Id: 6, + item2Id: 7, + title: 'Hello 2' + }, + { + id: 10, + item1Id: 3, + item2Id: 8 + } +]; + + +// Create instance of Arrows for a timeline objetc and its denpedencies +const myArrows = new Arrows(timelinevis, dependency); + +const myArrows2 = new Arrows(timelinevis2, dependency2); + +//Example of adding a new arrow (between items 15 and 16) +myArrows.addArrow( + { + id: 13, + item1Id: 15, + item2Id: 16 + } +); + + + + +/*ANOTHER FUNCTIONS (NO IMPORTANT)*/ +document.getElementById("showVisibleItems").onclick = function () { + const a = timelinevis.getVisibleItems(); + document.getElementById("visibleItemsContainer").innerHTML = "" + document.getElementById("visibleItemsContainer").innerHTML += a; +}; + +document.getElementById("showGroups").onclick = function () { + groups.forEach(function (group) { + groups.update({ id: group.id, visible: true }); + }) +}; + +document.getElementById("remove").onclick = function () { + myArrows.removeArrow(10); + myArrows2.removeArrow(10); +} diff --git a/examples/basic_example.html b/examples/basic_example.html index f2953b8..d619267 100644 --- a/examples/basic_example.html +++ b/examples/basic_example.html @@ -1,5 +1,5 @@ - + Timeline | Group example, with an arrow @@ -27,21 +27,17 @@ rel="stylesheet" type="text/css" /> +

Basic example

- - - + + +

visible items:

- - - - - diff --git a/examples/basic_example.js b/examples/basic_example.js index 7efbb19..407ec45 100644 --- a/examples/basic_example.js +++ b/examples/basic_example.js @@ -1,134 +1,126 @@ - /** - *CREATING THE TIMELINE - */ - import Arrow from '../arrow.js'; - - const options = { - groupOrder: "content", // groupOrder can be a property name or a sorting function - selectable: true, - editable: true, - groupTemplate: function(group) { //function to hide groups - var container = document.createElement('div'); - var label = document.createElement('span'); - label.innerHTML = group.content + ' '; - container.insertAdjacentElement('afterBegin',label); - - var hide = document.createElement('span'); - hide.setAttribute("class", "oi oi-eye"); - hide.addEventListener('click',function(){ - groups.update({id: group.id, visible: false}); - }); - container.insertAdjacentElement('beforeEnd',hide); - return container; - } - }; - - // Generate some - var now = vis.moment() - .minutes(0) - .seconds(0) - .milliseconds(0); - var names = ["John", "Alston", "Lee", "Grant"]; - var itemCount = 20; - // create a data set with groups - var groups = new vis.DataSet(); - for (var g = 0; g < names.length; g++) { - groups.add({ id: g, content: names[g] }); - } - // create a dataset with items - var items = new vis.DataSet(); - for (var i = 0; i < itemCount; i++) { - var start = now.clone().add(Math.random() * 200, "hours"); - var end = start + 100000000; - var group = Math.floor(Math.random() * names.length); - items.add({ - id: i, - group: group, - content: - "item " + - i + - ' (' + - names[group] + - ")", - start: start, - end: end, - //type: "box" - }); - } - // Create visualization. - const container = document.getElementById("visualization"); - const timelinevis = new vis.Timeline(container, items, groups, options); - - - - - - - /** - *CREATING THE ARROWS - */ - var dependency = [ - { - id: 2, - id_item_1: 1, - id_item_2: 2, - title: 'Hello' - }, - { - id: 5, - id_item_1: 3, - id_item_2: 5 - }, - { - id: 7, - id_item_1: 6, - id_item_2: 7, - title: 'Hola' - }, - { - id: 10, - id_item_1: 3, - id_item_2: 8 - } - ]; - - - - - // Create instance of Arrow for a timeline objetc and its denpedencies - const myArrow = new Arrow(timelinevis, dependency); - - - - //Example of adding a new arrow (between items 15 and 16) - myArrow.addArrow( - { - id: 13, - id_item_1: 15, - id_item_2: 16, - title: 'I have been added' - } - ); - - - - - /*ANOTHER FUNCTIONS (NO IMPORTANT)*/ - const showVisibleItems = function () { - var a = timelinevis.getVisibleItems(); - document.getElementById("visibleItemsContainer").innerHTML = "" - document.getElementById("visibleItemsContainer").innerHTML += a; - }; - Window.showVisibleItems = showVisibleItems; - - const showGroups = function (){ - groups.forEach(function(group){ - groups.update({id: group.id, visible: true}); - }) - }; - Window.showGroups = showGroups; - - const remove = function () { - myArrow.removeArrow(10); - } - Window.remove = remove; +/** +*CREATING THE TIMELINE +*/ +import { Arrows } from '../arrows.js'; + +const options = { + groupOrder: "content", // groupOrder can be a property name or a sorting function + selectable: true, + editable: true, + groupTemplate: function (group) { //function to hide groups + const container = document.createElement('div'); + const label = document.createElement('span'); + label.innerHTML = group.content + ' '; + container.insertAdjacentElement('afterBegin', label); + + const hide = document.createElement('span'); + hide.setAttribute("class", "oi oi-eye"); + hide.addEventListener('click', function () { + groups.update({ id: group.id, visible: false }); + }); + container.insertAdjacentElement('beforeEnd', hide); + return container; + } +}; + +// Generate some +const now = vis.moment() + .minutes(0) + .seconds(0) + .milliseconds(0); +const names = ["John", "Alston", "Lee", "Grant"]; +const itemCount = 20; +// create a data set with groups +const groups = new vis.DataSet(); +for (let g = 0; g < names.length; g++) { + groups.add({ id: g, content: names[g] }); +} +// create a dataset with items +const items = new vis.DataSet(); +for (let i = 0; i < itemCount; i++) { + const start = now.clone().add(Math.random() * 200, "hours"); + const end = start + 100000000; + const group = Math.floor(Math.random() * names.length); + items.add({ + id: i, + group: group, + content: + "item " + + i + + ' (' + + names[group] + + ")", + start: start, + end: end, + //type: "box" + }); +} +// Create visualization. +const container = document.getElementById("visualization"); +const timelinevis = new vis.Timeline(container, items, groups, options); + + +/** +*CREATING THE ARROWS +*/ +const dependency = [ + { + id: 2, + item1Id: 1, + item2Id: 2, + title: 'Hello' + }, + { + id: 5, + item1Id: 3, + item2Id: 5 + }, + { + id: 7, + item1Id: 6, + item2Id: 7, + title: 'Hola' + }, + { + id: 10, + item1Id: 3, + item2Id: 8 + } +]; + + + + +// Create instance of Arrows for a timeline objetc and its denpedencies +const myArrows = new Arrows(timelinevis, dependency); + + + +//Example of adding a new arrow (between items 15 and 16) +myArrows.addArrow( + { + id: 13, + item1Id: 15, + item2Id: 16, + title: 'I have been added' + } +); + +/*ANOTHER FUNCTIONS (NO IMPORTANT)*/ +document.getElementById("showVisibleItems").onclick = function () { + const a = timelinevis.getVisibleItems(); + document.getElementById("visibleItemsContainer").innerHTML = "" + document.getElementById("visibleItemsContainer").innerHTML += a; +}; + + +document.getElementById("showGroups").onclick = function () { + groups.forEach(function (group) { + groups.update({ id: group.id, visible: true }); + }) +}; + + +document.getElementById("remove").onclick = function () { + myArrows.removeArrow(10); +}; diff --git a/examples/colorOption.html b/examples/colorOption.html index c587f53..bf0ea62 100644 --- a/examples/colorOption.html +++ b/examples/colorOption.html @@ -1,5 +1,5 @@ - + Timeline | With colorOption set to "#039E00" @@ -27,21 +27,17 @@ rel="stylesheet" type="text/css" /> +

With color option

- - - + + +

visible items:

- - - - - diff --git a/examples/colorOption.js b/examples/colorOption.js index a9def02..bbc4058 100644 --- a/examples/colorOption.js +++ b/examples/colorOption.js @@ -1,138 +1,133 @@ - /** - *CREATING THE TIMELINE - */ - import Arrow from '../arrow.js'; - - const options = { - groupOrder: "content", // groupOrder can be a property name or a sorting function - selectable: true, - editable: true, - groupTemplate: function(group) { //function to hide groups - var container = document.createElement('div'); - var label = document.createElement('span'); - label.innerHTML = group.content + ' '; - container.insertAdjacentElement('afterBegin',label); - - var hide = document.createElement('span'); - hide.setAttribute("class", "oi oi-eye"); - hide.addEventListener('click',function(){ - groups.update({id: group.id, visible: false}); - }); - container.insertAdjacentElement('beforeEnd',hide); - return container; - } - }; - - // Generate some - var now = vis.moment() - .minutes(0) - .seconds(0) - .milliseconds(0); - var names = ["John", "Alston", "Lee", "Grant"]; - var itemCount = 20; - // create a data set with groups - var groups = new vis.DataSet(); - for (var g = 0; g < names.length; g++) { - groups.add({ id: g, content: names[g] }); - } - // create a dataset with items - var items = new vis.DataSet(); - for (var i = 0; i < itemCount; i++) { - var start = now.clone().add(Math.random() * 200, "hours"); - var end = start + 100000000; - var group = Math.floor(Math.random() * names.length); - items.add({ - id: i, - group: group, - content: - "item " + - i + - ' (' + - names[group] + - ")", - start: start, - end: end, - //type: "box" - }); - } - // Create visualization. - const container = document.getElementById("visualization"); - const timelinevis = new vis.Timeline(container, items, groups, options); - - - - - - - /** - *CREATING THE ARROWS - */ - var dependency = [ - { - id: 2, - id_item_1: 1, - id_item_2: 2, - title: 'Hello' - }, - { - id: 5, - id_item_1: 3, - id_item_2: 5 - }, - { - id: 7, - id_item_1: 6, - id_item_2: 7, - title: 'Hola' - }, - { - id: 10, - id_item_1: 3, - id_item_2: 8 - } - ]; - - - // Adding an arrows option Color - const arrowsOptions = { - color: "#039E00" - }; - - - // Create instance of Arrow for a timeline objetc and its denpedencies - const myArrow = new Arrow(timelinevis, dependency, arrowsOptions); - - - - //Example of adding a new arrow (between items 15 and 16) - myArrow.addArrow( - { - id: 13, - id_item_1: 15, - id_item_2: 16, - title: 'I have been added' - } - ); - - - - - /*ANOTHER FUNCTIONS (NO IMPORTANT)*/ - const showVisibleItems = function () { - var a = timelinevis.getVisibleItems(); - document.getElementById("visibleItemsContainer").innerHTML = "" - document.getElementById("visibleItemsContainer").innerHTML += a; - }; - Window.showVisibleItems = showVisibleItems; - - const showGroups = function (){ - groups.forEach(function(group){ - groups.update({id: group.id, visible: true}); - }) - }; - Window.showGroups = showGroups; - - const remove = function () { - myArrow.removeArrow(10); - } - Window.remove = remove; +/** +*CREATING THE TIMELINE +*/ +import { Arrows } from '../arrows.js'; + +const options = { + groupOrder: "content", // groupOrder can be a property name or a sorting function + selectable: true, + editable: true, + groupTemplate: function (group) { //function to hide groups + const container = document.createElement('div'); + const label = document.createElement('span'); + label.innerHTML = group.content + ' '; + container.insertAdjacentElement('afterBegin', label); + + const hide = document.createElement('span'); + hide.setAttribute("class", "oi oi-eye"); + hide.addEventListener('click', function () { + groups.update({ id: group.id, visible: false }); + }); + container.insertAdjacentElement('beforeEnd', hide); + return container; + } +}; + +// Generate some +const now = vis.moment() + .minutes(0) + .seconds(0) + .milliseconds(0); +const names = ["John", "Alston", "Lee", "Grant"]; +const itemCount = 20; +// create a data set with groups +const groups = new vis.DataSet(); +for (let g = 0; g < names.length; g++) { + groups.add({ id: g, content: names[g] }); +} +// create a dataset with items +const items = new vis.DataSet(); +for (let i = 0; i < itemCount; i++) { + const start = now.clone().add(Math.random() * 200, "hours"); + const end = start + 100000000; + const group = Math.floor(Math.random() * names.length); + items.add({ + id: i, + group: group, + content: + "item " + + i + + ' (' + + names[group] + + ")", + start: start, + end: end, + //type: "box" + }); +} +// Create visualization. +const container = document.getElementById("visualization"); +const timelinevis = new vis.Timeline(container, items, groups, options); + + + + + + +/** +*CREATING THE ARROWS +*/ +const dependency = [ + { + id: 2, + item1Id: 1, + item2Id: 2, + title: 'Hello' + }, + { + id: 5, + item1Id: 3, + item2Id: 5 + }, + { + id: 7, + item1Id: 6, + item2Id: 7, + title: 'Hola' + }, + { + id: 10, + item1Id: 3, + item2Id: 8 + } +]; + + +// Adding an arrows option Color +const arrowsOptions = { + color: "#039E00" +}; + + +// Create instance of Arrows for a timeline objetc and its denpedencies +const myArrows = new Arrows(timelinevis, dependency, arrowsOptions); + + + +//Example of adding a new arrow (between items 15 and 16) +myArrows.addArrow( + { + id: 13, + item1Id: 15, + item2Id: 16, + title: 'I have been added' + } +); + + +/*ANOTHER FUNCTIONS (NO IMPORTANT)*/ +document.getElementById("showVisibleItems").onclick = function () { + const a = timelinevis.getVisibleItems(); + document.getElementById("visibleItemsContainer").innerHTML = "" + document.getElementById("visibleItemsContainer").innerHTML += a; +}; + +document.getElementById("showGroups").onclick = function () { + groups.forEach(function (group) { + groups.update({ id: group.id, visible: true }); + }) +}; + +document.getElementById("remove").onclick = function () { + myArrows.removeArrow(10); +}; diff --git a/examples/followRelationships_True.html b/examples/followRelationships_True.html index 9bb39ff..e707491 100644 --- a/examples/followRelationships_True.html +++ b/examples/followRelationships_True.html @@ -1,5 +1,5 @@ - + Timeline | With followRelationships: true @@ -27,21 +27,17 @@ rel="stylesheet" type="text/css" /> +

With followRelationships True

- - - + + +

visible items:

- - - - - diff --git a/examples/followRelationships_True.js b/examples/followRelationships_True.js index dac73f7..f92d050 100644 --- a/examples/followRelationships_True.js +++ b/examples/followRelationships_True.js @@ -1,138 +1,134 @@ - /** - *CREATING THE TIMELINE - */ - import Arrow from '../arrow.js'; - - const options = { - groupOrder: "content", // groupOrder can be a property name or a sorting function - selectable: true, - editable: true, - groupTemplate: function(group) { //function to hide groups - var container = document.createElement('div'); - var label = document.createElement('span'); - label.innerHTML = group.content + ' '; - container.insertAdjacentElement('afterBegin',label); - - var hide = document.createElement('span'); - hide.setAttribute("class", "oi oi-eye"); - hide.addEventListener('click',function(){ - groups.update({id: group.id, visible: false}); - }); - container.insertAdjacentElement('beforeEnd',hide); - return container; - } - }; - - // Generate some - var now = vis.moment() - .minutes(0) - .seconds(0) - .milliseconds(0); - var names = ["John", "Alston", "Lee", "Grant"]; - var itemCount = 20; - // create a data set with groups - var groups = new vis.DataSet(); - for (var g = 0; g < names.length; g++) { - groups.add({ id: g, content: names[g] }); - } - // create a dataset with items - var items = new vis.DataSet(); - for (var i = 0; i < itemCount; i++) { - var start = now.clone().add(Math.random() * 200, "hours"); - var end = start + 100000000; - var group = Math.floor(Math.random() * names.length); - items.add({ - id: i, - group: group, - content: - "item " + - i + - ' (' + - names[group] + - ")", - start: start, - end: end, - //type: "box" - }); - } - // Create visualization. - const container = document.getElementById("visualization"); - const timelinevis = new vis.Timeline(container, items, groups, options); - - - - - - - /** - *CREATING THE ARROWS - */ - var dependency = [ - { - id: 2, - id_item_1: 1, - id_item_2: 2, - title: 'Hello' - }, - { - id: 5, - id_item_1: 3, - id_item_2: 5 - }, - { - id: 7, - id_item_1: 6, - id_item_2: 7, - title: 'Hola' - }, - { - id: 10, - id_item_1: 3, - id_item_2: 8 - } - ]; - - - // Adding arrows option followRelationships set to true - const arrowsOptions = { - followRelationships: true, - }; - - - // Create instance of Arrow for a timeline objetc and its denpedencies - const myArrow = new Arrow(timelinevis, dependency, arrowsOptions); - - - - //Example of adding a new arrow (between items 15 and 16) - myArrow.addArrow( - { - id: 13, - id_item_1: 15, - id_item_2: 16, - title: 'I have been added' - } - ); - - - - - /*ANOTHER FUNCTIONS (NO IMPORTANT)*/ - const showVisibleItems = function () { - var a = timelinevis.getVisibleItems(); - document.getElementById("visibleItemsContainer").innerHTML = "" - document.getElementById("visibleItemsContainer").innerHTML += a; - }; - Window.showVisibleItems = showVisibleItems; - - const showGroups = function (){ - groups.forEach(function(group){ - groups.update({id: group.id, visible: true}); - }) - }; - Window.showGroups = showGroups; - - const remove = function () { - myArrow.removeArrow(10); - } - Window.remove = remove; +/** +*CREATING THE TIMELINE +*/ +import { Arrows } from '../arrows.js'; + +const options = { + groupOrder: "content", // groupOrder can be a property name or a sorting function + selectable: true, + editable: true, + groupTemplate: function (group) { //function to hide groups + const container = document.createElement('div'); + const label = document.createElement('span'); + label.innerHTML = group.content + ' '; + container.insertAdjacentElement('afterBegin', label); + + const hide = document.createElement('span'); + hide.setAttribute("class", "oi oi-eye"); + hide.addEventListener('click', function () { + groups.update({ id: group.id, visible: false }); + }); + container.insertAdjacentElement('beforeEnd', hide); + return container; + } +}; + +// Generate some +const now = vis.moment() + .minutes(0) + .seconds(0) + .milliseconds(0); +const names = ["John", "Alston", "Lee", "Grant"]; +const itemCount = 20; +// create a data set with groups +const groups = new vis.DataSet(); +for (let g = 0; g < names.length; g++) { + groups.add({ id: g, content: names[g] }); +} +// create a dataset with items +const items = new vis.DataSet(); +for (let i = 0; i < itemCount; i++) { + const start = now.clone().add(Math.random() * 200, "hours"); + const end = start + 100000000; + const group = Math.floor(Math.random() * names.length); + items.add({ + id: i, + group: group, + content: + "item " + + i + + ' (' + + names[group] + + ")", + start: start, + end: end, + //type: "box" + }); +} +// Create visualization. +const container = document.getElementById("visualization"); +const timelinevis = new vis.Timeline(container, items, groups, options); + + + + + + +/** +*CREATING THE ARROWS +*/ +const dependency = [ + { + id: 2, + item1Id: 1, + item2Id: 2, + title: 'Hello' + }, + { + id: 5, + item1Id: 3, + item2Id: 5 + }, + { + id: 7, + item1Id: 6, + item2Id: 7, + title: 'Hola' + }, + { + id: 10, + item1Id: 3, + item2Id: 8 + } +]; + + +// Adding arrows option followRelationships set to true +const arrowsOptions = { + followRelationships: true, +}; + + +// Create instance of Arrows for a timeline objetc and its denpedencies +const myArrows = new Arrows(timelinevis, dependency, arrowsOptions); + + + +//Example of adding a new arrow (between items 15 and 16) +myArrows.addArrow( + { + id: 13, + item1Id: 15, + item2Id: 16, + title: 'I have been added' + } +); + + + +/*ANOTHER FUNCTIONS (NO IMPORTANT)*/ +document.getElementById("showVisibleItems").onclick = function () { + const a = timelinevis.getVisibleItems(); + document.getElementById("visibleItemsContainer").innerHTML = "" + document.getElementById("visibleItemsContainer").innerHTML += a; +}; + +document.getElementById("showGroups").onclick = function () { + groups.forEach(function (group) { + groups.update({ id: group.id, visible: true }); + }) +}; + +document.getElementById("remove").onclick = function () { + myArrows.removeArrow(10); +}; diff --git a/index.html b/index.html index babafa9..951dc93 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - + Timeline-arrows diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a80c62d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1754 @@ +{ + "name": "timeline-arrows", + "version": "5.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "timeline-arrows", + "version": "5.0.0", + "license": "MIT", + "devDependencies": { + "lite-server": "^2.6.1", + "typescript": "^5.2.2" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", + "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "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", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", + "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", + "dev": true, + "dependencies": { + "browser-sync-client": "^2.29.3", + "browser-sync-ui": "^2.29.3", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", + "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", + "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "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/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect-logger": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/connect-logger/-/connect-logger-0.0.1.tgz", + "integrity": "sha512-kC5FPWpcfgpW5HtICnXbdOAFa4uNilU4ZPmsH6RlXaDVfXLupyUjgI1otpj3kOcsoPpDxknxmcoM0wk0ApsjYQ==", + "dev": true, + "dependencies": { + "moment": "*" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.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/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", + "dev": true, + "dependencies": { + "chalk": "4.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "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/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.3.tgz", + "integrity": "sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", + "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/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-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "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/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/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/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/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "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/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-errors/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/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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-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/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "node_modules/lite-server": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/lite-server/-/lite-server-2.6.1.tgz", + "integrity": "sha512-d3oyB/C8AU4EwYQHlLxcu6vTQDnCaLb81v1KKNYABmFS5oeJ11A+YxlqtpbTclID1AFddJfcB5klf0q98vYIMw==", + "dev": true, + "dependencies": { + "browser-sync": "^2.26.13", + "connect-history-api-fallback": "^1.6.0", + "connect-logger": "^0.0.1", + "lodash": "^4.17.20", + "minimist": "^1.2.5" + }, + "bin": { + "lite-server": "bin/lite-server" + } + }, + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/localtunnel/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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/localtunnel/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/localtunnel/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "dependencies": { + "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/localtunnel/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" + } + }, + "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.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, + "node_modules/micromatch": { + "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.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/mime-db": { + "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.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.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "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/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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true + }, + "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/socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-client": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "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/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/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/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.36.tgz", + "integrity": "sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "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": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.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/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json index 8c142d1..b1ac3a0 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,14 @@ { - "name": "timeline-arrows", - "version": "4.1.0", + "name": "vis-timeline-arrows", + "version": "5.0.0", "description": "Package to easily draw lines to connect items in the vis Timeline module.", - "main": "arrow.js", + "main": "arrows.js", + "types": "arrows.d.ts", "scripts": { - "test": "echo \"Error: no test specified\" && exit 0" + "test": "echo \"Error: no test specified\" && exit 0", + "generateTypes": "tsc --allowJs -d --emitDeclarationOnly --lib es2015,dom arrows.js", + "prepack": "npm run generateTypes", + "serve": "lite-server" }, "repository": { "type": "git", @@ -19,5 +23,9 @@ "bugs": { "url": "https://github.com/javdome/timeline-arrows/issues" }, - "homepage": "https://github.com/javdome/timeline-arrows#readme" + "homepage": "https://github.com/javdome/timeline-arrows#readme", + "devDependencies": { + "lite-server": "^2.6.1", + "typescript": "^5.2.2" + } }