From 36af8b85b920ec1546f10fb8e22014250d14f2c3 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:01:39 +0200 Subject: [PATCH 01/20] Create Filter class --- src/composables/filters/Filter.js | 67 +++++++++++++++++++ tests/unit/composables/filters/Filter.test.js | 60 +++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/composables/filters/Filter.js create mode 100644 tests/unit/composables/filters/Filter.test.js diff --git a/src/composables/filters/Filter.js b/src/composables/filters/Filter.js new file mode 100644 index 00000000..3c1621bf --- /dev/null +++ b/src/composables/filters/Filter.js @@ -0,0 +1,67 @@ +/** + * Class representing a filter. + */ + +class Filter { + /** + * Default constructor. + * @param {string} filterName - The name of the filter. + * @param {string} serverName - The name used for the filter on the server. + * @param {string} queryName - The name used for the filter in url query parameters. + * @param {*} defaultValue - The default value of the filter. + */ + constructor(filterName, serverName, queryName, defaultValue) { + /** + * Name of the filter. + * @type {string} + */ + this.filterName = filterName; + + /** + * Name used for the filter on the server. + * @type {string} + */ + this.serverName = serverName; + + /** + * Name used for the filter in query parameters. + * @type {string} + */ + this.queryName = queryName; + + /** + * Default value of the filter. + * @type {*} + */ + this.defaultValue = defaultValue; + } + + /** + * Get the value of the filter or null if it's the default value. + * @param {*} value - The value to get. + * @returns {*} The value of the filter. + */ + getFilterValue(value) { + return this.isDefaultValue(value) ? null : value; + } + + /** + * Get the value of the filter from the URL. + * @param {*} value - The value from the URL. + * @returns {*} The value of the filter. + */ + getValueFromUrl(value) { + return value; + } + + /** + * Check if the value is the default value or null. + * @param {*} value - The value to check. + * @returns {boolean} True if the value is the default value or null, false otherwise. + */ + isDefaultValue(value) { + return value === null || value === this.defaultValue; + } +} + +export default Filter; diff --git a/tests/unit/composables/filters/Filter.test.js b/tests/unit/composables/filters/Filter.test.js new file mode 100644 index 00000000..9e7f1392 --- /dev/null +++ b/tests/unit/composables/filters/Filter.test.js @@ -0,0 +1,60 @@ +import Filter from 'src/composables/filters/Filter'; + +describe('Test class: Filter', () => { + let filter; + + beforeEach(() => { + filter = new Filter('testFilter', 'serverTestFilter', 'queryTestFilter', 'default'); + }); + + describe('Test constructor', () => { + it('should create an instance of Filter', () => { + expect(filter).toBeInstanceOf(Filter); + expect(filter.filterName).toBe('testFilter'); + expect(filter.serverName).toBe('serverTestFilter'); + expect(filter.queryName).toBe('queryTestFilter'); + expect(filter.defaultValue).toBe('default'); + }); + }); + + describe('Test function: getFilterValue', () => { + it('should return null if the value is the default value', () => { + const value = 'default'; + + expect(filter.getFilterValue(value)).toBe(null); + }); + + it('should return the value passed to it', () => { + const value = 'someValue'; + + expect(filter.getFilterValue(value)).toBe(value); + }); + }); + + describe('Test function: getValueFromUrl', () => { + it('should return the value passed to it', () => { + const value = 'urlValue'; + + expect(filter.getValueFromUrl(value)).toBe(value); + }); + }); + + describe('Test function: isDefaultValue', () => { + it('should return true for default value', () => { + expect(filter.isDefaultValue('default')).toBe(true); + }); + + it('should return true for null value', () => { + expect(filter.isDefaultValue(null)).toBe(true); + }); + + it('should return false for non-default value', () => { + expect(filter.isDefaultValue('test')).toBe(false); + expect(filter.isDefaultValue(false)).toBe(false); + expect(filter.isDefaultValue('')).toBe(false); + expect(filter.isDefaultValue(0)).toBe(false); + expect(filter.isDefaultValue(123)).toBe(false); + expect(filter.isDefaultValue([])).toBe(false); + }); + }); +}); From 587194535fe24803f5635516e992e8956740519b Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:03:31 +0200 Subject: [PATCH 02/20] Create NumberFilter and StringFilter that extend Filter --- src/composables/filters/NumberFilter.js | 29 ++++++++++++++++ src/composables/filters/StringFilter.js | 29 ++++++++++++++++ .../composables/filters/NumberFilter.test.js | 33 +++++++++++++++++++ .../composables/filters/StringFilter.test.js | 33 +++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 src/composables/filters/NumberFilter.js create mode 100644 src/composables/filters/StringFilter.js create mode 100644 tests/unit/composables/filters/NumberFilter.test.js create mode 100644 tests/unit/composables/filters/StringFilter.test.js diff --git a/src/composables/filters/NumberFilter.js b/src/composables/filters/NumberFilter.js new file mode 100644 index 00000000..e65cc76b --- /dev/null +++ b/src/composables/filters/NumberFilter.js @@ -0,0 +1,29 @@ +import Filter from 'src/composables/filters/Filter'; + +/** + * Class representing a number filter. + * @augments Filter + */ +class NumberFilter extends Filter { + /** + * Default constructor. + * @param {string} filterName - The name of the filter. + * @param {string} serverName - The name used for the filter on the server. + * @param {string} queryName - The name used for the filter in query parameters. + * @param {number} defaultValue - The default value of the filter. + */ + constructor(filterName, serverName, queryName, defaultValue = 0) { + super(filterName, serverName, queryName, defaultValue); + } + + /** + * Get the value of the filter from the URL and parse it as an integer. + * @param {string} value - The value from the URL. + * @returns {number} The parsed integer value of the filter. + */ + getValueFromUrl(value) { + return parseInt(value, 10) || this.defaultValue; + } +} + +export default NumberFilter; diff --git a/src/composables/filters/StringFilter.js b/src/composables/filters/StringFilter.js new file mode 100644 index 00000000..7e4e3817 --- /dev/null +++ b/src/composables/filters/StringFilter.js @@ -0,0 +1,29 @@ +import Filter from 'src/composables/filters/Filter'; + +/** + * Class representing a string filter. + * @augments Filter + */ +class StringFilter extends Filter { + /** + * Default constructor. + * @param {string} filterName - The name of the filter. + * @param {string} serverName - The name used for the filter on the server. + * @param {string} queryName - The name used for the filter in query parameters. + * @param {string} defaultValue - The default value of the filter. + */ + constructor(filterName, serverName, queryName, defaultValue = '') { + super(filterName, serverName, queryName, defaultValue); + } + + /** + * Get the value of the filter formatted with 'lk_*' and '*' around the value. + * @param {string} value - The value to format. + * @returns {string} The formatted value of the filter. + */ + getFilterValue(value) { + return this.isDefaultValue(value) ? null : `lk_*${value}*`; + } +} + +export default StringFilter; diff --git a/tests/unit/composables/filters/NumberFilter.test.js b/tests/unit/composables/filters/NumberFilter.test.js new file mode 100644 index 00000000..dc8055ff --- /dev/null +++ b/tests/unit/composables/filters/NumberFilter.test.js @@ -0,0 +1,33 @@ +import NumberFilter from 'src/composables/filters/NumberFilter'; + +describe('Test class: NumberFilter', () => { + let numberFilter; + + beforeEach(() => { + numberFilter = new NumberFilter('testNumberFilter', 'serverTestNumberFilter', 'queryTestNumberFilter', 42); + }); + + describe('Test constructor', () => { + it('should create an instance of NumberFilter', () => { + expect(numberFilter).toBeInstanceOf(NumberFilter); + expect(numberFilter.filterName).toBe('testNumberFilter'); + expect(numberFilter.serverName).toBe('serverTestNumberFilter'); + expect(numberFilter.queryName).toBe('queryTestNumberFilter'); + expect(numberFilter.defaultValue).toBe(42); + }); + }); + + describe('Test function: getValueFromUrl', () => { + it('should parse string value to integer', () => { + expect(numberFilter.getValueFromUrl('123')).toBe(123); + expect(numberFilter.getValueFromUrl('456')).toBe(456); + }); + + it('should return default value for invalid input', () => { + expect(numberFilter.getValueFromUrl('abc')).toBe(42); + expect(numberFilter.getValueFromUrl('')).toBe(42); + expect(numberFilter.getValueFromUrl(null)).toBe(42); + expect(numberFilter.getValueFromUrl(undefined)).toBe(42); + }); + }); +}); diff --git a/tests/unit/composables/filters/StringFilter.test.js b/tests/unit/composables/filters/StringFilter.test.js new file mode 100644 index 00000000..f1b76a1b --- /dev/null +++ b/tests/unit/composables/filters/StringFilter.test.js @@ -0,0 +1,33 @@ +import StringFilter from 'src/composables/filters/StringFilter'; + +describe('Test class: StringFilter', () => { + let stringFilter; + + beforeEach(() => { + stringFilter = new StringFilter('testStringFilter', 'serverTestStringFilter', 'queryTestStringFilter', 'default'); + }); + + describe('Test constructor', () => { + it('should create an instance of StringFilter', () => { + expect(stringFilter).toBeInstanceOf(StringFilter); + expect(stringFilter.filterName).toBe('testStringFilter'); + expect(stringFilter.serverName).toBe('serverTestStringFilter'); + expect(stringFilter.queryName).toBe('queryTestStringFilter'); + expect(stringFilter.defaultValue).toBe('default'); + }); + }); + + describe('Test function: getFilterValue', () => { + it('should return null if the value is the default value', () => { + const value = 'default'; + + expect(stringFilter.getFilterValue(value)).toBe(null); + }); + + it('should format the value with lk_* and *', () => { + expect(stringFilter.getFilterValue('test')).toBe('lk_*test*'); + expect(stringFilter.getFilterValue('example')).toBe('lk_*example*'); + expect(stringFilter.getFilterValue('')).toBe('lk_**'); + }); + }); +}); From d25e3f151543bf9f7ce4a075852beb6660950337 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:05:19 +0200 Subject: [PATCH 03/20] Create AccessControlNameFilter, PageFilter and CountFilter classes --- .../filters/AccessControlNameFilter.js | 19 ++++++++ src/composables/filters/CountFilter.js | 16 +++++++ src/composables/filters/PageFilter.js | 36 +++++++++++++++ .../filters/AccessControlNameFilter.test.js | 27 ++++++++++++ .../composables/filters/CountFilter.test.js | 41 +++++++++++++++++ .../composables/filters/PageFilter.test.js | 44 +++++++++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 src/composables/filters/AccessControlNameFilter.js create mode 100644 src/composables/filters/CountFilter.js create mode 100644 src/composables/filters/PageFilter.js create mode 100644 tests/unit/composables/filters/AccessControlNameFilter.test.js create mode 100644 tests/unit/composables/filters/CountFilter.test.js create mode 100644 tests/unit/composables/filters/PageFilter.test.js diff --git a/src/composables/filters/AccessControlNameFilter.js b/src/composables/filters/AccessControlNameFilter.js new file mode 100644 index 00000000..f416daf0 --- /dev/null +++ b/src/composables/filters/AccessControlNameFilter.js @@ -0,0 +1,19 @@ +import StringFilter from 'src/composables/filters/StringFilter'; + +/** + * Class representing an access control name filter. + * @augments StringFilter + */ +class AccessControlNameFilter extends StringFilter { + /** + * Default constructor. + * @param {string} type - The type of access control ('group' or 'role'). + */ + constructor(type) { + const value = ['group', 'role'].includes(type) ? 'parentName' : 'name'; + + super('name', value, 'name'); + } +} + +export default AccessControlNameFilter; diff --git a/src/composables/filters/CountFilter.js b/src/composables/filters/CountFilter.js new file mode 100644 index 00000000..0a50c4a4 --- /dev/null +++ b/src/composables/filters/CountFilter.js @@ -0,0 +1,16 @@ +import NumberFilter from 'src/composables/filters/NumberFilter'; + +/** + * Class representing a count filter. + * @augments NumberFilter + */ +class CountFilter extends NumberFilter { + /** + * Default constructor. + */ + constructor() { + super('count', 'count', 'size', 10); + } +} + +export default CountFilter; diff --git a/src/composables/filters/PageFilter.js b/src/composables/filters/PageFilter.js new file mode 100644 index 00000000..5b6d3e8e --- /dev/null +++ b/src/composables/filters/PageFilter.js @@ -0,0 +1,36 @@ +import NumberFilter from 'src/composables/filters/NumberFilter'; + +/** + * Class representing a page filter. + * @augments NumberFilter + */ +class PageFilter extends NumberFilter { + /** + * Default constructor. + */ + constructor() { + super('page', 'page', 'page', 0); + } + + /** + * Get the value of the filter, adjusted for page indexing. + * Pages are assumed to be 1-indexed and are converted to 0-indexed. + * @param {number} value - The value to format. + * @returns {number|null} The formatted value of the filter or null if invalid. + */ + getFilterValue(value) { + return value >= 1 ? value - 1 : null; + } + + /** + * Check if the value is the default value. + * A value of 0 or 1 is considered the default for pages. + * @param {number} value - The value to check. + * @returns {boolean} True if the value is the default value, false otherwise. + */ + isDefaultValue(value) { + return value <= 1; + } +} + +export default PageFilter; diff --git a/tests/unit/composables/filters/AccessControlNameFilter.test.js b/tests/unit/composables/filters/AccessControlNameFilter.test.js new file mode 100644 index 00000000..97b96d62 --- /dev/null +++ b/tests/unit/composables/filters/AccessControlNameFilter.test.js @@ -0,0 +1,27 @@ +import AccessControlNameFilter from 'src/composables/filters/AccessControlNameFilter'; + +describe('Test class: AccessControlNameFilter', () => { + describe('Test constructor', () => { + it('should create an instance of AccessControlNameFilter with parentName as serverName when type is group', () => { + const groupFilter = new AccessControlNameFilter('group'); + expect(groupFilter).toBeInstanceOf(AccessControlNameFilter); + expect(groupFilter.filterName).toBe('name'); + expect(groupFilter.serverName).toBe('parentName'); + expect(groupFilter.queryName).toBe('name'); + + const roleFilter = new AccessControlNameFilter('role'); + expect(roleFilter).toBeInstanceOf(AccessControlNameFilter); + expect(roleFilter.filterName).toBe('name'); + expect(roleFilter.serverName).toBe('parentName'); + expect(roleFilter.queryName).toBe('name'); + }); + + it('should create an instance of AccessControlNameFilter with name as serverName when type is not group or role', () => { + const otherFilter = new AccessControlNameFilter('other'); + expect(otherFilter).toBeInstanceOf(AccessControlNameFilter); + expect(otherFilter.filterName).toBe('name'); + expect(otherFilter.serverName).toBe('name'); + expect(otherFilter.queryName).toBe('name'); + }); + }); +}); diff --git a/tests/unit/composables/filters/CountFilter.test.js b/tests/unit/composables/filters/CountFilter.test.js new file mode 100644 index 00000000..c8226c79 --- /dev/null +++ b/tests/unit/composables/filters/CountFilter.test.js @@ -0,0 +1,41 @@ +import CountFilter from 'src/composables/filters/CountFilter'; + +describe('Test class: CountFilter', () => { + let countFilter; + + beforeEach(() => { + countFilter = new CountFilter(); + }); + + describe('Test constructor', () => { + it('should create an instance of CountFilter', () => { + expect(countFilter).toBeInstanceOf(CountFilter); + expect(countFilter.filterName).toBe('count'); + expect(countFilter.serverName).toBe('count'); + expect(countFilter.queryName).toBe('size'); + expect(countFilter.defaultValue).toBe(10); + }); + }); + + describe('Test function: getValueFromUrl', () => { + it('should return value if it is not the default', () => { + expect(countFilter.getFilterValue(5)).toBe(5); + expect(countFilter.getFilterValue(20)).toBe(20); + }); + + it('should return null if value is the default', () => { + expect(countFilter.getFilterValue(10)).toBe(null); + }); + }); + + describe('Test function: isDefaultValue', () => { + it('should return true for default value', () => { + expect(countFilter.isDefaultValue(10)).toBe(true); + }); + + it('should return false for non-default value', () => { + expect(countFilter.isDefaultValue(5)).toBe(false); + expect(countFilter.isDefaultValue(20)).toBe(false); + }); + }); +}); diff --git a/tests/unit/composables/filters/PageFilter.test.js b/tests/unit/composables/filters/PageFilter.test.js new file mode 100644 index 00000000..a92bee55 --- /dev/null +++ b/tests/unit/composables/filters/PageFilter.test.js @@ -0,0 +1,44 @@ +import PageFilter from 'src/composables/filters/PageFilter'; + +describe('Test class: PageFilter', () => { + let pageFilter; + + beforeEach(() => { + pageFilter = new PageFilter(); + }); + + describe('Test constructor', () => { + it('should create an instance of PageFilter', () => { + expect(pageFilter).toBeInstanceOf(PageFilter); + expect(pageFilter.filterName).toBe('page'); + expect(pageFilter.serverName).toBe('page'); + expect(pageFilter.queryName).toBe('page'); + expect(pageFilter.defaultValue).toBe(0); + }); + }); + + describe('Test function: getFilterValue', () => { + it('should convert 1-indexed page to 0-indexed', () => { + expect(pageFilter.getFilterValue(1)).toBe(0); + expect(pageFilter.getFilterValue(2)).toBe(1); + expect(pageFilter.getFilterValue(5)).toBe(4); + }); + + it('should return null for invalid page numbers', () => { + expect(pageFilter.getFilterValue(0)).toBe(null); + expect(pageFilter.getFilterValue(-1)).toBe(null); + }); + }); + + describe('Test function: isDefaultValue', () => { + it('should return true for default values', () => { + expect(pageFilter.isDefaultValue(0)).toBe(true); + expect(pageFilter.isDefaultValue(1)).toBe(true); + }); + + it('should return false for non-default values', () => { + expect(pageFilter.isDefaultValue(2)).toBe(false); + expect(pageFilter.isDefaultValue(5)).toBe(false); + }); + }); +}); From 25ceef5777b1a721897c3c98f4598a99b7da7093 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:06:37 +0200 Subject: [PATCH 04/20] Add rule in eslintrc about use-this in class methods --- .eslintrc.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 2407af24..b3e4620f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -80,6 +80,7 @@ module.exports = { 'vue/singleline-html-element-content-newline': ['error', { 'ignoreWhenNoAttributes': false, }], - 'jsdoc/no-undefined-types': 'off' + 'jsdoc/no-undefined-types': 'off', + 'class-methods-use-this': 'off' } } From 991d071c790e120d6fee485b744a7e2a2adcb22a Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:05:53 +0200 Subject: [PATCH 05/20] Create AccessControlFilters and UserFilters to avoid duplication --- src/composables/filters/AccessControlFilters.js | 16 ++++++++++++++++ src/composables/filters/UserFilters.js | 11 +++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/composables/filters/AccessControlFilters.js create mode 100644 src/composables/filters/UserFilters.js diff --git a/src/composables/filters/AccessControlFilters.js b/src/composables/filters/AccessControlFilters.js new file mode 100644 index 00000000..be608b6b --- /dev/null +++ b/src/composables/filters/AccessControlFilters.js @@ -0,0 +1,16 @@ +import AccessControlNameFilter from 'src/composables/filters/AccessControlNameFilter'; +import PageFilter from 'src/composables/filters/PageFilter'; +import CountFilter from 'src/composables/filters/CountFilter'; + +/** + * Create an array of access control filters. + * @param {string} type - The type of access control ('group' or 'role'). + * @returns {Array} An array of filter instances for access control. + */ +export default function accessControlFilters(type = '') { + return [ + new PageFilter(), + new CountFilter(), + new AccessControlNameFilter(type), + ]; +} diff --git a/src/composables/filters/UserFilters.js b/src/composables/filters/UserFilters.js new file mode 100644 index 00000000..19303b18 --- /dev/null +++ b/src/composables/filters/UserFilters.js @@ -0,0 +1,11 @@ +import StringFilter from 'src/composables/filters/StringFilter'; +import PageFilter from 'src/composables/filters/PageFilter'; +import CountFilter from 'src/composables/filters/CountFilter'; + +export default [ + new PageFilter(), + new CountFilter(), + new StringFilter('name', 'name', 'name'), + new StringFilter('login', 'login', 'login'), + new StringFilter('email', 'email', 'email'), +]; From 81b9a0fa6331737dc79bf2d7e8fd1001d414f80e Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:00:10 +0200 Subject: [PATCH 06/20] Create ServerSideFilter composable --- src/composables/ServerSideFilter.js | 77 ++++++++ .../unit/composables/ServerSideFilter.test.js | 187 ++++++++++++++++++ 2 files changed, 264 insertions(+) create mode 100644 src/composables/ServerSideFilter.js create mode 100644 tests/unit/composables/ServerSideFilter.test.js diff --git a/src/composables/ServerSideFilter.js b/src/composables/ServerSideFilter.js new file mode 100644 index 00000000..3e0403d9 --- /dev/null +++ b/src/composables/ServerSideFilter.js @@ -0,0 +1,77 @@ +import { + ref, +} from 'vue'; + +/** + * Composable that provides all values for server side filter and pagination. + * @param {Array} filterDefinition - Array containing filter object definition. + * @returns {object} Object containing filters value and related methods. + */ +export function useServerSideFilter(filterDefinition) { + const filterOptions = {}; + + const filters = ref(filterDefinition.reduce((acc, value) => { + filterOptions[value.filterName] = value; + + acc[value.filterName] = value.defaultValue; + + return acc; + }, {})); + + /** + * Create API filters. + * @returns {object} Object that contains filters. + */ + function getFilters() { + return Object.keys(filters.value).reduce((obj, key) => { + const value = filterOptions[key]?.getFilterValue(filters.value[key]); + + if (filters.value[key] && value) { + obj[filterOptions[key].serverName] = value.toString(); + } + + return obj; + }, {}); + } + + /** + * Init filters and pagination from query parameters in url. + * @param {object} query - URL query parameters object. + */ + function init(query = {}) { + Object.keys(filters.value).forEach((key) => { + const queryKey = filterOptions[key].queryName; + const value = filterOptions[key]?.getValueFromUrl(query[queryKey]); + + if (value) { + filters.value[key] = value; + } + }); + } + + /** + * Generate query parameters with filters value. + * @returns {object} Query parameters object. + */ + function generateQuery() { + const queryParameters = {}; + + Object.keys(filters.value).forEach((key) => { + const queryKey = filterOptions[key].queryName; + const isDefaultValue = filterOptions[key]?.isDefaultValue(filters.value[key]); + + if (!isDefaultValue) { + queryParameters[queryKey] = filters.value[key]; + } + }); + + return queryParameters; + } + + return { + filters, + init, + getFilters, + generateQuery, + }; +} diff --git a/tests/unit/composables/ServerSideFilter.test.js b/tests/unit/composables/ServerSideFilter.test.js new file mode 100644 index 00000000..646c1796 --- /dev/null +++ b/tests/unit/composables/ServerSideFilter.test.js @@ -0,0 +1,187 @@ +import { mount } from '@vue/test-utils'; +import { useI18n } from 'vue-i18n'; +import { vi } from 'vitest'; +import { useServerSideFilter } from 'src/composables/ServerSideFilter'; + +vi.mock('vue-i18n'); + +describe('Test: ServerSideFilter', () => { + let wrapper; + + useI18n.mockImplementation(() => ({ + t: (v) => v, + })); + + beforeEach(() => { + wrapper = mount({ + template: '
', + setup() { + return useServerSideFilter([ + { + filterName: 'name', + queryName: 'name', + serverName: 'name', + defaultValue: '', + getFilterValue: (value) => `lk_*${value}*`, + getValueFromUrl: (value) => value, + isDefaultValue: (value) => value?.length === 0 || !value, + }, + { + filterName: 'page', + queryName: 'page', + serverName: 'page', + defaultValue: 0, + getFilterValue: (value) => (value >= 1 ? value - 1 : null), + getValueFromUrl: (value) => parseInt(value, 10) || 0, + isDefaultValue: (value) => value <= 1, + }, + { + filterName: 'count', + queryName: 'size', + serverName: 'count', + defaultValue: 10, + getFilterValue: (value) => (value !== 10 ? value : null), + getValueFromUrl: (value) => parseInt(value, 10) || 10, + isDefaultValue: (value) => value === 10, + }, + ]); + }, + }); + }); + + describe('Test function: getFilters', () => { + it('should return object with no filters', () => { + wrapper.vm.filters = { + count: 10, + page: 0, + name: '', + }; + + expect(wrapper.vm.getFilters()).toEqual({}); + }); + + it('should return object with name filter', () => { + wrapper.vm.filters = { + count: 10, + page: 0, + name: 'test', + }; + + expect(wrapper.vm.getFilters()).toEqual({ name: 'lk_*test*' }); + }); + + it('should return object with page filter', () => { + wrapper.vm.filters = { + count: 10, + page: 2, + name: '', + }; + + expect(wrapper.vm.getFilters()).toEqual({ page: '1' }); + }); + + it('should return object with count filter', () => { + wrapper.vm.filters = { + count: 5, + page: 0, + name: '', + }; + + expect(wrapper.vm.getFilters()).toEqual({ count: '5' }); + }); + + it('should return object with all filters', () => { + wrapper.vm.filters = { + count: 5, + page: 2, + name: 'userName', + }; + + expect(wrapper.vm.getFilters()).toEqual({ + count: '5', + page: '1', + name: 'lk_*userName*', + }); + }); + }); + + describe('Test function: init', () => { + it('should update filters correctly', () => { + wrapper.vm.filters = { + count: 10, + page: 1, + name: 'userName', + }; + + wrapper.vm.init({ size: '5', page: '2', name: 'newName' }); + + expect(wrapper.vm.filters).toEqual({ + count: 5, + page: 2, + name: 'newName', + }); + }); + + it('should not update filters if query is an empty object', () => { + wrapper.vm.filters = { + count: 10, + page: 1, + name: 'userName', + }; + + wrapper.vm.init({}); + + expect(wrapper.vm.filters).toEqual({ + count: 10, + page: 1, + name: 'userName', + }); + }); + + it('should not update filters if query is undefined', () => { + wrapper.vm.filters = { + count: 10, + page: 1, + name: 'userName', + }; + + wrapper.vm.init(); + + expect(wrapper.vm.filters).toEqual({ + count: 10, + page: 1, + name: 'userName', + }); + }); + }); + + describe('Test function: generateQuery', () => { + it('should return an empty query when filters are set to their default values', () => { + wrapper.vm.filters = { + count: 10, + page: 1, + name: '', + }; + + const queryParameters = wrapper.vm.generateQuery(); + + expect(queryParameters).toEqual({}); + }); + + it('should return a query object when filters are not set to their default values', () => { + wrapper.vm.filters = { + count: 5, + page: 2, + name: 'userName', + }; + + const queryParameters = wrapper.vm.generateQuery({}); + + expect(queryParameters).toEqual({ + size: 5, + page: 2, + name: 'userName', + }); + }); + }); +}); From 4305297a4df5b2cba48e27af24e0d1aa274bf607 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Fri, 26 Apr 2024 10:14:58 +0200 Subject: [PATCH 07/20] Use serverSideFilter in AccessControlTabPanel --- .../tab-panel/AccessControlTabPanel.vue | 90 ++++++++----------- .../tab-panel/AccessControlTabPanel.test.js | 63 ++----------- 2 files changed, 44 insertions(+), 109 deletions(-) diff --git a/src/components/tab-panel/AccessControlTabPanel.vue b/src/components/tab-panel/AccessControlTabPanel.vue index b7211828..289ecad9 100644 --- a/src/components/tab-panel/AccessControlTabPanel.vue +++ b/src/components/tab-panel/AccessControlTabPanel.vue @@ -34,10 +34,10 @@ @click="openAttachDialog" /> (props.type === 'role' ? 'Role' : 'Group')); +let reloadGroupsEventRef; +let reloadRolesEventRef; + /** * Open dialog to attach a role or group to an entity depending on props sub type. * @returns {void} Nothing. @@ -152,36 +163,36 @@ function openDetachDialog(accessControlToDetach) { /** * Load groups and invoke the appropriate method from GroupService based on the entity value. - * @param {object} filters - API filters. + * @param {object} apiFilters - API filters. * @returns {object} Object that contains group filters. */ -async function loadGroups(filters) { +async function loadGroups(apiFilters) { if (props.subType === 'role') { - return GroupService.findByRoleId(props.entity.id, filters); + return GroupService.findByRoleId(props.entity.id, apiFilters); } if (props.subType === 'user') { - return GroupService.findByLogin(props.entity.login, filters); + return GroupService.findByLogin(props.entity.login, apiFilters); } - return GroupService.findSubGroups(props.entity.id, filters); + return GroupService.findSubGroups(props.entity.id, apiFilters); } /** * Load roles and invoke the appropriate method from RoleService based on the entity value. - * @param {object} filters - API filters. + * @param {object} apiFilters - API filters. * @returns {object} Object that contains role filters. */ -async function loadRoles(filters) { +async function loadRoles(apiFilters) { if (props.subType === 'role') { - return RoleService.findSubRoles(props.entity.id, filters); + return RoleService.findSubRoles(props.entity.id, apiFilters); } if (props.subType === 'user') { - return RoleService.findByLogin(props.entity.login, filters); + return RoleService.findByLogin(props.entity.login, apiFilters); } - return RoleService.findByGroupId(props.entity.id, filters); + return RoleService.findByGroupId(props.entity.id, apiFilters); } /** @@ -195,33 +206,6 @@ function checkEntity() { return !!props.entity.id; } -/** - * Create API filters from component ref. - * @returns {object} Object that contains group filters. - */ -function getFilters() { - const filters = {}; - const types = ['group', 'role']; - - if (name.value?.length > 0 && types.includes(props.subType)) { - filters.parentName = `lk_*${name.value}*`; - } - - if (name.value?.length > 0 && !types.includes(props.subType)) { - filters.name = `lk_*${name.value}*`; - } - - if (currentPage.value >= 1) { - filters.page = `${currentPage.value - 1}`; - } - - if (elementsPerPage.value !== 10) { - filters.count = `${elementsPerPage.value}`; - } - - return filters; -} - /** * Search and display access controls. * @returns {Promise} Promise with nothing on success. @@ -237,14 +221,15 @@ async function search() { return promise(getFilters()).then((data) => { rows.value = data.content; - currentPage.value = data.pageable.pageNumber + 1; + filters.value.page = data.pageable.pageNumber + 1; maxPage.value = data.totalPages; - elementsPerPage.value = data.size; + filters.value.count = data.size; totalElements.value = data.totalElements; return Promise.resolve(); }).finally(() => { loading.value = false; + emits('update:access-control-query', generateQuery()); }); } @@ -253,6 +238,7 @@ watch(() => props.entity, async () => { }); onMounted(async () => { + init(route.query); reloadGroupsEventRef = ReloadGroupsEvent.subscribe(search); reloadRolesEventRef = ReloadRolesEvent.subscribe(search); await search(); diff --git a/tests/unit/components/tab-panel/AccessControlTabPanel.test.js b/tests/unit/components/tab-panel/AccessControlTabPanel.test.js index e1a11016..68508752 100644 --- a/tests/unit/components/tab-panel/AccessControlTabPanel.test.js +++ b/tests/unit/components/tab-panel/AccessControlTabPanel.test.js @@ -5,12 +5,14 @@ import * as GroupService from 'src/services/GroupService'; import * as RoleService from 'src/services/RoleService'; import { vi } from 'vitest'; import { Notify } from 'quasar'; +import { useRoute } from 'vue-router'; import DialogEvent from 'src/composables/events/DialogEvent'; installQuasarPlugin({ plugins: [Notify], }); +vi.mock('vue-router'); vi.mock('src/services/GroupService'); vi.mock('src/services/RoleService'); vi.mock('src/composables/events/DialogEvent'); @@ -37,6 +39,10 @@ describe('Test component: AccessControlTabPanel', async () => { RoleService.findByGroupId.mockImplementation(() => Promise.resolve(data)); RoleService.findSubRoles.mockImplementation(() => Promise.resolve(data)); + useRoute.mockImplementation(() => ({ + query: {}, + })); + wrapper = shallowMount(AccessControlTabPanel, { props: { entity: { @@ -376,63 +382,6 @@ describe('Test component: AccessControlTabPanel', async () => { }); }); - describe('Test function: getFilters', () => { - it('should return empty filters', () => { - wrapper.vm.name = ''; - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({}); - }); - - it('should return filters adapted for Role', async () => { - await wrapper.setProps({ subType: 'role' }); - wrapper.vm.name = 'test'; - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 5; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({ - parentName: 'lk_*test*', - page: '0', - count: '5', - }); - }); - - it('should return filters adapted for Group', async () => { - await wrapper.setProps({ subType: 'group' }); - wrapper.vm.name = 'test'; - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 5; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({ - parentName: 'lk_*test*', - page: '0', - count: '5', - }); - }); - - it('should return filters adapted for not Role', async () => { - await wrapper.setProps({ subType: 'user' }); - wrapper.vm.name = 'test'; - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 5; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({ - name: 'lk_*test*', - page: '0', - count: '5', - }); - }); - }); - describe('Test function: search', () => { it('should set rows', async () => { await wrapper.vm.search(); From 004a90f13be163ab3faeb6e65210fc73d98f5218 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Fri, 26 Apr 2024 10:15:13 +0200 Subject: [PATCH 08/20] Use serverSideFilter in PermissionsTabPanel --- .../tab-panel/PermissionsTabPanel.vue | 84 ++++++++----------- .../tab-panel/PermissionsTabPanel.test.js | 38 ++------- 2 files changed, 43 insertions(+), 79 deletions(-) diff --git a/src/components/tab-panel/PermissionsTabPanel.vue b/src/components/tab-panel/PermissionsTabPanel.vue index d8b37429..ed01870c 100644 --- a/src/components/tab-panel/PermissionsTabPanel.vue +++ b/src/components/tab-panel/PermissionsTabPanel.vue @@ -34,12 +34,12 @@ @click="openAttachDialog" /> !props.isSuperAdmin && props.type === 'role'); +const { + filters, + init, + getFilters, + generateQuery, +} = useServerSideFilter([ + new PageFilter(), + new CountFilter(), + new Filter('entity', 'entity', 'entity', ''), + new StringFilter('action', 'action', 'action'), + new StringFilter('libraryId', 'libraryId', 'libraryId'), +]); let reloadPermissionsEventRef; @@ -126,49 +144,19 @@ function openDetachDialog(permission) { /** * Load permissions and invoke the appropriate method from PermissionService. - * @param {object} filters - API filters. + * @param {object} apiFilters - API filters. * @returns {object} Object that contains role filters. */ -async function loadPermissions(filters) { +async function loadPermissions(apiFilters) { if (props.type === 'role') { - return PermissionService.findByRoleId(props.entity.id, filters); + return PermissionService.findByRoleId(props.entity.id, apiFilters); } if (props.type === 'user') { - return PermissionService.findByLogin(props.entity.login, filters); - } - - return PermissionService.findByGroupId(props.entity.id, filters); -} - -/** - * Create API filters from component ref. - * @returns {object} Object that contains user filters. - */ -function getFilters() { - const filters = {}; - - if (entityName.value?.length > 0) { - filters.entity = entityName.value; - } - - if (actionName.value?.length > 0) { - filters.action = actionName.value; - } - - if (libraryId.value?.length > 0) { - filters.libraryId = libraryId.value; - } - - if (currentPage.value >= 1) { - filters.page = `${currentPage.value - 1}`; - } - - if (elementsPerPage.value !== 10) { - filters.count = `${elementsPerPage.value}`; + return PermissionService.findByLogin(props.entity.login, apiFilters); } - return filters; + return PermissionService.findByGroupId(props.entity.id, apiFilters); } /** @@ -195,14 +183,15 @@ async function search() { return loadPermissions(getFilters()).then((data) => { permissions.value = data.content; - currentPage.value = data.pageable.pageNumber + 1; + filters.value.page = data.pageable.pageNumber + 1; maxPage.value = data.totalPages; - elementsPerPage.value = data.size; + filters.value.count = data.size; totalElements.value = data.totalElements; return Promise.resolve(); }).finally(() => { loading.value = false; + emits('update:permissions-query', generateQuery()); }); } @@ -211,6 +200,7 @@ watch(() => props.entity, async () => { }); onMounted(async () => { + init(route.query); reloadPermissionsEventRef = ReloadPermissionsEvent.subscribe(search); await search(); }); diff --git a/tests/unit/components/tab-panel/PermissionsTabPanel.test.js b/tests/unit/components/tab-panel/PermissionsTabPanel.test.js index 5ffd9547..81fa9b7f 100644 --- a/tests/unit/components/tab-panel/PermissionsTabPanel.test.js +++ b/tests/unit/components/tab-panel/PermissionsTabPanel.test.js @@ -5,12 +5,14 @@ import * as PermissionService from 'src/services/PermissionService'; import ReloadPermissionsEvent from 'src/composables/events/ReloadPermissionsEvent'; import { vi } from 'vitest'; import { Notify } from 'quasar'; +import { useRoute } from 'vue-router'; import DialogEvent from 'src/composables/events/DialogEvent'; installQuasarPlugin({ plugins: [Notify], }); +vi.mock('vue-router'); vi.mock('src/services/PermissionService'); vi.mock('src/composables/events/ReloadPermissionsEvent'); vi.mock('src/composables/events/DialogEvent'); @@ -44,6 +46,10 @@ describe('Test component: PermissionsTabPanel', async () => { PermissionService.findByLogin.mockImplementation(() => Promise.resolve(data)); PermissionService.findByGroupId.mockImplementation(() => Promise.resolve(data)); + useRoute.mockImplementation(() => ({ + query: {}, + })); + wrapper = shallowMount(PermissionsTabPanel, { props: { isSuperAdmin: false, @@ -141,38 +147,6 @@ describe('Test component: PermissionsTabPanel', async () => { }); }); - describe('Test function: getFilters', () => { - it('should return empty filters', () => { - wrapper.vm.entityName = ''; - wrapper.vm.actionName = ''; - wrapper.vm.libraryId = ''; - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({}); - }); - - it('should return filters object', async () => { - wrapper.vm.entityName = 'entity'; - wrapper.vm.actionName = 'action'; - wrapper.vm.libraryId = 'libraryId'; - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 5; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({ - entity: 'entity', - action: 'action', - libraryId: 'libraryId', - page: '0', - count: '5', - }); - }); - }); - describe('Test function: checkEntity', () => { it('should return true on valid user entity', async () => { await wrapper.setProps({ type: 'user', entity: { login: 'test' } }); From 79818bfcf9116fbbdd0859b71fdf8dc31da81e6f Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Fri, 26 Apr 2024 10:15:24 +0200 Subject: [PATCH 09/20] Use serverSideFilter in UsersTabPanel --- src/components/tab-panel/UsersTabPanel.vue | 74 +++++++------------ .../tab-panel/UsersTabPanel.test.js | 38 ++-------- 2 files changed, 34 insertions(+), 78 deletions(-) diff --git a/src/components/tab-panel/UsersTabPanel.vue b/src/components/tab-panel/UsersTabPanel.vue index 32df2ff8..14a7dc1b 100644 --- a/src/components/tab-panel/UsersTabPanel.vue +++ b/src/components/tab-panel/UsersTabPanel.vue @@ -20,12 +20,12 @@ @click="openAttachDialog" /> 0) { - filters.name = `lk_*${userName.value}*`; - } - - if (userLogin.value?.length > 0) { - filters.login = `lk_*${userLogin.value}*`; - } - - if (userEmail.value?.length > 0) { - filters.email = `lk_*${userEmail.value}*`; - } - - if (currentPage.value >= 1) { - filters.page = `${currentPage.value - 1}`; - } - - if (elementsPerPage.value !== 10) { - filters.count = `${elementsPerPage.value}`; + return UserService.findByRoleId(props.entity.id, apiFilters); } - return filters; + return UserService.findByGroupId(props.entity.id, apiFilters); } /** @@ -171,14 +151,15 @@ async function search() { return loadUsers(getFilters()).then((data) => { users.value = data.content; - currentPage.value = data.pageable.pageNumber + 1; + filters.value.page = data.pageable.pageNumber + 1; maxPage.value = data.totalPages; - elementsPerPage.value = data.size; + filters.value.count = data.size; totalElements.value = data.totalElements; return Promise.resolve(); }).finally(() => { loading.value = false; + emits('update:users-query', generateQuery()); }); } @@ -187,6 +168,7 @@ watch(() => props.entity, async () => { }); onMounted(async () => { + init(route.query); reloadUsersEventRef = ReloadUsersEvent.subscribe(search); await search(); }); diff --git a/tests/unit/components/tab-panel/UsersTabPanel.test.js b/tests/unit/components/tab-panel/UsersTabPanel.test.js index b6c19a30..4521d235 100644 --- a/tests/unit/components/tab-panel/UsersTabPanel.test.js +++ b/tests/unit/components/tab-panel/UsersTabPanel.test.js @@ -4,12 +4,14 @@ import UsersTabPanel from 'src/components/tab-panel/UsersTabPanel.vue'; import * as UserService from 'src/services/UserService'; import { vi } from 'vitest'; import { Notify } from 'quasar'; +import { useRoute } from 'vue-router'; import DialogEvent from 'src/composables/events/DialogEvent'; installQuasarPlugin({ plugins: [Notify], }); +vi.mock('vue-router'); vi.mock('src/services/UserService'); vi.mock('src/composables/events/DialogEvent'); @@ -31,6 +33,10 @@ describe('Test component: UsersTabPanel', async () => { UserService.findByRoleId.mockImplementation(() => Promise.resolve(data)); UserService.findByGroupId.mockImplementation(() => Promise.resolve(data)); + useRoute.mockImplementation(() => ({ + query: {}, + })); + wrapper = shallowMount(UsersTabPanel, { props: { entity: { @@ -126,38 +132,6 @@ describe('Test component: UsersTabPanel', async () => { }); }); - describe('Test function: getFilters', () => { - it('should return empty filters', () => { - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({}); - }); - - it('should return filters object', async () => { - wrapper.vm.userName = 'test'; - wrapper.vm.userLogin = 'login'; - wrapper.vm.userEmail = 'email'; - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 5; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({ - name: 'lk_*test*', - login: 'lk_*login*', - email: 'lk_*email*', - page: '0', - count: '5', - }); - }); - }); - describe('Test function: search', () => { it('should set users', async () => { await wrapper.vm.search(); From 217eed66a2d087f3b6f18272488f5b9133fa38a1 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 15:58:10 +0200 Subject: [PATCH 10/20] Use serverSideFilter in AttachAccessControl Dialog --- .../AttachAccessControlToAnotherDialog.vue | 41 +++++-------------- ...AttachAccessControlToAnotherDialog.test.js | 26 ------------ 2 files changed, 11 insertions(+), 56 deletions(-) diff --git a/src/components/dialog/AttachAccessControlToAnotherDialog.vue b/src/components/dialog/AttachAccessControlToAnotherDialog.vue index 8e8b5b0d..1582813c 100644 --- a/src/components/dialog/AttachAccessControlToAnotherDialog.vue +++ b/src/components/dialog/AttachAccessControlToAnotherDialog.vue @@ -10,10 +10,10 @@ { @@ -88,6 +87,10 @@ const translationKey = computed(() => { return targetAccessControlType.value === 'role' ? 'AttachGroupToRole' : 'AttachGroupToGroup'; }); +const { + filters, + getFilters, +} = useServerSideFilter(accessControlFilters()); /** * Get ID of role SUPER_ADMINISTRATOR. @@ -100,28 +103,6 @@ async function getSuperAdministratorId() { }); } -/** - * Create API filters from component ref. - * @returns {object} Object that contains role filters. - */ -function getFilters() { - const filters = {}; - - if (nameFilter.value?.length > 0) { - filters.name = `lk_*${nameFilter.value}*`; - } - - if (currentPage.value >= 1) { - filters.page = `${currentPage.value - 1}`; - } - - if (elementsPerPage.value !== 10) { - filters.count = `${elementsPerPage.value}`; - } - - return filters; -} - /** * Load groups and invoke the appropriate method from GroupService based on the target. * @returns {object} Object that contains group filters. @@ -164,9 +145,9 @@ async function search() { return promise().then((data) => { rows.value = data.content; - currentPage.value = data.pageable.pageNumber + 1; + filters.value.page = data.pageable.pageNumber + 1; maxPage.value = data.totalPages; - elementsPerPage.value = data.size; + filters.value.count = data.size; totalElements.value = data.totalElements; }); } diff --git a/tests/unit/components/dialog/AttachAccessControlToAnotherDialog.test.js b/tests/unit/components/dialog/AttachAccessControlToAnotherDialog.test.js index 3c89943b..9c0b0ae3 100644 --- a/tests/unit/components/dialog/AttachAccessControlToAnotherDialog.test.js +++ b/tests/unit/components/dialog/AttachAccessControlToAnotherDialog.test.js @@ -101,32 +101,6 @@ describe('Test component: AttachAccessControlToAnotherDialog', () => { }); }); - describe('Test function: getFilters', () => { - it('should return empty filters', () => { - wrapper.vm.nameFilter = ''; - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({}); - }); - - it('should return filters', async () => { - wrapper.vm.nameFilter = 'test'; - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 5; - - const result = wrapper.vm.getFilters(); - - expect(result).toEqual({ - name: 'lk_*test*', - page: '0', - count: '5', - }); - }); - }); - describe('Test function: loadGroups', () => { afterEach(() => { vi.clearAllMocks(); From bd5cfc62f21e2b9bb5f4b9cad004bcf66d61b3c4 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:00:02 +0200 Subject: [PATCH 11/20] Use serverSideFilter in AttachUserToGroup Dialog --- .../dialog/AttachUserToGroupDialog.vue | 55 ++++--------- .../dialog/AttachUserToGroupDialog.test.js | 78 ------------------- 2 files changed, 13 insertions(+), 120 deletions(-) diff --git a/src/components/dialog/AttachUserToGroupDialog.vue b/src/components/dialog/AttachUserToGroupDialog.vue index 6226246a..16ce5a7f 100644 --- a/src/components/dialog/AttachUserToGroupDialog.vue +++ b/src/components/dialog/AttachUserToGroupDialog.vue @@ -20,12 +20,12 @@ 0) { - filters.name = `lk_*${userName.value}*`; - } - - if (userLogin.value?.length > 0) { - filters.login = `lk_*${userLogin.value}*`; - } - - if (userEmail.value?.length > 0) { - filters.email = `lk_*${userEmail.value}*`; - } - - if (currentPage.value >= 1) { - filters.page = `${currentPage.value - 1}`; - } - - if (elementsPerPage.value !== 10) { - filters.count = `${elementsPerPage.value}`; - } - - return filters; -} +const { + filters, + getFilters, +} = useServerSideFilter(userFilters); /** * Get users. @@ -126,9 +97,9 @@ function getFilters() { async function search() { return UserService.find(getFilters()).then((data) => { users.value = data.content; - currentPage.value = data.pageable.pageNumber + 1; + filters.value.page = data.pageable.pageNumber + 1; maxPage.value = data.totalPages; - elementsPerPage.value = data.size; + filters.value.count = data.size; totalElements.value = data.totalElements; }); } diff --git a/tests/unit/components/dialog/AttachUserToGroupDialog.test.js b/tests/unit/components/dialog/AttachUserToGroupDialog.test.js index b7b75e5d..4181455a 100644 --- a/tests/unit/components/dialog/AttachUserToGroupDialog.test.js +++ b/tests/unit/components/dialog/AttachUserToGroupDialog.test.js @@ -43,84 +43,6 @@ describe('Test component: AttachUserToGroupDialog', () => { wrapper = mount(AttachUserToGroupDialog); }); - describe('Test function: getFilters', () => { - it('should return object with no filters', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - - expect({}).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with name filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = 'test'; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - - expect({ name: 'lk_*test*' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with login filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = 'test'; - wrapper.vm.userEmail = ''; - - expect({ login: 'lk_*test*' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with email filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = 'test'; - - expect({ email: 'lk_*test*' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with page filter', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - - expect({ page: '1' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with count filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 5; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - - expect({ count: '5' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with all filters', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 5; - wrapper.vm.userName = 'userName'; - wrapper.vm.userLogin = 'userLogin'; - wrapper.vm.userEmail = 'userEmail'; - - expect({ - count: '5', - page: '1', - name: 'lk_*userName*', - login: 'lk_*userLogin*', - email: 'lk_*userEmail*', - }).toEqual(wrapper.vm.getFilters()); - }); - }); - describe('Test function: search', () => { it('should set users', async () => { wrapper.vm.users = []; From e0f6c88da17a85bb0e9569f51b66ca854f21caaf Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:27:29 +0200 Subject: [PATCH 12/20] Use serverSideFilter in GroupsPage --- src/pages/GroupsPage.vue | 78 ++++----------- tests/unit/pages/GroupsPage.test.js | 143 ---------------------------- 2 files changed, 16 insertions(+), 205 deletions(-) diff --git a/src/pages/GroupsPage.vue b/src/pages/GroupsPage.vue index 36b17c63..fdf1b87b 100644 --- a/src/pages/GroupsPage.vue +++ b/src/pages/GroupsPage.vue @@ -19,10 +19,10 @@ />
0 ? `?${query}` : ''; - if (elementsPerPage.value !== 10) { - queryParameters.push(`size=${elementsPerPage.value}`); - } - - if (currentPage.value !== 1) { - queryParameters.push(`page=${currentPage.value}`); - } - - if (groupName.value?.length > 0) { - queryParameters.push(`name=${groupName.value}`); - } - - router.push(queryParameters.length > 0 ? `/groups?${queryParameters.join('&')}` : '/groups'); -} - -/** - * Create API filters from component ref. - * @returns {object} Object that contains role filters. - */ -function getFilters() { - const filters = {}; - - if (groupName.value?.length > 0) { - filters.name = `lk_*${groupName.value}*`; - } - - if (currentPage.value >= 1) { - filters.page = `${currentPage.value - 1}`; - } - - if (elementsPerPage.value !== 10) { - filters.count = `${elementsPerPage.value}`; - } - - return filters; + router.push(`/groups${querySuffix}`); } /** @@ -134,9 +106,9 @@ async function search() { return GroupService.find(getFilters()).then((data) => { groups.value = data.content; - currentPage.value = data.pageable.pageNumber + 1; + filters.value.page = data.pageable.pageNumber + 1; maxPage.value = data.totalPages; - elementsPerPage.value = data.size; + filters.value.count = data.size; totalElements.value = data.totalElements; return Promise.resolve(); @@ -145,24 +117,6 @@ async function search() { }); } -/** - * Init filters and pagination from query parameters in url. - * @param {object} query - URL query parameters. - */ -function init(query) { - if (query.size) { - elementsPerPage.value = parseInt(query.size, 10) || 10; - } - - if (query.page) { - currentPage.value = parseInt(query.page, 10) || 0; - } - - if (query.name) { - groupName.value = query.name; - } -} - onMounted(async () => { init(route.query); reloadGroupsEventRef = ReloadGroupsEvent.subscribe(search); diff --git a/tests/unit/pages/GroupsPage.test.js b/tests/unit/pages/GroupsPage.test.js index 875d84f3..85a3e19e 100644 --- a/tests/unit/pages/GroupsPage.test.js +++ b/tests/unit/pages/GroupsPage.test.js @@ -83,149 +83,6 @@ describe('Test component: GroupsPage', () => { }); }); - describe('Test function: updateRoute', () => { - it('should push routes without filters', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.groupName = ''; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/groups'); - }); - - it('should push routes with size filter', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 11; - wrapper.vm.groupName = ''; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/groups?size=11'); - }); - - it('should push routes with current page filter', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.groupName = ''; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/groups?page=2'); - }); - - it('should push routes with group name filter', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.groupName = 'test'; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/groups?name=test'); - }); - - it('should push routes with all filters', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 11; - wrapper.vm.groupName = 'test'; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/groups?size=11&page=2&name=test'); - }); - }); - - describe('Test function: init', () => { - it('should not change value without query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.groupName = 'test'; - - wrapper.vm.init({}); - - expect(wrapper.vm.elementsPerPage).toEqual(100); - expect(wrapper.vm.currentPage).toEqual(200); - expect(wrapper.vm.groupName).toEqual('test'); - }); - - it('should set default value with bad query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.groupName = 'test'; - - wrapper.vm.init({ - size: 'a', - page: 'b', - }); - - expect(wrapper.vm.elementsPerPage).toEqual(10); - expect(wrapper.vm.currentPage).toEqual(0); - expect(wrapper.vm.groupName).toEqual('test'); - }); - - it('should set value from query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.groupName = 'test'; - - wrapper.vm.init({ - size: '2', - page: '1', - name: 'test2', - }); - - expect(wrapper.vm.elementsPerPage).toEqual(2); - expect(wrapper.vm.currentPage).toEqual(1); - expect(wrapper.vm.groupName).toEqual('test2'); - }); - }); - - describe('Test function: getFilters', () => { - it('should return object with no filters', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.groupName = ''; - - expect({}).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with name filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.groupName = 'test'; - - expect({ name: 'lk_*test*' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with page filter', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.groupName = ''; - - expect({ page: '1' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with count filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 5; - wrapper.vm.groupName = ''; - - expect({ count: '5' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with all filters', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 5; - wrapper.vm.groupName = 'test'; - - expect({ - count: '5', - page: '1', - name: 'lk_*test*', - }).toEqual(wrapper.vm.getFilters()); - }); - }); - describe('Test hook function: onMounted', () => { it('should subscribe DialogEvent', () => { expect(subscribe).toHaveBeenCalledTimes(1); From e7ca1ac219e1905f543a5cb448eff452aecb6852 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:28:01 +0200 Subject: [PATCH 13/20] Use serverSideFilter in RolesPage --- src/pages/RolesPage.vue | 79 ++++------------ tests/unit/pages/RolesPage.test.js | 143 ----------------------------- 2 files changed, 17 insertions(+), 205 deletions(-) diff --git a/src/pages/RolesPage.vue b/src/pages/RolesPage.vue index 15c8dbae..48b4d1a5 100644 --- a/src/pages/RolesPage.vue +++ b/src/pages/RolesPage.vue @@ -7,10 +7,10 @@ {{ $t('RolesPage.text.title') }} 0) { - queryParameters.push(`name=${roleName.value}`); - } - - router.push(queryParameters.length > 0 ? `/roles?${queryParameters.join('&')}` : '/roles'); -} - -/** - * Create API filters from component ref. - * @returns {object} Object that contains role filters. - */ -function getFilters() { - const filters = {}; + const query = new URLSearchParams(generateQuery()).toString(); + const querySuffix = query.length > 0 ? `?${query}` : ''; - if (roleName.value?.length > 0) { - filters.name = `lk_*${roleName.value}*`; - } - - if (currentPage.value >= 1) { - filters.page = `${currentPage.value - 1}`; - } - - if (elementsPerPage.value !== 10) { - filters.count = `${elementsPerPage.value}`; - } - - return filters; + router.push(`/roles${querySuffix}`); } /** @@ -117,9 +90,9 @@ async function search() { return RoleService.find(getFilters()).then((data) => { roles.value = data.content; - currentPage.value = data.pageable.pageNumber + 1; + filters.value.page = data.pageable.pageNumber + 1; maxPage.value = data.totalPages; - elementsPerPage.value = data.size; + filters.value.count = data.size; totalElements.value = data.totalElements; return Promise.resolve(); @@ -128,24 +101,6 @@ async function search() { }); } -/** - * Init filters and pagination from query parameters in url. - * @param {object} query - URL query parameters. - */ -function init(query) { - if (query.size) { - elementsPerPage.value = parseInt(query.size, 10) || 10; - } - - if (query.page) { - currentPage.value = parseInt(query.page, 10) || 0; - } - - if (query.name) { - roleName.value = query.name; - } -} - onMounted(async () => { init(route.query); reloadRolesEventRef = ReloadRolesEvent.subscribe(search); diff --git a/tests/unit/pages/RolesPage.test.js b/tests/unit/pages/RolesPage.test.js index 9baad54d..8b85ad69 100644 --- a/tests/unit/pages/RolesPage.test.js +++ b/tests/unit/pages/RolesPage.test.js @@ -94,147 +94,4 @@ describe('Test component: RolesPage', () => { expect(unsubscribe).toHaveBeenCalledTimes(1); }); }); - - describe('Test function: updateRoute', () => { - it('should push routes without filters', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.roleName = ''; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/roles'); - }); - - it('should push routes with size filter', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 11; - wrapper.vm.roleName = ''; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/roles?size=11'); - }); - - it('should push routes with current page filter', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.roleName = ''; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/roles?page=2'); - }); - - it('should push routes with role name filter', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.roleName = 'test'; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/roles?name=test'); - }); - - it('should push routes with all filters', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 11; - wrapper.vm.roleName = 'test'; - - wrapper.vm.updateRoute(); - - expect(push).toBeCalledWith('/roles?size=11&page=2&name=test'); - }); - }); - - describe('Test function: init', () => { - it('should not change value without query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.roleName = 'test'; - - wrapper.vm.init({}); - - expect(wrapper.vm.elementsPerPage).toEqual(100); - expect(wrapper.vm.currentPage).toEqual(200); - expect(wrapper.vm.roleName).toEqual('test'); - }); - - it('should set default value with bad query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.roleName = 'test'; - - wrapper.vm.init({ - size: 'a', - page: 'b', - }); - - expect(wrapper.vm.elementsPerPage).toEqual(10); - expect(wrapper.vm.currentPage).toEqual(0); - expect(wrapper.vm.roleName).toEqual('test'); - }); - - it('should set value from query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.roleName = 'test'; - - wrapper.vm.init({ - size: '2', - page: '1', - name: 'test2', - }); - - expect(wrapper.vm.elementsPerPage).toEqual(2); - expect(wrapper.vm.currentPage).toEqual(1); - expect(wrapper.vm.roleName).toEqual('test2'); - }); - }); - - describe('Test function: getFilters', () => { - it('should return object with no filters', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.roleName = ''; - - expect({}).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with name filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.roleName = 'test'; - - expect({ name: 'lk_*test*' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with page filter', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.roleName = ''; - - expect({ page: '1' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with count filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 5; - wrapper.vm.roleName = ''; - - expect({ count: '5' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with all filters', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 5; - wrapper.vm.roleName = 'test'; - - expect({ - count: '5', - page: '1', - name: 'lk_*test*', - }).toEqual(wrapper.vm.getFilters()); - }); - }); }); From da4a267e630cb7ed105555552eb1d381e3af01c5 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Tue, 21 May 2024 16:28:10 +0200 Subject: [PATCH 14/20] Use serverSideFilter in UsersPage --- src/pages/UsersPage.vue | 108 +++----------- tests/unit/pages/UsersPage.test.js | 221 +++++++---------------------- 2 files changed, 67 insertions(+), 262 deletions(-) diff --git a/src/pages/UsersPage.vue b/src/pages/UsersPage.vue index 71163b66..c9f2cce3 100644 --- a/src/pages/UsersPage.vue +++ b/src/pages/UsersPage.vue @@ -7,12 +7,12 @@ {{ $t('IndexPage.text.title') }} 0 ? `?${query}` : ''; - if (elementsPerPage.value !== 10) { - queryParameters.push(`size=${elementsPerPage.value}`); - } - - if (currentPage.value !== 1) { - queryParameters.push(`page=${currentPage.value}`); - } - - if (userName.value?.length > 0) { - queryParameters.push(`name=${userName.value}`); - } - - if (userLogin.value?.length > 0) { - queryParameters.push(`login=${userLogin.value}`); - } - - if (userEmail.value?.length > 0) { - queryParameters.push(`email=${userEmail.value}`); - } - - router.push(queryParameters.length > 0 ? `/users?${queryParameters.join('&')}` : '/users'); -} - -/** - * Create API filters from component ref. - * @returns {object} Object that contains user filters. - */ -function getFilters() { - const filters = {}; - - if (userName.value?.length > 0) { - filters.name = `lk_*${userName.value}*`; - } - - if (userLogin.value?.length > 0) { - filters.login = `lk_*${userLogin.value}*`; - } - - if (userEmail.value?.length > 0) { - filters.email = `lk_*${userEmail.value}*`; - } - - if (currentPage.value >= 1) { - filters.page = `${currentPage.value - 1}`; - } - - if (elementsPerPage.value !== 10) { - filters.count = `${elementsPerPage.value}`; - } - - return filters; + router.push(`/users${querySuffix}`); } /** @@ -138,9 +92,9 @@ async function search() { return UserService.find(getFilters()) .then((data) => { users.value = data.content; - currentPage.value = data.pageable.pageNumber + 1; + filters.value.page = data.pageable.pageNumber + 1; maxPage.value = data.totalPages; - elementsPerPage.value = data.size; + filters.value.count = data.size; totalElements.value = data.totalElements; return Promise.resolve(); @@ -150,32 +104,6 @@ async function search() { }); } -/** - * Init filters and pagination from query parameters in url. - * @param {object} query - URL query parameters. - */ -function init(query) { - if (query.size) { - elementsPerPage.value = parseInt(query.size, 10) || 10; - } - - if (query.page) { - currentPage.value = parseInt(query.page, 10) || 0; - } - - if (query.name) { - userName.value = query.name; - } - - if (query.login) { - userLogin.value = query.login; - } - - if (query.email) { - userEmail.value = query.email; - } -} - onMounted(async () => { init(route.query); reloadUsersEventRef = ReloadUsersEvent.subscribe(search); diff --git a/tests/unit/pages/UsersPage.test.js b/tests/unit/pages/UsersPage.test.js index 4bd73224..85d8fdac 100644 --- a/tests/unit/pages/UsersPage.test.js +++ b/tests/unit/pages/UsersPage.test.js @@ -75,11 +75,13 @@ describe('Test component: UsersPage', () => { describe('Test function: updateRoute', () => { it('should push users without filters', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; + wrapper.vm.filters = { + count: 10, + page: 1, + name: '', + login: '', + email: '', + }; wrapper.vm.updateRoute(); @@ -87,11 +89,13 @@ describe('Test component: UsersPage', () => { }); it('should push users with size filter', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 11; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; + wrapper.vm.filters = { + count: 11, + page: 1, + name: '', + login: '', + email: '', + }; wrapper.vm.updateRoute(); @@ -99,11 +103,13 @@ describe('Test component: UsersPage', () => { }); it('should push users with current page filter', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; + wrapper.vm.filters = { + count: 10, + page: 2, + name: '', + login: '', + email: '', + }; wrapper.vm.updateRoute(); @@ -111,11 +117,13 @@ describe('Test component: UsersPage', () => { }); it('should push users with user name filter', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = 'userName'; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; + wrapper.vm.filters = { + count: 10, + page: 1, + name: 'userName', + login: '', + email: '', + }; wrapper.vm.updateRoute(); @@ -123,11 +131,13 @@ describe('Test component: UsersPage', () => { }); it('should push users with user login filter', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = 'userLogin'; - wrapper.vm.userEmail = ''; + wrapper.vm.filters = { + count: 10, + page: 1, + name: '', + login: 'userLogin', + email: '', + }; wrapper.vm.updateRoute(); @@ -135,11 +145,13 @@ describe('Test component: UsersPage', () => { }); it('should push users with user email filter', () => { - wrapper.vm.currentPage = 1; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = 'userEmail'; + wrapper.vm.filters = { + count: 10, + page: 1, + name: '', + login: '', + email: 'userEmail', + }; wrapper.vm.updateRoute(); @@ -147,11 +159,13 @@ describe('Test component: UsersPage', () => { }); it('should push users with all filters', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 11; - wrapper.vm.userName = 'userName'; - wrapper.vm.userLogin = 'userLogin'; - wrapper.vm.userEmail = 'userEmail'; + wrapper.vm.filters = { + count: 11, + page: 2, + name: 'userName', + login: 'userLogin', + email: 'userEmail', + }; wrapper.vm.updateRoute(); @@ -159,84 +173,6 @@ describe('Test component: UsersPage', () => { }); }); - describe('Test function: getFilters', () => { - it('should return object with no filters', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - - expect({}).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with name filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = 'test'; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - - expect({ name: 'lk_*test*' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with login filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = 'test'; - wrapper.vm.userEmail = ''; - - expect({ login: 'lk_*test*' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with email filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = 'test'; - - expect({ email: 'lk_*test*' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with page filter', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 10; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - - expect({ page: '1' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with count filter', () => { - wrapper.vm.currentPage = 0; - wrapper.vm.elementsPerPage = 5; - wrapper.vm.userName = ''; - wrapper.vm.userLogin = ''; - wrapper.vm.userEmail = ''; - - expect({ count: '5' }).toEqual(wrapper.vm.getFilters()); - }); - - it('should return object with all filters', () => { - wrapper.vm.currentPage = 2; - wrapper.vm.elementsPerPage = 5; - wrapper.vm.userName = 'userName'; - wrapper.vm.userLogin = 'userLogin'; - wrapper.vm.userEmail = 'userEmail'; - - expect({ - count: '5', - page: '1', - name: 'lk_*userName*', - login: 'lk_*userLogin*', - email: 'lk_*userEmail*', - }).toEqual(wrapper.vm.getFilters()); - }); - }); - describe('Test function: search', () => { it('should set users', () => { wrapper.vm.search(); @@ -245,65 +181,6 @@ describe('Test component: UsersPage', () => { }); }); - describe('Test function: init', () => { - it('should not change value without query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.userName = 'userName'; - wrapper.vm.userLogin = 'userLogin'; - wrapper.vm.userEmail = 'userEmail'; - - wrapper.vm.init({}); - - expect(wrapper.vm.elementsPerPage).toEqual(100); - expect(wrapper.vm.currentPage).toEqual(200); - expect(wrapper.vm.userName).toEqual('userName'); - expect(wrapper.vm.userLogin).toEqual('userLogin'); - expect(wrapper.vm.userEmail).toEqual('userEmail'); - }); - - it('should set default value with bad query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.userName = 'userName'; - wrapper.vm.userLogin = 'userLogin'; - wrapper.vm.userEmail = 'userEmail'; - - wrapper.vm.init({ - size: 'a', - page: 'b', - }); - - expect(wrapper.vm.elementsPerPage).toEqual(10); - expect(wrapper.vm.currentPage).toEqual(0); - expect(wrapper.vm.userName).toEqual('userName'); - expect(wrapper.vm.userLogin).toEqual('userLogin'); - expect(wrapper.vm.userEmail).toEqual('userEmail'); - }); - - it('should set value from query parameters', () => { - wrapper.vm.elementsPerPage = 100; - wrapper.vm.currentPage = 200; - wrapper.vm.userName = 'userName'; - wrapper.vm.userLogin = 'userLogin'; - wrapper.vm.userEmail = 'userEmail'; - - wrapper.vm.init({ - size: '2', - page: '1', - name: 'name', - login: 'login', - email: 'email', - }); - - expect(wrapper.vm.elementsPerPage).toEqual(2); - expect(wrapper.vm.currentPage).toEqual(1); - expect(wrapper.vm.userName).toEqual('name'); - expect(wrapper.vm.userLogin).toEqual('login'); - expect(wrapper.vm.userEmail).toEqual('email'); - }); - }); - describe('Test hook function: onMounted', () => { it('should subscribe ReloadUsersEvent', () => { expect(subscribe).toHaveBeenCalledTimes(1); From ff80514f4ac1b25cae6be7c76faa1ad29a7d5b1f Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Fri, 26 Apr 2024 10:16:13 +0200 Subject: [PATCH 15/20] Update GroupPage to update Url query from tabs --- src/pages/GroupPage.vue | 43 ++++++++++++++++++++--- tests/unit/pages/GroupPage.test.js | 55 +++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 6 deletions(-) diff --git a/src/pages/GroupPage.vue b/src/pages/GroupPage.vue index 10f1eeb4..614cfb6a 100644 --- a/src/pages/GroupPage.vue +++ b/src/pages/GroupPage.vue @@ -23,10 +23,11 @@ From 56699a5b69be7cb810fb9451644676774f477a15 Mon Sep 17 00:00:00 2001 From: Justine Hell Date: Wed, 22 May 2024 12:00:11 +0200 Subject: [PATCH 20/20] Update dependencies --- package-lock.json | 2546 +++++++++++++++++++++++++++++---------------- package.json | 26 +- 2 files changed, 1673 insertions(+), 899 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3dbb02d1..87371210 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,37 +9,37 @@ "version": "0.0.1", "dependencies": { "@quasar/extras": "=1.16.11", - "axios": "=1.6.8", + "axios": "=1.7.2", "pinia": "=2.1.7", - "quasar": "=2.15.3", + "quasar": "=2.16.4", "v-viewer": "=3.0.13", - "vue": "=3.4.24", + "vue": "=3.4.27", "vue-3-sanitize": "=0.1.4", "vue-i18n": "=9.13.1", "vue-router": "=4.3.2" }, "devDependencies": { "@4tw/cypress-drag-drop": "=2.2.5", - "@badeball/cypress-cucumber-preprocessor": "=20.0.4", + "@badeball/cypress-cucumber-preprocessor": "=20.0.5", "@cypress/browserify-preprocessor": "=3.0.2", "@intlify/vite-plugin-vue-i18n": "=6.0.3", - "@quasar/app-vite": "=1.8.2", + "@quasar/app-vite": "=1.9.3", "@quasar/quasar-app-extension-testing-unit-vitest": "=1.0.0", - "@vitest/coverage-v8": "=1.5.0", - "@vue/test-utils": "=2.4.5", + "@vitest/coverage-v8": "=1.6.0", + "@vue/test-utils": "=2.4.6", "autoprefixer": "=10.4.19", - "cypress": "=13.7.3", + "cypress": "=13.10.0", "cypress-real-events": "=1.12.0", "eslint": "=8.57.0", "eslint-config-airbnb-base": "=15.0.0", - "eslint-plugin-cypress": "=2.15.2", + "eslint-plugin-cypress": "=3.2.0", "eslint-plugin-import": "=2.29.1", - "eslint-plugin-jsdoc": "=48.2.3", - "eslint-plugin-vue": "=9.25.0", + "eslint-plugin-jsdoc": "=48.2.5", + "eslint-plugin-vue": "=9.26.0", "gherkin-lint": "=4.2.4", - "jsdoc": "=4.0.2", + "jsdoc": "=4.0.3", "nunjucks": "=3.2.4", - "vitest": "=1.5.0" + "vitest": "=1.6.0" }, "engines": { "node": "^18 || ^16 || ^14.19", @@ -2050,9 +2050,9 @@ } }, "node_modules/@badeball/cypress-cucumber-preprocessor": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-20.0.4.tgz", - "integrity": "sha512-1izlopsaJLPVjPN4XV3WhviZOgwXleVMsiTuDYHbJq3QiTUdHUzbticy8cMxtUTKa2dKZZSJTzZIGcXP5wEuag==", + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-20.0.5.tgz", + "integrity": "sha512-KmlyvOOq5XjVbCIiCmY/+QyUA2CQPeBoa9AJD7N1UrnuI9EDvZkO11UHdcu+uG2x2V5k8ZBijIqYW/xvsHK4Wg==", "dev": true, "funding": [ { @@ -2061,49 +2061,455 @@ } ], "dependencies": { - "@badeball/cypress-configuration": "^6.1.0", - "@cucumber/ci-environment": "^10.0.0", - "@cucumber/cucumber": "^10.0.0", - "@cucumber/cucumber-expressions": "^17.0.0", - "@cucumber/gherkin": "^27.0.0", - "@cucumber/html-formatter": "^20.4.0", + "@badeball/cypress-configuration": "^6.1.1", + "@cucumber/ci-environment": "^10.0.1", + "@cucumber/cucumber": "^10.6.0", + "@cucumber/cucumber-expressions": "^17.1.0", + "@cucumber/gherkin": "^28.0.0", + "@cucumber/html-formatter": "^21.3.1", "@cucumber/message-streams": "^4.0.1", - "@cucumber/messages": "^22.0.0", - "@cucumber/pretty-formatter": "^1.0.0", - "@cucumber/tag-expressions": "^6.0.0", + "@cucumber/messages": "^24.1.0", + "@cucumber/pretty-formatter": "^1.0.1", + "@cucumber/tag-expressions": "^6.1.0", "base64-js": "^1.5.1", "chalk": "^4.1.2", "cli-table": "^0.3.11", "common-ancestor-path": "^1.0.1", - "cosmiconfig": "^8.3.6", + "cosmiconfig": "^9.0.0", "debug": "^4.3.4", "error-stack-parser": "^2.1.4", - "esbuild": "^0.19.4", - "glob": "^10.3.10", + "esbuild": "^0.20.2", + "glob": "^10.3.12", "is-path-inside": "^3.0.3", - "mocha": "^10.2.0", + "mocha": "^10.4.0", "seedrandom": "^3.0.5", "source-map": "^0.7.4", "split": "^1.0.1", "uuid": "^9.0.1" }, "bin": { - "cucumber-html-formatter": "dist/bin/cucumber-html-formatter.js", - "cucumber-json-formatter": "dist/bin/cucumber-json-formatter.js", - "cucumber-merge-messages": "dist/bin/cucumber-merge-messages.js", - "cypress-cucumber-diagnostics": "dist/bin/diagnostics.js" + "cucumber-html-formatter": "dist/bin/cucumber-html-formatter.js", + "cucumber-json-formatter": "dist/bin/cucumber-json-formatter.js", + "cucumber-merge-messages": "dist/bin/cucumber-merge-messages.js", + "cypress-cucumber-diagnostics": "dist/bin/diagnostics.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@cypress/browserify-preprocessor": "^3.0.1", + "cypress": "^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0" + }, + "peerDependenciesMeta": { + "@cypress/browserify-preprocessor": { + "optional": true + } + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@cypress/browserify-preprocessor": "^3.0.1", - "cypress": "^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "@cypress/browserify-preprocessor": { - "optional": true - } + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/@bcoe/v8-coverage": { @@ -2129,9 +2535,9 @@ "dev": true }, "node_modules/@cucumber/cucumber": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-10.4.0.tgz", - "integrity": "sha512-pFPu4tCzHJUm1S4GfWUlhJYYqfbVPCmYCADehuhNU+MR29mvy49DQE6WS6aVdwABPawzpBs0H8EuQYA8Vh9Yqw==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-10.7.0.tgz", + "integrity": "sha512-8E5vqOIpZOJlRH/aoZc50+yahrObvkbZSxI5WUqM39V3BHNpfzNaPpuLYpSHD2j+gTlubZ8c56RE3Udq38m66g==", "dev": true, "dependencies": { "@cucumber/ci-environment": "10.0.1", @@ -2195,7 +2601,7 @@ "regexp-match-indices": "1.0.2" } }, - "node_modules/@cucumber/cucumber/node_modules/@cucumber/gherkin": { + "node_modules/@cucumber/gherkin": { "version": "28.0.0", "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", @@ -2204,49 +2610,6 @@ "@cucumber/messages": ">=19.1.4 <=24" } }, - "node_modules/@cucumber/cucumber/node_modules/@cucumber/html-formatter": { - "version": "21.3.1", - "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.3.1.tgz", - "integrity": "sha512-M1zbre7e8MsecXheqNv62BKY5J06YJSv1LmsD7sJ3mu5t1jirLjj2It1HqPsX5CQAfg9n69xFRugPgLMSte9TA==", - "dev": true, - "peerDependencies": { - "@cucumber/messages": ">=18" - } - }, - "node_modules/@cucumber/cucumber/node_modules/@cucumber/messages": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", - "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", - "dev": true, - "dependencies": { - "@types/uuid": "9.0.8", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.1", - "uuid": "9.0.1" - } - }, - "node_modules/@cucumber/cucumber/node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, - "node_modules/@cucumber/cucumber/node_modules/reflect-metadata": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", - "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", - "deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer.", - "dev": true - }, - "node_modules/@cucumber/gherkin": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-27.0.0.tgz", - "integrity": "sha512-j5rCsjqzRiC3iVTier3sa0kzyNbkcAmF7xr7jKnyO7qDeK3Z8Ye1P3KSVpeQRMY+KCDJ3WbTDdyxH0FwfA/fIw==", - "dev": true, - "dependencies": { - "@cucumber/messages": ">=19.1.4 <=22" - } - }, "node_modules/@cucumber/gherkin-streams": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz", @@ -2290,33 +2653,6 @@ "gherkin-utils": "bin/gherkin-utils" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", - "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", - "dev": true, - "dependencies": { - "@cucumber/messages": ">=19.1.4 <=24" - } - }, - "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", - "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", - "dev": true, - "dependencies": { - "@types/uuid": "9.0.8", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.1", - "uuid": "9.0.1" - } - }, - "node_modules/@cucumber/gherkin-utils/node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, "node_modules/@cucumber/gherkin-utils/node_modules/commander": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", @@ -2326,17 +2662,10 @@ "node": ">=18" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/reflect-metadata": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", - "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", - "deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer.", - "dev": true - }, "node_modules/@cucumber/html-formatter": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-20.4.0.tgz", - "integrity": "sha512-TnLSXC5eJd8AXHENo69f5z+SixEVtQIf7Q2dZuTpT/Y8AOkilGpGl1MQR1Vp59JIw+fF3EQSUKdf+DAThCxUNg==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.3.1.tgz", + "integrity": "sha512-M1zbre7e8MsecXheqNv62BKY5J06YJSv1LmsD7sJ3mu5t1jirLjj2It1HqPsX5CQAfg9n69xFRugPgLMSte9TA==", "dev": true, "peerDependencies": { "@cucumber/messages": ">=18" @@ -2352,24 +2681,15 @@ } }, "node_modules/@cucumber/messages": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-22.0.0.tgz", - "integrity": "sha512-EuaUtYte9ilkxcKmfqGF9pJsHRUU0jwie5ukuZ/1NPTuHS1LxHPsGEODK17RPRbZHOFhqybNzG2rHAwThxEymg==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", + "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", "dev": true, "dependencies": { - "@types/uuid": "9.0.1", + "@types/uuid": "9.0.8", "class-transformer": "0.5.1", - "reflect-metadata": "0.1.13", - "uuid": "9.0.0" - } - }, - "node_modules/@cucumber/messages/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" } }, "node_modules/@cucumber/pretty-formatter": { @@ -2501,11 +2821,14 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz", - "integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==", + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.0.tgz", + "integrity": "sha512-Q1CnsQrytI3TlCB1IVWXWeqUIPGVEKGaE7IbVdt13Nq/3i0JESAkQQERrfiQkmlpijl+++qyqPgaS31Bvc1jRQ==", "dev": true, "dependencies": { + "@types/eslint": "^8.56.5", + "@types/estree": "^1.0.5", + "@typescript-eslint/types": "^7.2.0", "comment-parser": "1.4.1", "esquery": "^1.5.0", "jsdoc-type-pratt-parser": "~4.0.0" @@ -3263,6 +3586,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -3406,13 +3739,13 @@ "dev": true }, "node_modules/@quasar/app-vite": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@quasar/app-vite/-/app-vite-1.8.2.tgz", - "integrity": "sha512-8/0xCMkAf4SHHdhvp54jKpq73onKawpPd4kjQZqzZaLlkKfLjrmbNmKuwmGqVptwcgz18FXs66HdSrYilLKv0A==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@quasar/app-vite/-/app-vite-1.9.3.tgz", + "integrity": "sha512-10YgKO/IiIWsfYQDB7WxgUivYyEObokDbQBHqStsM9yLV62ThmKm1oqI8Utsue2njXYI8DuOSt7zxtgmCyMMpA==", "dev": true, "dependencies": { "@quasar/render-ssr-error": "^1.0.3", - "@quasar/vite-plugin": "^1.3.3", + "@quasar/vite-plugin": "^1.7.0", "@rollup/pluginutils": "^4.1.2", "@types/chrome": "^0.0.208", "@types/compression": "^1.7.2", @@ -3430,7 +3763,7 @@ "express": "^4.17.3", "fast-glob": "3.2.12", "fs-extra": "^11.1.0", - "html-minifier": "^4.0.0", + "html-minifier-terser": "^7.2.0", "inquirer": "^8.2.1", "isbinaryfile": "^5.0.0", "kolorist": "^1.5.1", @@ -3459,17 +3792,21 @@ "url": "https://donate.quasar.dev" }, "peerDependencies": { + "@electron/packager": ">= 18", "electron-builder": ">= 22", "electron-packager": ">= 15", "eslint": "^8.11.0", "pinia": "^2.0.0", - "quasar": "^2.14.0", + "quasar": "^2.16.0", "vue": "^3.2.29", "vue-router": "^4.0.12", "vuex": "^4.0.0", "workbox-build": ">= 6" }, "peerDependenciesMeta": { + "@electron/packager": { + "optional": true + }, "electron-builder": { "optional": true }, @@ -3610,21 +3947,21 @@ } }, "node_modules/@quasar/vite-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@quasar/vite-plugin/-/vite-plugin-1.6.0.tgz", - "integrity": "sha512-LmbV76G1CwWZbrEQhqyZpkRQTJyO3xpW55aXY1zWN+JhyUeG77CcMCEWteBVnJ6I6ehUPFDC9ONd2+WlwH6rNQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@quasar/vite-plugin/-/vite-plugin-1.7.0.tgz", + "integrity": "sha512-ia4w1n4DuPYm92MQLPNpMqLJID1WGGRyVGxkVeg8V+V25Vh3p9QBo++iuXR4sW/bCmzzx66Ko6VStsr1zp90GQ==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "github", "url": "https://donate.quasar.dev" }, "peerDependencies": { - "@vitejs/plugin-vue": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-beta.0", - "quasar": "^2.8.0", - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-beta.0", + "@vitejs/plugin-vue": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "quasar": "^2.16.0", + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "vue": "^3.0.0" } }, @@ -3706,6 +4043,19 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.14.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz", @@ -3895,6 +4245,16 @@ "integrity": "sha512-rkiiTuf/z2wTd4RxFOb+clE7PF4AEJU0hsczbUdkHHBtkUmpWQpEddynNfJYKYtZFJKbq4F+brfekt1kx85IZA==", "dev": true }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -3952,6 +4312,12 @@ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -3959,9 +4325,9 @@ "dev": true }, "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, "node_modules/@types/long": { @@ -3971,19 +4337,19 @@ "dev": true }, "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", "dev": true, "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true }, "node_modules/@types/mime": { @@ -4053,9 +4419,9 @@ "dev": true }, "node_modules/@types/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true }, "node_modules/@types/yauzl": { @@ -4068,6 +4434,19 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -4088,9 +4467,9 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.5.0.tgz", - "integrity": "sha512-1igVwlcqw1QUMdfcMlzzY4coikSIBN944pkueGi0pawrX5I5Z+9hxdTR+w3Sg6Q3eZhvdMAs8ZaF9JuTG1uYOQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", + "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -4111,17 +4490,17 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "1.5.0" + "vitest": "1.6.0" } }, "node_modules/@vitest/expect": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.0.tgz", - "integrity": "sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dev": true, "dependencies": { - "@vitest/spy": "1.5.0", - "@vitest/utils": "1.5.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "chai": "^4.3.10" }, "funding": { @@ -4129,12 +4508,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.0.tgz", - "integrity": "sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "dev": true, "dependencies": { - "@vitest/utils": "1.5.0", + "@vitest/utils": "1.6.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -4170,9 +4549,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.0.tgz", - "integrity": "sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -4184,9 +4563,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.0.tgz", - "integrity": "sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -4196,9 +4575,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.0.tgz", - "integrity": "sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -4220,36 +4599,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.24.tgz", - "integrity": "sha512-vbW/tgbwJYj62N/Ww99x0zhFTkZDTcGh3uwJEuadZ/nF9/xuFMC4693P9r+3sxGXISABpDKvffY5ApH9pmdd1A==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", + "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", "dependencies": { "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.24", + "@vue/shared": "3.4.27", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.24.tgz", - "integrity": "sha512-4XgABML/4cNndVsQndG6BbGN7+EoisDwi3oXNovqL/4jdNhwvP8/rfRMTb6FxkxIxUUtg6AI1/qZvwfSjxJiWA==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", + "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", "dependencies": { - "@vue/compiler-core": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/compiler-core": "3.4.27", + "@vue/shared": "3.4.27" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.24.tgz", - "integrity": "sha512-nRAlJUK02FTWfA2nuvNBAqsDZuERGFgxZ8sGH62XgFSvMxO2URblzulExsmj4gFZ8e+VAyDooU9oAoXfEDNxTA==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", + "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", "dependencies": { "@babel/parser": "^7.24.4", - "@vue/compiler-core": "3.4.24", - "@vue/compiler-dom": "3.4.24", - "@vue/compiler-ssr": "3.4.24", - "@vue/shared": "3.4.24", + "@vue/compiler-core": "3.4.27", + "@vue/compiler-dom": "3.4.27", + "@vue/compiler-ssr": "3.4.27", + "@vue/shared": "3.4.27", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -4257,12 +4636,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.24.tgz", - "integrity": "sha512-ZsAtr4fhaUFnVcDqwW3bYCSDwq+9Gk69q2r/7dAHDrOMw41kylaMgOP4zRnn6GIEJkQznKgrMOGPMFnLB52RbQ==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", + "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", "dependencies": { - "@vue/compiler-dom": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/compiler-dom": "3.4.27", + "@vue/shared": "3.4.27" } }, "node_modules/@vue/devtools-api": { @@ -4271,53 +4650,53 @@ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "node_modules/@vue/reactivity": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.24.tgz", - "integrity": "sha512-nup3fSYg4i4LtNvu9slF/HF/0dkMQYfepUdORBcMSsankzRPzE7ypAFurpwyRBfU1i7Dn1kcwpYsE1wETSh91g==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", + "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", "dependencies": { - "@vue/shared": "3.4.24" + "@vue/shared": "3.4.27" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.24.tgz", - "integrity": "sha512-c7iMfj6cJMeAG3s5yOn9Rc5D9e2/wIuaozmGf/ICGCY3KV5H7mbTVdvEkd4ZshTq7RUZqj2k7LMJWVx+EBiY1g==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", + "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", "dependencies": { - "@vue/reactivity": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/reactivity": "3.4.27", + "@vue/shared": "3.4.27" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.24.tgz", - "integrity": "sha512-uXKzuh/Emfad2Y7Qm0ABsLZZV6H3mAJ5ZVqmAOlrNQRf+T5mxpPGZBfec1hkP41t6h6FwF6RSGCs/gd8WbuySQ==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", + "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", "dependencies": { - "@vue/runtime-core": "3.4.24", - "@vue/shared": "3.4.24", + "@vue/runtime-core": "3.4.27", + "@vue/shared": "3.4.27", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.24.tgz", - "integrity": "sha512-H+DLK4sQF6sRgzKyofmlEVBIV/9KrQU6HIV7nt6yIwSGGKvSwlV8pqJlebUKLpbXaNHugdSfAbP6YmXF69lxow==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", + "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", "dependencies": { - "@vue/compiler-ssr": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/compiler-ssr": "3.4.27", + "@vue/shared": "3.4.27" }, "peerDependencies": { - "vue": "3.4.24" + "vue": "3.4.27" } }, "node_modules/@vue/shared": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.24.tgz", - "integrity": "sha512-BW4tajrJBM9AGAknnyEw5tO2xTmnqgup0VTnDAMcxYmqOX0RG0b9aSUGAbEKolD91tdwpA6oCwbltoJoNzpItw==" + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", + "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" }, "node_modules/@vue/test-utils": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.5.tgz", - "integrity": "sha512-oo2u7vktOyKUked36R93NB7mg2B+N7Plr8lxp2JBGwr18ch6EggFjixSCdIVVLkT6Qr0z359Xvnafc9dcKyDUg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz", + "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==", "dev": true, "dependencies": { "js-beautify": "^1.14.9", @@ -4928,9 +5307,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -5612,28 +5991,13 @@ } }, "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camel-case/node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "node_modules/camel-case/node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "dependencies": { - "lower-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, "node_modules/camelcase": { @@ -5859,15 +6223,15 @@ "dev": true }, "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "dependencies": { "source-map": "~0.6.0" }, "engines": { - "node": ">= 4.0" + "node": ">= 10.0" } }, "node_modules/clean-css/node_modules/source-map": { @@ -6423,15 +6787,15 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -6598,9 +6962,9 @@ } }, "node_modules/cypress": { - "version": "13.7.3", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.3.tgz", - "integrity": "sha512-uoecY6FTCAuIEqLUYkTrxamDBjMHTYak/1O7jtgwboHiTnS1NaMOoR08KcTrbRZFCBvYOiS4tEkQRmsV+xcrag==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.10.0.tgz", + "integrity": "sha512-tOhwRlurVOQbMduX+KonoMeQILs2cwR3yHGGENoFvvSoLUBHmJ8b9/n21gFSDqjlOJ+SRVcwuh+fG/JDsHsT6Q==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -7073,6 +7437,16 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -7284,6 +7658,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7949,15 +8332,15 @@ } }, "node_modules/eslint-plugin-cypress": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.2.tgz", - "integrity": "sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-3.2.0.tgz", + "integrity": "sha512-HaxMz6BoU4ay+K4WrG9ZJC1NdX06FqSlAwtRDStjM0ORFT7zCNPNuRJ+kUPc17Rt2AMUBSqeD9L0zTR3uZhPpw==", "dev": true, "dependencies": { "globals": "^13.20.0" }, "peerDependencies": { - "eslint": ">= 3.2.1" + "eslint": ">=7" } }, "node_modules/eslint-plugin-cypress/node_modules/globals": { @@ -8049,19 +8432,19 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.3.tgz", - "integrity": "sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==", + "version": "48.2.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz", + "integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.42.0", + "@es-joy/jsdoccomment": "~0.43.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", "is-builtin-module": "^3.2.1", - "semver": "^7.6.0", + "semver": "^7.6.1", "spdx-expression-parse": "^4.0.0" }, "engines": { @@ -8071,26 +8454,11 @@ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -8098,16 +8466,10 @@ "node": ">=10" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/eslint-plugin-vue": { - "version": "9.25.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz", - "integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz", + "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -9402,33 +9764,27 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "dev": true, "dependencies": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" + "terser": "^5.15.1" }, "bin": { - "html-minifier": "cli.js" + "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=6" + "node": "^14.13.1 || >=16.0.0" } }, - "node_modules/html-minifier/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/htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -10329,21 +10685,21 @@ "dev": true }, "node_modules/jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", + "@types/markdown-it": "^14.1.1", "bluebird": "^3.7.2", "catharsis": "^0.9.0", "escape-string-regexp": "^2.0.0", "js2xmlparser": "^4.0.2", "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", "marked": "^4.0.10", "mkdirp": "^1.0.4", "requizzle": "^0.2.3", @@ -10712,12 +11068,12 @@ "dev": true }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/listr2": { @@ -11072,19 +11428,20 @@ } }, "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdown-it-anchor": { @@ -11097,15 +11454,6 @@ "markdown-it": "*" } }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -11130,9 +11478,9 @@ } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "node_modules/media-typer": { @@ -12023,27 +12371,13 @@ "dev": true }, "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/param-case/node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "node_modules/param-case/node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "dependencies": { - "lower-case": "^1.1.1" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "node_modules/parent-module": { @@ -12116,6 +12450,16 @@ "node": ">= 0.8" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", @@ -12195,15 +12539,6 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -12555,6 +12890,15 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.10.4", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", @@ -12571,9 +12915,9 @@ } }, "node_modules/quasar": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.15.3.tgz", - "integrity": "sha512-+6g6D1t/O95dhuov4b6SwR3asowr01xwV1A2JWh5cVQc1hTmolXzgQNPbrOApLjGX7N1cQ119DWajJ/G8KzXPQ==", + "version": "2.16.4", + "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.16.4.tgz", + "integrity": "sha512-ICntco9uZ4PeyLgzVckjK3fsS+LG7+rOUmRyR7Gq3XpfeCADs1edIRjlxsPpWBBJvK/9AHLGPO6XNmnJmdJm0A==", "engines": { "node": ">= 10.18.1", "npm": ">= 6.13.4", @@ -12672,9 +13016,9 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "node_modules/read-only-stream": { @@ -12900,9 +13244,10 @@ "dev": true }, "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", + "deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer.", "dev": true }, "node_modules/regenerate": { @@ -14469,6 +14814,30 @@ "node": ">=6" } }, + "node_modules/terser": { + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/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/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -14926,9 +15295,9 @@ "dev": true }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "node_modules/ufo": { @@ -14937,18 +15306,6 @@ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", @@ -15098,12 +15455,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true - }, "node_modules/upper-case-first": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", @@ -15329,9 +15680,9 @@ } }, "node_modules/vite-node": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.0.tgz", - "integrity": "sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -15697,15 +16048,213 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=12" - } + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-node/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/vite-node/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/vite-node/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "node_modules/vite-node/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], @@ -15713,10 +16262,7 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=12" - } + ] }, "node_modules/vite-node/node_modules/esbuild": { "version": "0.20.2", @@ -15757,9 +16303,9 @@ } }, "node_modules/vite-node/node_modules/rollup": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.2.tgz", - "integrity": "sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -15772,28 +16318,29 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.14.2", - "@rollup/rollup-android-arm64": "4.14.2", - "@rollup/rollup-darwin-arm64": "4.14.2", - "@rollup/rollup-darwin-x64": "4.14.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.14.2", - "@rollup/rollup-linux-arm64-gnu": "4.14.2", - "@rollup/rollup-linux-arm64-musl": "4.14.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.14.2", - "@rollup/rollup-linux-riscv64-gnu": "4.14.2", - "@rollup/rollup-linux-s390x-gnu": "4.14.2", - "@rollup/rollup-linux-x64-gnu": "4.14.2", - "@rollup/rollup-linux-x64-musl": "4.14.2", - "@rollup/rollup-win32-arm64-msvc": "4.14.2", - "@rollup/rollup-win32-ia32-msvc": "4.14.2", - "@rollup/rollup-win32-x64-msvc": "4.14.2", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, "node_modules/vite-node/node_modules/vite": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", - "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "dev": true, "dependencies": { "esbuild": "^0.20.1", @@ -16237,16 +16784,16 @@ } }, "node_modules/vitest": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.0.tgz", - "integrity": "sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "dev": true, "dependencies": { - "@vitest/expect": "1.5.0", - "@vitest/runner": "1.5.0", - "@vitest/snapshot": "1.5.0", - "@vitest/spy": "1.5.0", - "@vitest/utils": "1.5.0", + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -16260,7 +16807,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.5.0", + "vite-node": "1.6.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -16275,8 +16822,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.5.0", - "@vitest/ui": "1.5.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", "happy-dom": "*", "jsdom": "*" }, @@ -16946,15 +17493,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.24.tgz", - "integrity": "sha512-NPdx7dLGyHmKHGRRU5bMRYVE+rechR+KDU5R2tSTNG36PuMwbfAJ+amEvOAw7BPfZp5sQulNELSLm5YUkau+Sg==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", + "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", "dependencies": { - "@vue/compiler-dom": "3.4.24", - "@vue/compiler-sfc": "3.4.24", - "@vue/runtime-dom": "3.4.24", - "@vue/server-renderer": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/compiler-dom": "3.4.27", + "@vue/compiler-sfc": "3.4.27", + "@vue/runtime-dom": "3.4.27", + "@vue/server-renderer": "3.4.27", + "@vue/shared": "3.4.27" }, "peerDependencies": { "typescript": "*" @@ -19101,36 +19648,230 @@ } }, "@badeball/cypress-cucumber-preprocessor": { - "version": "20.0.4", - "resolved": "https://registry.npmjs.org/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-20.0.4.tgz", - "integrity": "sha512-1izlopsaJLPVjPN4XV3WhviZOgwXleVMsiTuDYHbJq3QiTUdHUzbticy8cMxtUTKa2dKZZSJTzZIGcXP5wEuag==", + "version": "20.0.5", + "resolved": "https://registry.npmjs.org/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-20.0.5.tgz", + "integrity": "sha512-KmlyvOOq5XjVbCIiCmY/+QyUA2CQPeBoa9AJD7N1UrnuI9EDvZkO11UHdcu+uG2x2V5k8ZBijIqYW/xvsHK4Wg==", "dev": true, "requires": { - "@badeball/cypress-configuration": "^6.1.0", - "@cucumber/ci-environment": "^10.0.0", - "@cucumber/cucumber": "^10.0.0", - "@cucumber/cucumber-expressions": "^17.0.0", - "@cucumber/gherkin": "^27.0.0", - "@cucumber/html-formatter": "^20.4.0", + "@badeball/cypress-configuration": "^6.1.1", + "@cucumber/ci-environment": "^10.0.1", + "@cucumber/cucumber": "^10.6.0", + "@cucumber/cucumber-expressions": "^17.1.0", + "@cucumber/gherkin": "^28.0.0", + "@cucumber/html-formatter": "^21.3.1", "@cucumber/message-streams": "^4.0.1", - "@cucumber/messages": "^22.0.0", - "@cucumber/pretty-formatter": "^1.0.0", - "@cucumber/tag-expressions": "^6.0.0", + "@cucumber/messages": "^24.1.0", + "@cucumber/pretty-formatter": "^1.0.1", + "@cucumber/tag-expressions": "^6.1.0", "base64-js": "^1.5.1", "chalk": "^4.1.2", "cli-table": "^0.3.11", "common-ancestor-path": "^1.0.1", - "cosmiconfig": "^8.3.6", + "cosmiconfig": "^9.0.0", "debug": "^4.3.4", "error-stack-parser": "^2.1.4", - "esbuild": "^0.19.4", - "glob": "^10.3.10", + "esbuild": "^0.20.2", + "glob": "^10.3.12", "is-path-inside": "^3.0.3", - "mocha": "^10.2.0", + "mocha": "^10.4.0", "seedrandom": "^3.0.5", "source-map": "^0.7.4", "split": "^1.0.1", "uuid": "^9.0.1" + }, + "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + } } }, "@bcoe/v8-coverage": { @@ -19153,9 +19894,9 @@ "dev": true }, "@cucumber/cucumber": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-10.4.0.tgz", - "integrity": "sha512-pFPu4tCzHJUm1S4GfWUlhJYYqfbVPCmYCADehuhNU+MR29mvy49DQE6WS6aVdwABPawzpBs0H8EuQYA8Vh9Yqw==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-10.7.0.tgz", + "integrity": "sha512-8E5vqOIpZOJlRH/aoZc50+yahrObvkbZSxI5WUqM39V3BHNpfzNaPpuLYpSHD2j+gTlubZ8c56RE3Udq38m66g==", "dev": true, "requires": { "@cucumber/ci-environment": "10.0.1", @@ -19199,48 +19940,6 @@ "xmlbuilder": "^15.1.1", "yaml": "^2.2.2", "yup": "1.2.0" - }, - "dependencies": { - "@cucumber/gherkin": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", - "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", - "dev": true, - "requires": { - "@cucumber/messages": ">=19.1.4 <=24" - } - }, - "@cucumber/html-formatter": { - "version": "21.3.1", - "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.3.1.tgz", - "integrity": "sha512-M1zbre7e8MsecXheqNv62BKY5J06YJSv1LmsD7sJ3mu5t1jirLjj2It1HqPsX5CQAfg9n69xFRugPgLMSte9TA==", - "dev": true, - "requires": {} - }, - "@cucumber/messages": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", - "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", - "dev": true, - "requires": { - "@types/uuid": "9.0.8", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.1", - "uuid": "9.0.1" - } - }, - "@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, - "reflect-metadata": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", - "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", - "dev": true - } } }, "@cucumber/cucumber-expressions": { @@ -19253,12 +19952,12 @@ } }, "@cucumber/gherkin": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-27.0.0.tgz", - "integrity": "sha512-j5rCsjqzRiC3iVTier3sa0kzyNbkcAmF7xr7jKnyO7qDeK3Z8Ye1P3KSVpeQRMY+KCDJ3WbTDdyxH0FwfA/fIw==", + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", + "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", "dev": true, "requires": { - "@cucumber/messages": ">=19.1.4 <=22" + "@cucumber/messages": ">=19.1.4 <=24" } }, "@cucumber/gherkin-streams": { @@ -19292,51 +19991,18 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "@cucumber/gherkin": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", - "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", - "dev": true, - "requires": { - "@cucumber/messages": ">=19.1.4 <=24" - } - }, - "@cucumber/messages": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", - "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", - "dev": true, - "requires": { - "@types/uuid": "9.0.8", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.1", - "uuid": "9.0.1" - } - }, - "@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, "commander": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", "dev": true - }, - "reflect-metadata": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", - "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", - "dev": true } } }, "@cucumber/html-formatter": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-20.4.0.tgz", - "integrity": "sha512-TnLSXC5eJd8AXHENo69f5z+SixEVtQIf7Q2dZuTpT/Y8AOkilGpGl1MQR1Vp59JIw+fF3EQSUKdf+DAThCxUNg==", + "version": "21.3.1", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.3.1.tgz", + "integrity": "sha512-M1zbre7e8MsecXheqNv62BKY5J06YJSv1LmsD7sJ3mu5t1jirLjj2It1HqPsX5CQAfg9n69xFRugPgLMSte9TA==", "dev": true, "requires": {} }, @@ -19348,23 +20014,15 @@ "requires": {} }, "@cucumber/messages": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-22.0.0.tgz", - "integrity": "sha512-EuaUtYte9ilkxcKmfqGF9pJsHRUU0jwie5ukuZ/1NPTuHS1LxHPsGEODK17RPRbZHOFhqybNzG2rHAwThxEymg==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", + "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", "dev": true, "requires": { - "@types/uuid": "9.0.1", + "@types/uuid": "9.0.8", "class-transformer": "0.5.1", - "reflect-metadata": "0.1.13", - "uuid": "9.0.0" - }, - "dependencies": { - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true - } + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" } }, "@cucumber/pretty-formatter": { @@ -19484,11 +20142,14 @@ } }, "@es-joy/jsdoccomment": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz", - "integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==", + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.0.tgz", + "integrity": "sha512-Q1CnsQrytI3TlCB1IVWXWeqUIPGVEKGaE7IbVdt13Nq/3i0JESAkQQERrfiQkmlpijl+++qyqPgaS31Bvc1jRQ==", "dev": true, "requires": { + "@types/eslint": "^8.56.5", + "@types/estree": "^1.0.5", + "@typescript-eslint/types": "^7.2.0", "comment-parser": "1.4.1", "esquery": "^1.5.0", "jsdoc-type-pratt-parser": "~4.0.0" @@ -19902,6 +20563,16 @@ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -20030,13 +20701,13 @@ "dev": true }, "@quasar/app-vite": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@quasar/app-vite/-/app-vite-1.8.2.tgz", - "integrity": "sha512-8/0xCMkAf4SHHdhvp54jKpq73onKawpPd4kjQZqzZaLlkKfLjrmbNmKuwmGqVptwcgz18FXs66HdSrYilLKv0A==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@quasar/app-vite/-/app-vite-1.9.3.tgz", + "integrity": "sha512-10YgKO/IiIWsfYQDB7WxgUivYyEObokDbQBHqStsM9yLV62ThmKm1oqI8Utsue2njXYI8DuOSt7zxtgmCyMMpA==", "dev": true, "requires": { "@quasar/render-ssr-error": "^1.0.3", - "@quasar/vite-plugin": "^1.3.3", + "@quasar/vite-plugin": "^1.7.0", "@rollup/pluginutils": "^4.1.2", "@types/chrome": "^0.0.208", "@types/compression": "^1.7.2", @@ -20054,7 +20725,7 @@ "express": "^4.17.3", "fast-glob": "3.2.12", "fs-extra": "^11.1.0", - "html-minifier": "^4.0.0", + "html-minifier-terser": "^7.2.0", "inquirer": "^8.2.1", "isbinaryfile": "^5.0.0", "kolorist": "^1.5.1", @@ -20152,9 +20823,9 @@ } }, "@quasar/vite-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@quasar/vite-plugin/-/vite-plugin-1.6.0.tgz", - "integrity": "sha512-LmbV76G1CwWZbrEQhqyZpkRQTJyO3xpW55aXY1zWN+JhyUeG77CcMCEWteBVnJ6I6ehUPFDC9ONd2+WlwH6rNQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@quasar/vite-plugin/-/vite-plugin-1.7.0.tgz", + "integrity": "sha512-ia4w1n4DuPYm92MQLPNpMqLJID1WGGRyVGxkVeg8V+V25Vh3p9QBo++iuXR4sW/bCmzzx66Ko6VStsr1zp90GQ==", "dev": true, "requires": {} }, @@ -20203,6 +20874,13 @@ "dev": true, "optional": true }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "dev": true, + "optional": true + }, "@rollup/rollup-linux-arm64-gnu": { "version": "4.14.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz", @@ -20329,6 +21007,16 @@ "integrity": "sha512-rkiiTuf/z2wTd4RxFOb+clE7PF4AEJU0hsczbUdkHHBtkUmpWQpEddynNfJYKYtZFJKbq4F+brfekt1kx85IZA==", "dev": true }, + "@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, "@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -20386,6 +21074,12 @@ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -20393,9 +21087,9 @@ "dev": true }, "@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, "@types/long": { @@ -20405,19 +21099,19 @@ "dev": true }, "@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", "dev": true, "requires": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true }, "@types/mime": { @@ -20487,9 +21181,9 @@ "dev": true }, "@types/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true }, "@types/yauzl": { @@ -20502,6 +21196,12 @@ "@types/node": "*" } }, + "@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true + }, "@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -20516,9 +21216,9 @@ "requires": {} }, "@vitest/coverage-v8": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.5.0.tgz", - "integrity": "sha512-1igVwlcqw1QUMdfcMlzzY4coikSIBN944pkueGi0pawrX5I5Z+9hxdTR+w3Sg6Q3eZhvdMAs8ZaF9JuTG1uYOQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", + "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.1", @@ -20537,23 +21237,23 @@ } }, "@vitest/expect": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.0.tgz", - "integrity": "sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dev": true, "requires": { - "@vitest/spy": "1.5.0", - "@vitest/utils": "1.5.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "chai": "^4.3.10" } }, "@vitest/runner": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.0.tgz", - "integrity": "sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "dev": true, "requires": { - "@vitest/utils": "1.5.0", + "@vitest/utils": "1.6.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -20576,9 +21276,9 @@ } }, "@vitest/snapshot": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.0.tgz", - "integrity": "sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "dev": true, "requires": { "magic-string": "^0.30.5", @@ -20587,18 +21287,18 @@ } }, "@vitest/spy": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.0.tgz", - "integrity": "sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dev": true, "requires": { "tinyspy": "^2.2.0" } }, "@vitest/utils": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.0.tgz", - "integrity": "sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dev": true, "requires": { "diff-sequences": "^29.6.3", @@ -20619,36 +21319,36 @@ } }, "@vue/compiler-core": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.24.tgz", - "integrity": "sha512-vbW/tgbwJYj62N/Ww99x0zhFTkZDTcGh3uwJEuadZ/nF9/xuFMC4693P9r+3sxGXISABpDKvffY5ApH9pmdd1A==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", + "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", "requires": { "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.24", + "@vue/shared": "3.4.27", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "@vue/compiler-dom": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.24.tgz", - "integrity": "sha512-4XgABML/4cNndVsQndG6BbGN7+EoisDwi3oXNovqL/4jdNhwvP8/rfRMTb6FxkxIxUUtg6AI1/qZvwfSjxJiWA==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", + "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", "requires": { - "@vue/compiler-core": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/compiler-core": "3.4.27", + "@vue/shared": "3.4.27" } }, "@vue/compiler-sfc": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.24.tgz", - "integrity": "sha512-nRAlJUK02FTWfA2nuvNBAqsDZuERGFgxZ8sGH62XgFSvMxO2URblzulExsmj4gFZ8e+VAyDooU9oAoXfEDNxTA==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", + "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", "requires": { "@babel/parser": "^7.24.4", - "@vue/compiler-core": "3.4.24", - "@vue/compiler-dom": "3.4.24", - "@vue/compiler-ssr": "3.4.24", - "@vue/shared": "3.4.24", + "@vue/compiler-core": "3.4.27", + "@vue/compiler-dom": "3.4.27", + "@vue/compiler-ssr": "3.4.27", + "@vue/shared": "3.4.27", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -20656,12 +21356,12 @@ } }, "@vue/compiler-ssr": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.24.tgz", - "integrity": "sha512-ZsAtr4fhaUFnVcDqwW3bYCSDwq+9Gk69q2r/7dAHDrOMw41kylaMgOP4zRnn6GIEJkQznKgrMOGPMFnLB52RbQ==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", + "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", "requires": { - "@vue/compiler-dom": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/compiler-dom": "3.4.27", + "@vue/shared": "3.4.27" } }, "@vue/devtools-api": { @@ -20670,50 +21370,50 @@ "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" }, "@vue/reactivity": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.24.tgz", - "integrity": "sha512-nup3fSYg4i4LtNvu9slF/HF/0dkMQYfepUdORBcMSsankzRPzE7ypAFurpwyRBfU1i7Dn1kcwpYsE1wETSh91g==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", + "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", "requires": { - "@vue/shared": "3.4.24" + "@vue/shared": "3.4.27" } }, "@vue/runtime-core": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.24.tgz", - "integrity": "sha512-c7iMfj6cJMeAG3s5yOn9Rc5D9e2/wIuaozmGf/ICGCY3KV5H7mbTVdvEkd4ZshTq7RUZqj2k7LMJWVx+EBiY1g==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", + "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", "requires": { - "@vue/reactivity": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/reactivity": "3.4.27", + "@vue/shared": "3.4.27" } }, "@vue/runtime-dom": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.24.tgz", - "integrity": "sha512-uXKzuh/Emfad2Y7Qm0ABsLZZV6H3mAJ5ZVqmAOlrNQRf+T5mxpPGZBfec1hkP41t6h6FwF6RSGCs/gd8WbuySQ==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", + "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", "requires": { - "@vue/runtime-core": "3.4.24", - "@vue/shared": "3.4.24", + "@vue/runtime-core": "3.4.27", + "@vue/shared": "3.4.27", "csstype": "^3.1.3" } }, "@vue/server-renderer": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.24.tgz", - "integrity": "sha512-H+DLK4sQF6sRgzKyofmlEVBIV/9KrQU6HIV7nt6yIwSGGKvSwlV8pqJlebUKLpbXaNHugdSfAbP6YmXF69lxow==", + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", + "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", "requires": { - "@vue/compiler-ssr": "3.4.24", - "@vue/shared": "3.4.24" + "@vue/compiler-ssr": "3.4.27", + "@vue/shared": "3.4.27" } }, "@vue/shared": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.24.tgz", - "integrity": "sha512-BW4tajrJBM9AGAknnyEw5tO2xTmnqgup0VTnDAMcxYmqOX0RG0b9aSUGAbEKolD91tdwpA6oCwbltoJoNzpItw==" + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", + "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" }, "@vue/test-utils": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.5.tgz", - "integrity": "sha512-oo2u7vktOyKUked36R93NB7mg2B+N7Plr8lxp2JBGwr18ch6EggFjixSCdIVVLkT6Qr0z359Xvnafc9dcKyDUg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz", + "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==", "dev": true, "requires": { "js-beautify": "^1.14.9", @@ -21166,9 +21866,9 @@ "dev": true }, "axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "requires": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -21732,30 +22432,13 @@ "dev": true }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - }, - "dependencies": { - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - } + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, "camelcase": { @@ -21916,9 +22599,9 @@ "dev": true }, "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -22379,15 +23062,15 @@ "dev": true }, "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "requires": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" } }, "crc-32": { @@ -22518,9 +23201,9 @@ } }, "cypress": { - "version": "13.7.3", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.3.tgz", - "integrity": "sha512-uoecY6FTCAuIEqLUYkTrxamDBjMHTYak/1O7jtgwboHiTnS1NaMOoR08KcTrbRZFCBvYOiS4tEkQRmsV+xcrag==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.10.0.tgz", + "integrity": "sha512-tOhwRlurVOQbMduX+KonoMeQILs2cwR3yHGGENoFvvSoLUBHmJ8b9/n21gFSDqjlOJ+SRVcwuh+fG/JDsHsT6Q==", "dev": true, "requires": { "@cypress/request": "^3.0.0", @@ -22859,6 +23542,16 @@ "domhandler": "^5.0.3" } }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -23043,6 +23736,12 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -23493,9 +24192,9 @@ } }, "eslint-plugin-cypress": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.2.tgz", - "integrity": "sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-3.2.0.tgz", + "integrity": "sha512-HaxMz6BoU4ay+K4WrG9ZJC1NdX06FqSlAwtRDStjM0ORFT7zCNPNuRJ+kUPc17Rt2AMUBSqeD9L0zTR3uZhPpw==", "dev": true, "requires": { "globals": "^13.20.0" @@ -23570,52 +24269,34 @@ } }, "eslint-plugin-jsdoc": { - "version": "48.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.3.tgz", - "integrity": "sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==", + "version": "48.2.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz", + "integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.42.0", + "@es-joy/jsdoccomment": "~0.43.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", "is-builtin-module": "^3.2.1", - "semver": "^7.6.0", + "semver": "^7.6.1", "spdx-expression-parse": "^4.0.0" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true } } }, "eslint-plugin-vue": { - "version": "9.25.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz", - "integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz", + "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", @@ -24551,27 +25232,19 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "dev": true, "requires": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" - }, - "dependencies": { - "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 - } + "terser": "^5.15.1" } }, "htmlescape": { @@ -25201,21 +25874,21 @@ "dev": true }, "jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", "dev": true, "requires": { "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", + "@types/markdown-it": "^14.1.1", "bluebird": "^3.7.2", "catharsis": "^0.9.0", "escape-string-regexp": "^2.0.0", "js2xmlparser": "^4.0.2", "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", "marked": "^4.0.10", "mkdirp": "^1.0.4", "requizzle": "^0.2.3", @@ -25513,12 +26186,12 @@ "dev": true }, "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "requires": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "listr2": { @@ -25803,24 +26476,17 @@ } }, "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "requires": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true - } + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" } }, "markdown-it-anchor": { @@ -25848,9 +26514,9 @@ } }, "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "media-typer": { @@ -26524,29 +27190,13 @@ "dev": true }, "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "no-case": "^2.2.0" - }, - "dependencies": { - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - } + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "parent-module": { @@ -26604,6 +27254,16 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", @@ -26664,12 +27324,6 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, "pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -26923,6 +27577,12 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true + }, "qs": { "version": "6.10.4", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", @@ -26933,9 +27593,9 @@ } }, "quasar": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.15.3.tgz", - "integrity": "sha512-+6g6D1t/O95dhuov4b6SwR3asowr01xwV1A2JWh5cVQc1hTmolXzgQNPbrOApLjGX7N1cQ119DWajJ/G8KzXPQ==" + "version": "2.16.4", + "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.16.4.tgz", + "integrity": "sha512-ICntco9uZ4PeyLgzVckjK3fsS+LG7+rOUmRyR7Gq3XpfeCADs1edIRjlxsPpWBBJvK/9AHLGPO6XNmnJmdJm0A==" }, "querystring-es3": { "version": "0.2.1", @@ -27001,9 +27661,9 @@ } }, "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, "read-only-stream": { @@ -27200,9 +27860,9 @@ } }, "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", "dev": true }, "regenerate": { @@ -28448,6 +29108,26 @@ "readable-stream": "^3.1.1" } }, + "terser": { + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "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 + } + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -28810,9 +29490,9 @@ "dev": true }, "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "ufo": { @@ -28821,12 +29501,6 @@ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true - }, "umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", @@ -28926,12 +29600,6 @@ "picocolors": "^1.0.0" } }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true - }, "upper-case-first": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", @@ -29287,9 +29955,9 @@ } }, "vite-node": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.0.tgz", - "integrity": "sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", "dev": true, "requires": { "cac": "^6.7.14", @@ -29460,6 +30128,111 @@ "dev": true, "optional": true }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "dev": true, + "optional": true + }, "esbuild": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", @@ -29492,34 +30265,35 @@ } }, "rollup": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.2.tgz", - "integrity": "sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "requires": { - "@rollup/rollup-android-arm-eabi": "4.14.2", - "@rollup/rollup-android-arm64": "4.14.2", - "@rollup/rollup-darwin-arm64": "4.14.2", - "@rollup/rollup-darwin-x64": "4.14.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.14.2", - "@rollup/rollup-linux-arm64-gnu": "4.14.2", - "@rollup/rollup-linux-arm64-musl": "4.14.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.14.2", - "@rollup/rollup-linux-riscv64-gnu": "4.14.2", - "@rollup/rollup-linux-s390x-gnu": "4.14.2", - "@rollup/rollup-linux-x64-gnu": "4.14.2", - "@rollup/rollup-linux-x64-musl": "4.14.2", - "@rollup/rollup-win32-arm64-msvc": "4.14.2", - "@rollup/rollup-win32-ia32-msvc": "4.14.2", - "@rollup/rollup-win32-x64-msvc": "4.14.2", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "@types/estree": "1.0.5", "fsevents": "~2.3.2" } }, "vite": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", - "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "dev": true, "requires": { "esbuild": "^0.20.1", @@ -29542,16 +30316,16 @@ } }, "vitest": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.0.tgz", - "integrity": "sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "dev": true, "requires": { - "@vitest/expect": "1.5.0", - "@vitest/runner": "1.5.0", - "@vitest/snapshot": "1.5.0", - "@vitest/spy": "1.5.0", - "@vitest/utils": "1.5.0", + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -29565,7 +30339,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.5.0", + "vite-node": "1.6.0", "why-is-node-running": "^2.2.2" }, "dependencies": { @@ -29890,15 +30664,15 @@ "dev": true }, "vue": { - "version": "3.4.24", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.24.tgz", - "integrity": "sha512-NPdx7dLGyHmKHGRRU5bMRYVE+rechR+KDU5R2tSTNG36PuMwbfAJ+amEvOAw7BPfZp5sQulNELSLm5YUkau+Sg==", - "requires": { - "@vue/compiler-dom": "3.4.24", - "@vue/compiler-sfc": "3.4.24", - "@vue/runtime-dom": "3.4.24", - "@vue/server-renderer": "3.4.24", - "@vue/shared": "3.4.24" + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", + "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", + "requires": { + "@vue/compiler-dom": "3.4.27", + "@vue/compiler-sfc": "3.4.27", + "@vue/runtime-dom": "3.4.27", + "@vue/server-renderer": "3.4.27", + "@vue/shared": "3.4.27" } }, "vue-3-sanitize": { diff --git a/package.json b/package.json index 9a6affdc..adb6c83c 100644 --- a/package.json +++ b/package.json @@ -18,37 +18,37 @@ }, "dependencies": { "@quasar/extras": "=1.16.11", - "axios": "=1.6.8", + "axios": "=1.7.2", "pinia": "=2.1.7", - "quasar": "=2.15.3", + "quasar": "=2.16.4", "v-viewer": "=3.0.13", - "vue": "=3.4.24", + "vue": "=3.4.27", "vue-3-sanitize": "=0.1.4", "vue-i18n": "=9.13.1", "vue-router": "=4.3.2" }, "devDependencies": { "@4tw/cypress-drag-drop": "=2.2.5", - "@badeball/cypress-cucumber-preprocessor": "=20.0.4", + "@badeball/cypress-cucumber-preprocessor": "=20.0.5", "@cypress/browserify-preprocessor": "=3.0.2", "@intlify/vite-plugin-vue-i18n": "=6.0.3", - "@quasar/app-vite": "=1.8.2", + "@quasar/app-vite": "=1.9.3", "@quasar/quasar-app-extension-testing-unit-vitest": "=1.0.0", - "@vitest/coverage-v8": "=1.5.0", - "@vue/test-utils": "=2.4.5", + "@vitest/coverage-v8": "=1.6.0", + "@vue/test-utils": "=2.4.6", "autoprefixer": "=10.4.19", - "cypress": "=13.7.3", + "cypress": "=13.10.0", "cypress-real-events": "=1.12.0", "eslint": "=8.57.0", "eslint-config-airbnb-base": "=15.0.0", - "eslint-plugin-cypress": "=2.15.2", + "eslint-plugin-cypress": "=3.2.0", "eslint-plugin-import": "=2.29.1", - "eslint-plugin-jsdoc": "=48.2.3", - "eslint-plugin-vue": "=9.25.0", + "eslint-plugin-jsdoc": "=48.2.5", + "eslint-plugin-vue": "=9.26.0", "gherkin-lint": "=4.2.4", - "jsdoc": "=4.0.2", + "jsdoc": "=4.0.3", "nunjucks": "=3.2.4", - "vitest": "=1.5.0" + "vitest": "=1.6.0" }, "engines": { "node": "^18 || ^16 || ^14.19",