From 1f24865caf908a68054c078adbc21f42ddeb526f Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Tue, 7 Oct 2025 14:06:39 +0200 Subject: [PATCH] chore(tests): drop legacy Karma tests we no longer use Karma tests, all actual tests have been migrated to vitest. The leftover tests are already covered by unit tests in packages. Signed-off-by: Ferdinand Thiessen --- .github/workflows/node-test.yml | 33 +- core/js/tests/html-domparser.js | 44 - core/js/tests/specHelper.js | 191 -- core/js/tests/specs/coreSpec.js | 1147 ----------- core/js/tests/specs/files/clientSpec.js | 838 -------- core/js/tests/specs/jquery.avatarSpec.js | 219 -- core/js/tests/specs/jquery.placeholderSpec.js | 37 - core/js/tests/specs/l10nSpec.js | 89 - core/js/tests/specs/oc-backbone-webdavSpec.js | 394 ---- package-lock.json | 1772 ++--------------- package.json | 12 - tests/karma.config.js | 194 -- 12 files changed, 120 insertions(+), 4850 deletions(-) delete mode 100644 core/js/tests/html-domparser.js delete mode 100644 core/js/tests/specHelper.js delete mode 100644 core/js/tests/specs/coreSpec.js delete mode 100644 core/js/tests/specs/files/clientSpec.js delete mode 100644 core/js/tests/specs/jquery.avatarSpec.js delete mode 100644 core/js/tests/specs/jquery.placeholderSpec.js delete mode 100644 core/js/tests/specs/l10nSpec.js delete mode 100644 core/js/tests/specs/oc-backbone-webdavSpec.js delete mode 100644 tests/karma.config.js diff --git a/.github/workflows/node-test.yml b/.github/workflows/node-test.yml index 949d7d4d85b..2e465ec32f0 100644 --- a/.github/workflows/node-test.yml +++ b/.github/workflows/node-test.yml @@ -114,35 +114,6 @@ jobs: if: ${{ !cancelled() }} uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1 - jsunit: - runs-on: ubuntu-latest - needs: [versions, changes] - - if: ${{ needs.versions.result != 'failure' && needs.changes.outputs.src != 'false' }} - - env: - CYPRESS_INSTALL_BINARY: 0 - - steps: - - name: Checkout - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - - name: Set up node ${{ needs.versions.outputs.nodeVersion }} - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ needs.versions.outputs.nodeVersion }} - - - name: Set up npm ${{ needs.versions.outputs.npmVersion }} - run: npm i -g 'npm@${{ needs.versions.outputs.npmVersion }}' - - - name: Install dependencies - run: npm ci - - - name: Test - run: npm run test:jsunit - handlebars: runs-on: ubuntu-latest needs: [versions, changes] @@ -177,7 +148,7 @@ jobs: permissions: contents: none runs-on: ubuntu-latest-low - needs: [changes, test, jsunit, handlebars] + needs: [changes, test, handlebars] if: always() @@ -185,4 +156,4 @@ jobs: steps: - name: Summary status - run: if ${{ needs.changes.outputs.src != 'false' && (needs.test.result != 'success' || needs.jsunit.result != 'success' || needs.handlebars.result != 'success') }}; then exit 1; fi + run: if ${{ needs.changes.outputs.src != 'false' && (needs.test.result != 'success' || needs.handlebars.result != 'success') }}; then exit 1; fi diff --git a/core/js/tests/html-domparser.js b/core/js/tests/html-domparser.js deleted file mode 100644 index a4a43b694f4..00000000000 --- a/core/js/tests/html-domparser.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * DOMParser HTML extension - * 2012-09-04 - * - * By Eli Grey, http://eligrey.com - * Public domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - * - * SPDX-FileCopyrightText: 2012 Eli Grey, http://eligrey.com - * SPDX-License-Identifier: CC0-1.0 - */ - -/*! @source https://gist.github.com/1129031 */ -/* global document, DOMParser */ - -(function(DOMParser) { - 'use strict' - - const DOMParser_proto = DOMParser.prototype - const real_parseFromString = DOMParser_proto.parseFromString - - // Firefox/Opera/IE throw errors on unsupported types - try { - // WebKit returns null on unsupported types - if ((new DOMParser()).parseFromString('', 'text/html')) { - // text/html parsing is natively supported - return - } - } catch (ex) {} - - DOMParser_proto.parseFromString = function(markup, type) { - if (/^\s*text\/html\s*(?:;|$)/i.test(type)) { - const doc = document.implementation.createHTMLDocument('') - if (markup.toLowerCase().indexOf(' -1) { - doc.documentElement.innerHTML = markup - } else { - doc.body.innerHTML = markup - } - return doc - } else { - return real_parseFromString.apply(this, arguments) - } - } -}(DOMParser)) diff --git a/core/js/tests/specHelper.js b/core/js/tests/specHelper.js deleted file mode 100644 index 6d3e39a243a..00000000000 --- a/core/js/tests/specHelper.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2014 ownCloud Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -/** - * Simulate the variables that are normally set by PHP code - */ - -// from core/js/config.php -window.TESTING = true -window.datepickerFormatDate = 'MM d, yy' -window.dayNames = [ - 'Sunday', - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday', -] -window.dayNamesShort = [ - 'Sun.', - 'Mon.', - 'Tue.', - 'Wed.', - 'Thu.', - 'Fri.', - 'Sat.', -] -window.dayNamesMin = [ - 'Su', - 'Mo', - 'Tu', - 'We', - 'Th', - 'Fr', - 'Sa', -] -window.monthNames = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', -] -window.monthNamesShort = [ - 'Jan.', - 'Feb.', - 'Mar.', - 'Apr.', - 'May.', - 'Jun.', - 'Jul.', - 'Aug.', - 'Sep.', - 'Oct.', - 'Nov.', - 'Dec.', -] -window.firstDay = 0 - -// setup dummy webroots -/* jshint camelcase: false */ -window.oc_debug = true - -// Mock @nextcloud/capabilities -window._oc_capabilities = { - files_sharing: { - api_enabled: true, - }, -} - -// FIXME: OC.webroot is supposed to be only the path!!! -window._oc_webroot = location.href + '/' -window._oc_appswebroots = { - files: window.webroot + '/apps/files/', - files_sharing: window.webroot + '/apps/files_sharing/', -} - -window.OC ??= {} - -OC.config = { - session_lifetime: 600 * 1000, - session_keepalive: false, - blacklist_files_regex: '\.(part|filepart)$', - version: '32.0.0', -} -OC.appConfig = { - core: {}, -} -OC.theme = { - docPlaceholderUrl: 'https://docs.example.org/PLACEHOLDER', -} -window.oc_capabilities = { -} - -/* jshint camelcase: true */ - -// mock for Snap.js plugin -window.Snap = function() {} -window.Snap.prototype = { - enable: function() {}, - disable: function() {}, - close: function() {}, -} - -window.isPhantom = /phantom/i.test(navigator.userAgent) -document.documentElement.lang = navigator.language -const el = document.createElement('input') -el.id = 'initial-state-core-config' -el.value = btoa(JSON.stringify(window.OC.config)) -document.body.append(el); - -// global setup for all tests -(function setupTests() { - let fakeServer = null, - $testArea = null, - ajaxErrorStub = null - - /** - * Utility functions for testing - */ - const TestUtil = { - /** - * Returns the image URL set on the given element - * @param $el element - * @return {String} image URL - */ - getImageUrl: function($el) { - // might be slightly different cross-browser - const url = $el.css('background-image') - const r = url.match(/url\(['"]?([^'")]*)['"]?\)/) - if (!r) { - return url - } - return r[1] - }, - } - - beforeEach(function() { - // test area for elements that need absolute selector access or measure widths/heights - // which wouldn't work for detached or hidden elements - $testArea = $('
') - $('body').append($testArea) - // enforce fake XHR, tests should not depend on the server and - // must use fake responses for expected calls - fakeServer = sinon.fakeServer.create() - - // make it globally available, so that other tests can define - // custom responses - window.fakeServer = fakeServer - - if (!OC.TestUtil) { - OC.TestUtil = TestUtil - } - - moment.locale('en') - - // reset plugins - OC.Plugins._plugins = [] - - // dummy select2 (which isn't loaded during the tests) - $.fn.select2 = function() { return this } - - ajaxErrorStub = sinon.stub(OC, '_processAjaxError') - }) - - afterEach(function() { - // uncomment this to log requests - // console.log(window.fakeServer.requests); - fakeServer.restore() - - $testArea.remove() - - delete ($.fn.select2) - - ajaxErrorStub.restore() - - // reset pop state handlers - OC.Util.History._handlers = [] - }) -})() diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js deleted file mode 100644 index 05d29343074..00000000000 --- a/core/js/tests/specs/coreSpec.js +++ /dev/null @@ -1,1147 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2014 ownCloud Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -describe('Core base tests', function() { - let debounceStub - beforeEach(function() { - debounceStub = sinon.stub(_, 'debounce').callsFake(function(callback) { - return function() { - // defer instead of debounce, to make it work with clock - _.defer(callback) - } - }) - }) - afterEach(function() { - // many tests call window.initCore so need to unregister global events - // ideally in the future we'll need a window.unloadCore() function - $(document).off('ajaxError.main') - $(document).off('unload.main') - $(document).off('beforeunload.main') - OC._userIsNavigatingAway = false - OC._reloadCalled = false - debounceStub.restore() - }) - describe('Base values', function() { - it('Sets webroots', function() { - expect(OC.getRootPath()).toBeDefined() - expect(window._oc_appswebroots).toBeDefined() - }) - }) - describe('filePath', function() { - beforeEach(function() { - window._oc_webroot = 'http://localhost' - window._oc_appswebroots.files = OC.getRootPath() + '/apps3/files' - }) - afterEach(function() { - delete window._oc_appswebroots.files - }) - - it('Uses a direct link for css and images,', function() { - expect(OC.filePath('core', 'css', 'style.css')).toEqual('http://localhost/core/css/style.css') - expect(OC.filePath('files', 'css', 'style.css')).toEqual('http://localhost/apps3/files/css/style.css') - expect(OC.filePath('core', 'img', 'image.png')).toEqual('http://localhost/core/img/image.png') - expect(OC.filePath('files', 'img', 'image.png')).toEqual('http://localhost/apps3/files/img/image.png') - }) - it('Routes PHP files via index.php,', function() { - expect(OC.filePath('core', 'ajax', 'test.php')).toEqual('http://localhost/index.php/core/ajax/test.php') - expect(OC.filePath('files', 'ajax', 'test.php')).toEqual('http://localhost/index.php/apps/files/ajax/test.php') - }) - }) - describe('Link functions', function() { - const TESTAPP = 'testapp' - const TESTAPP_ROOT = OC.getRootPath() + '/appsx/testapp' - - beforeEach(function() { - window._oc_appswebroots[TESTAPP] = TESTAPP_ROOT - }) - afterEach(function() { - // restore original array - delete window._oc_appswebroots[TESTAPP] - }) - it('Generates correct links for core apps', function() { - expect(OC.linkTo('core', 'somefile.php')).toEqual(OC.getRootPath() + '/core/somefile.php') - expect(OC.linkTo('admin', 'somefile.php')).toEqual(OC.getRootPath() + '/admin/somefile.php') - }) - it('Generates correct links for regular apps', function() { - expect(OC.linkTo(TESTAPP, 'somefile.php')).toEqual(OC.getRootPath() + '/index.php/apps/' + TESTAPP + '/somefile.php') - }) - it('Generates correct remote links', function() { - expect(OC.linkToRemote('webdav')).toEqual(window.location.protocol + '//' + window.location.host + OC.getRootPath() + '/remote.php/webdav') - }) - describe('Images', function() { - it('Generates image path with given extension', function() { - expect(OC.imagePath('core', 'somefile.jpg')).toEqual(OC.getRootPath() + '/core/img/somefile.jpg') - expect(OC.imagePath(TESTAPP, 'somefile.jpg')).toEqual(TESTAPP_ROOT + '/img/somefile.jpg') - }) - it('Generates image path with svg extension', function() { - expect(OC.imagePath('core', 'somefile')).toEqual(OC.getRootPath() + '/core/img/somefile.svg') - expect(OC.imagePath(TESTAPP, 'somefile')).toEqual(TESTAPP_ROOT + '/img/somefile.svg') - }) - }) - }) - describe('Query string building', function() { - it('Returns empty string when empty params', function() { - expect(OC.buildQueryString()).toEqual('') - expect(OC.buildQueryString({})).toEqual('') - }) - it('Encodes regular query strings', function() { - expect(OC.buildQueryString({ - a: 'abc', - b: 'def', - })).toEqual('a=abc&b=def') - }) - it('Encodes special characters', function() { - expect(OC.buildQueryString({ - unicode: '汉字', - })).toEqual('unicode=%E6%B1%89%E5%AD%97') - expect(OC.buildQueryString({ - b: 'spaace value', - 'space key': 'normalvalue', - 'slash/this': 'amp&ersand', - })).toEqual('b=spaace%20value&space%20key=normalvalue&slash%2Fthis=amp%26ersand') - }) - it('Encodes data types and empty values', function() { - expect(OC.buildQueryString({ - keywithemptystring: '', - keywithnull: null, - keywithundefined: null, - something: 'else', - })).toEqual('keywithemptystring=&keywithnull&keywithundefined&something=else') - expect(OC.buildQueryString({ - booleanfalse: false, - booleantrue: true, - })).toEqual('booleanfalse=false&booleantrue=true') - expect(OC.buildQueryString({ - number: 123, - })).toEqual('number=123') - }) - }) - describe('Parse query string', function() { - it('Parses query string from full URL', function() { - const query = OC.parseQueryString('http://localhost/stuff.php?q=a&b=x') - expect(query).toEqual({ q: 'a', b: 'x' }) - }) - it('Parses query string from query part alone', function() { - const query = OC.parseQueryString('q=a&b=x') - expect(query).toEqual({ q: 'a', b: 'x' }) - }) - it('Returns null hash when empty query', function() { - const query = OC.parseQueryString('') - expect(query).toEqual(null) - }) - it('Returns empty hash when empty query with question mark', function() { - const query = OC.parseQueryString('?') - expect(query).toEqual({}) - }) - it('Decodes regular query strings', function() { - const query = OC.parseQueryString('a=abc&b=def') - expect(query).toEqual({ - a: 'abc', - b: 'def', - }) - }) - it('Ignores empty parts', function() { - const query = OC.parseQueryString('&q=a&&b=x&') - expect(query).toEqual({ q: 'a', b: 'x' }) - }) - it('Ignores lone equal signs', function() { - const query = OC.parseQueryString('&q=a&=&b=x&') - expect(query).toEqual({ q: 'a', b: 'x' }) - }) - it('Includes extra equal signs in value', function() { - const query = OC.parseQueryString('u=a=x&q=a=b') - expect(query).toEqual({ u: 'a=x', q: 'a=b' }) - }) - it('Decodes plus as space', function() { - const query = OC.parseQueryString('space+key=space+value') - expect(query).toEqual({ 'space key': 'space value' }) - }) - it('Decodes special characters', function() { - let query = OC.parseQueryString('unicode=%E6%B1%89%E5%AD%97') - expect(query).toEqual({ unicode: '汉字' }) - query = OC.parseQueryString('b=spaace%20value&space%20key=normalvalue&slash%2Fthis=amp%26ersand') - expect(query).toEqual({ - b: 'spaace value', - 'space key': 'normalvalue', - 'slash/this': 'amp&ersand', - }) - }) - it('Decodes empty values', function() { - const query = OC.parseQueryString('keywithemptystring=&keywithnostring') - expect(query).toEqual({ - keywithemptystring: '', - keywithnostring: null, - }) - }) - it('Does not interpret data types', function() { - const query = OC.parseQueryString('booleanfalse=false&booleantrue=true&number=123') - expect(query).toEqual({ - booleanfalse: 'false', - booleantrue: 'true', - number: '123', - }) - }) - }) - describe('Generate Url', function() { - it('returns absolute urls', function() { - expect(OC.generateUrl('csrftoken')).toEqual(OC.getRootPath() + '/index.php/csrftoken') - expect(OC.generateUrl('/csrftoken')).toEqual(OC.getRootPath() + '/index.php/csrftoken') - }) - it('substitutes parameters which are escaped by default', function() { - expect(OC.generateUrl('apps/files/download/{file}', { file: '<">ImAnUnescapedString/!' })).toEqual(OC.getRootPath() + '/index.php/apps/files/download/%3C%22%3EImAnUnescapedString%2F!') - }) - it('substitutes parameters which can also be unescaped via option flag', function() { - expect(OC.generateUrl('apps/files/download/{file}', { file: 'subfolder/Welcome.txt' }, { escape: false })).toEqual(OC.getRootPath() + '/index.php/apps/files/download/subfolder/Welcome.txt') - }) - it('substitutes multiple parameters which are escaped by default', function() { - expect(OC.generateUrl('apps/files/download/{file}/{id}', { file: '<">ImAnUnescapedString/!', id: 5 })).toEqual(OC.getRootPath() + '/index.php/apps/files/download/%3C%22%3EImAnUnescapedString%2F!/5') - }) - it('substitutes multiple parameters which can also be unescaped via option flag', function() { - expect(OC.generateUrl('apps/files/download/{file}/{id}', { file: 'subfolder/Welcome.txt', id: 5 }, { escape: false })).toEqual(OC.getRootPath() + '/index.php/apps/files/download/subfolder/Welcome.txt/5') - }) - it('doesnt error out with no params provided', function() { - expect(OC.generateUrl('apps/files/download{file}')).toEqual(OC.getRootPath() + '/index.php/apps/files/download%7Bfile%7D') - }) - }) - describe('Util', function() { - describe('computerFileSize', function() { - it('correctly parses file sizes from a human readable formated string', function() { - const data = [ - ['125', 125], - ['125.25', 125], - ['125.25B', 125], - ['125.25 B', 125], - ['0 B', 0], - ['99999999999999999999999999999999999999999999 B', 99999999999999999999999999999999999999999999], - ['0 MB', 0], - ['0 kB', 0], - ['0kB', 0], - ['125 B', 125], - ['125b', 125], - ['125 KB', 128000], - ['125kb', 128000], - ['122.1 MB', 128031130], - ['122.1mb', 128031130], - ['119.2 GB', 127990025421], - ['119.2gb', 127990025421], - ['116.4 TB', 127983153473126], - ['116.4tb', 127983153473126], - ['8776656778888777655.4tb', 9.650036181387265e+30], - [1234, null], - [-1234, null], - ['-1234 B', null], - ['B', null], - ['40/0', null], - ['40,30 kb', null], - [' 122.1 MB ', 128031130], - ['122.1 MB ', 128031130], - [' 122.1 MB ', 128031130], - [' 122.1 MB ', 128031130], - ['122.1 MB ', 128031130], - [' 125', 125], - [' 125 ', 125], - ] - for (let i = 0; i < data.length; i++) { - expect(OC.Util.computerFileSize(data[i][0])).toEqual(data[i][1]) - } - }) - it('returns null if the parameter is not a string', function() { - expect(OC.Util.computerFileSize(NaN)).toEqual(null) - expect(OC.Util.computerFileSize(125)).toEqual(null) - }) - it('returns null if the string is unparsable', function() { - expect(OC.Util.computerFileSize('')).toEqual(null) - expect(OC.Util.computerFileSize('foobar')).toEqual(null) - }) - }) - describe('stripTime', function() { - it('strips time from dates', function() { - expect(OC.Util.stripTime(new Date(2014, 2, 24, 15, 4, 45, 24))) - .toEqual(new Date(2014, 2, 24, 0, 0, 0, 0)) - }) - }) - }) - describe('naturalSortCompare', function() { - // cit() will skip tests if running on PhantomJS because it has issues with - // localeCompare(). See https://github.com/ariya/phantomjs/issues/11063 - // - // Please make sure to run these tests in Chrome/Firefox manually - // to make sure they run. - const cit = window.isPhantom ? xit : it - - // must provide the same results as \OCP\Util::naturalSortCompare - it('sorts alphabetically', function() { - const a = [ - 'def', - 'xyz', - 'abc', - ] - a.sort(OC.Util.naturalSortCompare) - expect(a).toEqual([ - 'abc', - 'def', - 'xyz', - ]) - }) - cit('sorts with different casing', function() { - const a = [ - 'aaa', - 'bbb', - 'BBB', - 'AAA', - ] - a.sort(OC.Util.naturalSortCompare) - expect(a).toEqual([ - 'aaa', - 'AAA', - 'bbb', - 'BBB', - ]) - }) - it('sorts with numbers', function() { - const a = [ - '124.txt', - 'abc1', - '123.txt', - 'abc', - 'abc2', - 'def (2).txt', - 'ghi 10.txt', - 'abc12', - 'def.txt', - 'def (1).txt', - 'ghi 2.txt', - 'def (10).txt', - 'abc10', - 'def (12).txt', - 'z', - 'ghi.txt', - 'za', - 'ghi 1.txt', - 'ghi 12.txt', - 'zz', - '15.txt', - '15b.txt', - ] - a.sort(OC.Util.naturalSortCompare) - expect(a).toEqual([ - '15.txt', - '15b.txt', - '123.txt', - '124.txt', - 'abc', - 'abc1', - 'abc2', - 'abc10', - 'abc12', - 'def.txt', - 'def (1).txt', - 'def (2).txt', - 'def (10).txt', - 'def (12).txt', - 'ghi.txt', - 'ghi 1.txt', - 'ghi 2.txt', - 'ghi 10.txt', - 'ghi 12.txt', - 'z', - 'za', - 'zz', - ]) - }) - it('sorts with chinese characters', function() { - const a = [ - '十.txt', - '一.txt', - '二.txt', - '十 2.txt', - '三.txt', - '四.txt', - 'abc.txt', - '五.txt', - '七.txt', - '八.txt', - '九.txt', - '六.txt', - '十一.txt', - '波.txt', - '破.txt', - '莫.txt', - '啊.txt', - '123.txt', - ] - a.sort(OC.Util.naturalSortCompare) - expect(a).toEqual([ - '123.txt', - 'abc.txt', - '一.txt', - '七.txt', - '三.txt', - '九.txt', - '二.txt', - '五.txt', - '八.txt', - '六.txt', - '十.txt', - '十 2.txt', - '十一.txt', - '啊.txt', - '四.txt', - '波.txt', - '破.txt', - '莫.txt', - ]) - }) - cit('sorts with umlauts', function() { - const a = [ - 'öh.txt', - 'Äh.txt', - 'oh.txt', - 'Üh 2.txt', - 'Üh.txt', - 'ah.txt', - 'Öh.txt', - 'uh.txt', - 'üh.txt', - 'äh.txt', - ] - a.sort(OC.Util.naturalSortCompare) - expect(a).toEqual([ - 'ah.txt', - 'äh.txt', - 'Äh.txt', - 'oh.txt', - 'öh.txt', - 'Öh.txt', - 'uh.txt', - 'üh.txt', - 'Üh.txt', - 'Üh 2.txt', - ]) - }) - }) - describe('Plugins', function() { - let plugin - - beforeEach(function() { - plugin = { - name: 'Some name', - attach: function(obj) { - obj.attached = true - }, - - detach: function(obj) { - obj.attached = false - }, - } - OC.Plugins.register('OC.Test.SomeName', plugin) - }) - it('attach plugin to object', function() { - const obj = { something: true } - OC.Plugins.attach('OC.Test.SomeName', obj) - expect(obj.attached).toEqual(true) - OC.Plugins.detach('OC.Test.SomeName', obj) - expect(obj.attached).toEqual(false) - }) - it('only call handler for target name', function() { - const obj = { something: true } - OC.Plugins.attach('OC.Test.SomeOtherName', obj) - expect(obj.attached).not.toBeDefined() - OC.Plugins.detach('OC.Test.SomeOtherName', obj) - expect(obj.attached).not.toBeDefined() - }) - }) - describe('Notifications', function() { - let showHtmlSpy - let clock - - /** - * Returns the HTML or plain text of the given notification row. - * - * This is needed to ignore the close button that is added to the - * notification row after the text. - */ - const getNotificationText = function($node) { - return $node.contents()[0].outerHTML - || $node.contents()[0].nodeValue - } - - beforeEach(function() { - clock = sinon.useFakeTimers() - }) - afterEach(function() { - // jump past animations - clock.tick(10000) - clock.restore() - $('body .toastify').remove() - }) - describe('showTemporary', function() { - it('shows a plain text notification with default timeout', function() { - OC.Notification.showTemporary('My notification test') - - const $row = $('body .toastify') - expect($row.length).toEqual(1) - expect(getNotificationText($row)).toEqual('My notification test') - }) - it('shows a HTML notification with default timeout', function() { - OC.Notification.showTemporary('My notification test', { isHTML: true }) - - const $row = $('body .toastify') - expect($row.length).toEqual(1) - expect(getNotificationText($row)).toEqual('My notification test') - }) - it('hides itself after 7 seconds', function() { - OC.Notification.showTemporary('') - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - // travel in time +7000 milliseconds - clock.tick(7500) - - $row = $('body .toastify') - expect($row.length).toEqual(0) - }) - it('hides itself after a given time', function() { - OC.Notification.showTemporary('', { timeout: 10000 }) - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - // travel in time +7000 milliseconds - clock.tick(7500) - - $row = $('body .toastify') - expect($row.length).toEqual(1) - - // travel in time another 4000 milliseconds - clock.tick(4000) - - $row = $('body .toastify') - expect($row.length).toEqual(0) - }) - }) - describe('show', function() { - it('hides itself after a given time', function() { - OC.Notification.show('', { timeout: 10000 }) - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - clock.tick(11500) - - $row = $('body .toastify') - expect($row.length).toEqual(0) - }) - it('does not hide itself if no timeout given to show', function() { - OC.Notification.show('') - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - // travel in time +1000 seconds - clock.tick(1000000) - - $row = $('body .toastify') - expect($row.length).toEqual(1) - }) - }) - describe('showHtml', function() { - it('hides itself after a given time', function() { - OC.Notification.showHtml('

', { timeout: 10000 }) - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - clock.tick(11500) - - $row = $('body .toastify') - expect($row.length).toEqual(0) - }) - it('does not hide itself if no timeout given to show', function() { - OC.Notification.showHtml('

') - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - // travel in time +1000 seconds - clock.tick(1000000) - - $row = $('body .toastify') - expect($row.length).toEqual(1) - }) - }) - describe('hide', function() { - it('hides a temporary notification before its timeout expires', function() { - const hideCallback = sinon.spy() - - const notification = OC.Notification.showTemporary('') - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - OC.Notification.hide(notification, hideCallback) - - // Give time to the hide animation to finish - clock.tick(1000) - - $row = $('body .toastify') - expect($row.length).toEqual(0) - - expect(hideCallback.calledOnce).toEqual(true) - }) - it('hides a notification before its timeout expires', function() { - const hideCallback = sinon.spy() - - const notification = OC.Notification.show('', { timeout: 10000 }) - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - OC.Notification.hide(notification, hideCallback) - - // Give time to the hide animation to finish - clock.tick(1000) - - $row = $('body .toastify') - expect($row.length).toEqual(0) - - expect(hideCallback.calledOnce).toEqual(true) - }) - it('hides a notification without timeout', function() { - const hideCallback = sinon.spy() - - const notification = OC.Notification.show('') - - let $row = $('body .toastify') - expect($row.length).toEqual(1) - - OC.Notification.hide(notification, hideCallback) - - // Give time to the hide animation to finish - clock.tick(1000) - - $row = $('body .toastify') - expect($row.length).toEqual(0) - - expect(hideCallback.calledOnce).toEqual(true) - }) - }) - it('cumulates several notifications', function() { - const $row1 = OC.Notification.showTemporary('One') - const $row2 = OC.Notification.showTemporary('Two', { timeout: 2000 }) - const $row3 = OC.Notification.showTemporary('Three') - - const $el = $('body') - let $rows = $el.find('.toastify') - expect($rows.length).toEqual(3) - - expect($rows.eq(0).is($row3)).toEqual(true) - expect($rows.eq(1).is($row2)).toEqual(true) - expect($rows.eq(2).is($row1)).toEqual(true) - - clock.tick(3000) - - $rows = $el.find('.toastify') - expect($rows.length).toEqual(2) - - expect($rows.eq(0).is($row3)).toEqual(true) - expect($rows.eq(1).is($row1)).toEqual(true) - }) - it('hides the given notification when calling hide with argument', function() { - const $row1 = OC.Notification.show('One') - const $row2 = OC.Notification.show('Two') - - const $el = $('body') - let $rows = $el.find('.toastify') - expect($rows.length).toEqual(2) - - OC.Notification.hide($row2) - clock.tick(3000) - - $rows = $el.find('.toastify') - expect($rows.length).toEqual(1) - expect($rows.eq(0).is($row1)).toEqual(true) - }) - }) - describe('global ajax errors', function() { - let reloadStub, ajaxErrorStub, clock - let notificationStub - const waitTimeMs = 6500 - let oldCurrentUser - - beforeEach(function() { - oldCurrentUser = OC.currentUser - OC.currentUser = 'dummy' - clock = sinon.useFakeTimers() - reloadStub = sinon.stub(OC, 'reload') - document.head.dataset.user = 'dummy' - notificationStub = sinon.stub(OC.Notification, 'show') - // unstub the error processing method - ajaxErrorStub = OC._processAjaxError - ajaxErrorStub.restore() - window.initCore() - }) - afterEach(function() { - OC.currentUser = oldCurrentUser - reloadStub.restore() - notificationStub.restore() - clock.restore() - }) - - it('does not reload the page if the user was navigating away', function() { - const xhr = { status: 0 } - OC._userIsNavigatingAway = true - clock.tick(100) - - $(document).trigger(new $.Event('ajaxError'), xhr) - - clock.tick(waitTimeMs) - expect(reloadStub.notCalled).toEqual(true) - }) - - it('shows a temporary notification if the connection is lost', function() { - const xhr = { status: 0 } - spyOn(OC, '_ajaxConnectionLostHandler') - - $(document).trigger(new $.Event('ajaxError'), xhr) - clock.tick(101) - - expect(OC._ajaxConnectionLostHandler.calls.count()).toBe(1) - }) - }) - describe('Snapper', function() { - let snapConstructorStub - let snapperStub - let clock - - beforeEach(function() { - snapConstructorStub = sinon.stub(window, 'Snap') - snapperStub = {} - - snapperStub.enable = sinon.stub() - snapperStub.disable = sinon.stub() - snapperStub.close = sinon.stub() - snapperStub.on = sinon.stub() - snapperStub.state = sinon.stub().returns({ - state: sinon.stub(), - }) - - snapConstructorStub.returns(snapperStub) - - clock = sinon.useFakeTimers() - - // _.now could have been set to Date.now before Sinon replaced it - // with a fake version, so _.now must be stubbed to ensure that the - // fake Date.now will be called instead of the original one. - _.now = sinon.stub(_, 'now').callsFake(function() { - return new Date().getTime() - }) - - $('#testArea').append('
The navigation bar
Content
') - }) - afterEach(function() { - snapConstructorStub.restore() - - clock.restore() - - _.now.restore() - - // Remove the event handler for the resize event added to the window - // due to calling window.initCore() when there is an #app-navigation - // element. - $(window).off('resize') - - viewport.reset() - }) - - it('is enabled on a narrow screen', function() { - viewport.set(480) - - window.initCore() - - expect(snapConstructorStub.calledOnce).toBe(true) - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.called).toBe(false) - }) - it('is disabled when disallowing the gesture on a narrow screen', function() { - viewport.set(480) - - window.initCore() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.called).toBe(false) - expect(snapperStub.close.called).toBe(false) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.disable.alwaysCalledWithExactly(true)).toBe(true) - expect(snapperStub.close.called).toBe(false) - }) - it('is not disabled again when disallowing the gesture twice on a narrow screen', function() { - viewport.set(480) - - window.initCore() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.called).toBe(false) - expect(snapperStub.close.called).toBe(false) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.disable.alwaysCalledWithExactly(true)).toBe(true) - expect(snapperStub.close.called).toBe(false) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.called).toBe(false) - }) - it('is enabled when allowing the gesture after disallowing it on a narrow screen', function() { - viewport.set(480) - - window.initCore() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.called).toBe(false) - expect(snapperStub.close.called).toBe(false) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.disable.alwaysCalledWithExactly(true)).toBe(true) - expect(snapperStub.close.called).toBe(false) - - OC.allowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledTwice).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.called).toBe(false) - }) - it('is not enabled again when allowing the gesture twice after disallowing it on a narrow screen', function() { - viewport.set(480) - - window.initCore() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.called).toBe(false) - expect(snapperStub.close.called).toBe(false) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.disable.alwaysCalledWithExactly(true)).toBe(true) - expect(snapperStub.close.called).toBe(false) - - OC.allowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledTwice).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.called).toBe(false) - - OC.allowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledTwice).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.called).toBe(false) - }) - it('is disabled on a wide screen', function() { - viewport.set(1280) - - window.initCore() - - expect(snapConstructorStub.calledOnce).toBe(true) - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - }) - it('is not disabled again when disallowing the gesture on a wide screen', function() { - viewport.set(1280) - - window.initCore() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - }) - it('is not enabled when allowing the gesture after disallowing it on a wide screen', function() { - viewport.set(1280) - - window.initCore() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - - OC.allowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - }) - it('is enabled when resizing to a narrow screen', function() { - viewport.set(1280) - - window.initCore() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - viewport.set(480) - - // Setting the viewport width does not automatically trigger a - // resize. - $(window).resize() - - // The resize handler is debounced to be executed a few milliseconds - // after the resize event. - clock.tick(1000) - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - }) - it('is not enabled when resizing to a narrow screen after disallowing the gesture', function() { - viewport.set(1280) - - window.initCore() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - viewport.set(480) - - // Setting the viewport width does not automatically trigger a - // resize. - $(window).resize() - - // The resize handler is debounced to be executed a few milliseconds - // after the resize event. - clock.tick(1000) - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - }) - it('is enabled when resizing to a narrow screen after disallowing the gesture and allowing it', function() { - viewport.set(1280) - - window.initCore() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - OC.allowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - viewport.set(480) - - // Setting the viewport width does not automatically trigger a - // resize. - $(window).resize() - - // The resize handler is debounced to be executed a few milliseconds - // after the resize event. - clock.tick(1000) - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - }) - it('is enabled when allowing the gesture after disallowing it and resizing to a narrow screen', function() { - viewport.set(1280) - - window.initCore() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - viewport.set(480) - - // Setting the viewport width does not automatically trigger a - // resize. - $(window).resize() - - // The resize handler is debounced to be executed a few milliseconds - // after the resize event. - clock.tick(1000) - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - OC.allowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - }) - it('is disabled when disallowing the gesture after disallowing it, resizing to a narrow screen and allowing it', function() { - viewport.set(1280) - - window.initCore() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - viewport.set(480) - - // Setting the viewport width does not automatically trigger a - // resize. - $(window).resize() - - // The resize handler is debounced to be executed a few milliseconds - // after the resize event. - clock.tick(1000) - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - - OC.allowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledTwice).toBe(true) - expect(snapperStub.disable.getCall(1).calledWithExactly(true)).toBe(true) - }) - it('is disabled when resizing to a wide screen', function() { - viewport.set(480) - - window.initCore() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.called).toBe(false) - expect(snapperStub.close.called).toBe(false) - - viewport.set(1280) - - // Setting the viewport width does not automatically trigger a - // resize. - $(window).resize() - - // The resize handler is debounced to be executed a few milliseconds - // after the resize event. - clock.tick(1000) - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - }) - it('is not disabled again when disallowing the gesture after resizing to a wide screen', function() { - viewport.set(480) - - window.initCore() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.called).toBe(false) - expect(snapperStub.close.called).toBe(false) - - viewport.set(1280) - - // Setting the viewport width does not automatically trigger a - // resize. - $(window).resize() - - // The resize handler is debounced to be executed a few milliseconds - // after the resize event. - clock.tick(1000) - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.calledOnce).toBe(true) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - }) - it('is not enabled when allowing the gesture after disallowing it, resizing to a narrow screen and resizing to a wide screen', function() { - viewport.set(1280) - - window.initCore() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - - OC.disallowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - - viewport.set(480) - - // Setting the viewport width does not automatically trigger a - // resize. - $(window).resize() - - // The resize handler is debounced to be executed a few milliseconds - // after the resize event. - clock.tick(1000) - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledOnce).toBe(true) - expect(snapperStub.close.calledOnce).toBe(true) - - viewport.set(1280) - - $(window).resize() - - clock.tick(1000) - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledTwice).toBe(true) - expect(snapperStub.close.calledTwice).toBe(true) - - OC.allowNavigationBarSlideGesture() - - expect(snapperStub.enable.called).toBe(false) - expect(snapperStub.disable.calledTwice).toBe(true) - expect(snapperStub.close.calledTwice).toBe(true) - }) - }) -}) diff --git a/core/js/tests/specs/files/clientSpec.js b/core/js/tests/specs/files/clientSpec.js deleted file mode 100644 index 89e38bcc1a9..00000000000 --- a/core/js/tests/specs/files/clientSpec.js +++ /dev/null @@ -1,838 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -/* global dav */ - -describe('OC.Files.Client tests', function() { - const Client = OC.Files.Client - let baseUrl - let client - let requestStub - let requestDeferred - - beforeEach(function() { - requestDeferred = new $.Deferred() - requestStub = sinon.stub(dav.Client.prototype, 'request').returns(requestDeferred.promise()) - baseUrl = 'https://testhost/owncloud/remote.php/webdav/' - - client = new Client({ - host: 'testhost', - root: '/owncloud/remote.php/webdav', - useHTTPS: true, - }) - }) - afterEach(function() { - client = null - requestStub.restore() - }) - - /** - * Send an status response and check that the given - * promise gets its success handler called with the error - * status code - * - * @param {Promise} promise promise - * @param {number} status status to test - */ - function respondAndCheckStatus(promise, status) { - const successHandler = sinon.stub() - const failHandler = sinon.stub() - promise.done(successHandler) - promise.fail(failHandler) - - requestDeferred.resolve({ - status, - body: '', - }) - - promise.then(function() { - expect(successHandler.calledOnce).toEqual(true) - expect(successHandler.getCall(0).args[0]).toEqual(status) - - expect(failHandler.notCalled).toEqual(true) - }) - - return promise - } - - /** - * Send an error response and check that the given - * promise gets its fail handler called with the error - * status code - * - * @param {Promise} promise promise object - * @param {number} status error status to test - */ - function respondAndCheckError(promise, status) { - const successHandler = sinon.stub() - const failHandler = sinon.stub() - promise.done(successHandler) - promise.fail(failHandler) - - const errorXml - = '' - + ' Sabre\\DAV\\Exception\\SomeException' - + ' Some error message' - + '' - - const parser = new DOMParser() - - requestDeferred.resolve({ - status, - body: errorXml, - xhr: { - responseXML: parser.parseFromString(errorXml, 'application/xml'), - }, - }) - - promise.then(function() { - expect(failHandler.calledOnce).toEqual(true) - expect(failHandler.getCall(0).args[0]).toEqual(status) - expect(failHandler.getCall(0).args[1].status).toEqual(status) - expect(failHandler.getCall(0).args[1].message).toEqual('Some error message') - expect(failHandler.getCall(0).args[1].exception).toEqual('Sabre\\DAV\\Exception\\SomeException') - - expect(successHandler.notCalled).toEqual(true) - }) - - return promise - } - - /** - * Returns a list of request properties parsed from the given request body. - * - * @param {string} requestBody request XML - * - * @return {Array.} array of request properties in the format - * "{NS:}propname" - */ - function getRequestedProperties(requestBody) { - const doc = (new window.DOMParser()).parseFromString( - requestBody, - 'application/xml', - ) - const propRoots = doc.getElementsByTagNameNS('DAV:', 'prop') - const propsList = propRoots.item(0).childNodes - return _.map(propsList, function(propNode) { - return '{' + propNode.namespaceURI + '}' + propNode.localName - }) - } - - function makePropBlock(props) { - let s = '\n' - - _.each(props, function(value, key) { - s += '<' + key + '>' + value + '\n' - }) - - return s + '\n' - } - - function makeResponseBlock(href, props, failedProps) { - let s = '\n' - s += '' + href + '\n' - s += '\n' - s += makePropBlock(props) - s += 'HTTP/1.1 200 OK' - s += '\n' - if (failedProps) { - s += '\n' - _.each(failedProps, function(prop) { - s += '<' + prop + '/>\n' - }) - s += 'HTTP/1.1 404 Not Found\n' - s += '\n' - } - return s + '\n' - } - - describe('file listing', function() { - // TODO: switch this to the already parsed structure - const folderContentsXml = dav.Client.prototype.parseMultiStatus('' - + '' - + makeResponseBlock( - '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/', - { - 'd:getlastmodified': 'Fri, 10 Jul 2015 10:00:05 GMT', - 'd:getetag': '"56cfcabd79abb"', - 'd:resourcetype': '', - 'oc:id': '00000011oc2d13a6a068', - 'oc:fileid': '11', - 'oc:permissions': 'GRDNVCK', - 'oc:size': '120', - }, - [ - 'd:getcontenttype', - 'd:getcontentlength', - ], - ) - + makeResponseBlock( - '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt', - { - 'd:getlastmodified': 'Fri, 10 Jul 2015 13:38:05 GMT', - 'd:getetag': '"559fcabd79a38"', - 'd:getcontenttype': 'text/plain', - 'd:getcontentlength': 250, - 'd:resourcetype': '', - 'oc:id': '00000051oc2d13a6a068', - 'oc:fileid': '51', - 'oc:permissions': 'RDNVW', - }, - [ - 'oc:size', - ], - ) - + makeResponseBlock( - '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/sub', - { - 'd:getlastmodified': 'Fri, 10 Jul 2015 14:00:00 GMT', - 'd:getetag': '"66cfcabd79abb"', - 'd:resourcetype': '', - 'oc:id': '00000015oc2d13a6a068', - 'oc:fileid': '15', - 'oc:permissions': 'GRDNVCK', - 'oc:size': '100', - }, - [ - 'd:getcontenttype', - 'd:getcontentlength', - ], - ) - + '') - - it('sends PROPFIND with explicit properties to get file list', function() { - client.getFolderContents('path/to space/文件夹') - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('PROPFIND') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9') - expect(requestStub.lastCall.args[2].Depth).toEqual('1') - - const props = getRequestedProperties(requestStub.lastCall.args[3]) - expect(props).toContain('{DAV:}getlastmodified') - expect(props).toContain('{DAV:}getcontentlength') - expect(props).toContain('{DAV:}getcontenttype') - expect(props).toContain('{DAV:}getetag') - expect(props).toContain('{DAV:}resourcetype') - expect(props).toContain('{http://owncloud.org/ns}fileid') - expect(props).toContain('{http://owncloud.org/ns}size') - expect(props).toContain('{http://owncloud.org/ns}permissions') - expect(props).toContain('{http://nextcloud.org/ns}is-encrypted') - }) - it('sends PROPFIND to base url when empty path given', function() { - client.getFolderContents('') - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[1]).toEqual(baseUrl) - }) - it('sends PROPFIND to base url when root path given', function() { - client.getFolderContents('/') - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[1]).toEqual(baseUrl) - }) - it('parses the result list into a FileInfo array', function() { - const promise = client.getFolderContents('path/to space/文件夹') - - expect(requestStub.calledOnce).toEqual(true) - - requestDeferred.resolve({ - status: 207, - body: folderContentsXml, - }) - - promise.then(function(status, response) { - expect(status).toEqual(207) - expect(_.isArray(response)).toEqual(true) - - expect(response.length).toEqual(2) - - // file entry - let info = response[0] - expect(info instanceof OC.Files.FileInfo).toEqual(true) - expect(info.id).toEqual(51) - expect(info.path).toEqual('/path/to space/文件夹') - expect(info.name).toEqual('One.txt') - expect(info.permissions).toEqual(26) - expect(info.size).toEqual(250) - expect(info.mtime).toEqual(1436535485000) - expect(info.mimetype).toEqual('text/plain') - expect(info.etag).toEqual('559fcabd79a38') - expect(info.isEncrypted).toEqual(false) - - // sub entry - info = response[1] - expect(info instanceof OC.Files.FileInfo).toEqual(true) - expect(info.id).toEqual(15) - expect(info.path).toEqual('/path/to space/文件夹') - expect(info.name).toEqual('sub') - expect(info.permissions).toEqual(31) - expect(info.size).toEqual(100) - expect(info.mtime).toEqual(1436536800000) - expect(info.mimetype).toEqual('httpd/unix-directory') - expect(info.etag).toEqual('66cfcabd79abb') - expect(info.isEncrypted).toEqual(false) - }) - }) - it('returns parent node in result if specified', function() { - const promise = client.getFolderContents('path/to space/文件夹', { includeParent: true }) - - expect(requestStub.calledOnce).toEqual(true) - - requestDeferred.resolve({ - status: 207, - body: folderContentsXml, - }) - - promise.then(function(status, response) { - expect(status).toEqual(207) - expect(_.isArray(response)).toEqual(true) - - expect(response.length).toEqual(3) - - // root entry - const info = response[0] - expect(info instanceof OC.Files.FileInfo).toEqual(true) - expect(info.id).toEqual(11) - expect(info.path).toEqual('/path/to space') - expect(info.name).toEqual('文件夹') - expect(info.permissions).toEqual(31) - expect(info.size).toEqual(120) - expect(info.mtime).toEqual(1436522405000) - expect(info.mimetype).toEqual('httpd/unix-directory') - expect(info.etag).toEqual('56cfcabd79abb') - expect(info.isEncrypted).toEqual(false) - - // the two other entries follow - expect(response[1].id).toEqual(51) - expect(response[2].id).toEqual(15) - }) - }) - it('rejects promise when an error occurred', function() { - const promise = client.getFolderContents('path/to space/文件夹', { includeParent: true }) - respondAndCheckError(promise, 404) - }) - it('throws exception if arguments are missing', function() { - // TODO - }) - }) - - describe('file filtering', function() { - // TODO: switch this to the already parsed structure - const folderContentsXml = dav.Client.prototype.parseMultiStatus('' - + '' - + makeResponseBlock( - '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/', - { - 'd:getlastmodified': 'Fri, 10 Jul 2015 10:00:05 GMT', - 'd:getetag': '"56cfcabd79abb"', - 'd:resourcetype': '', - 'oc:id': '00000011oc2d13a6a068', - 'oc:fileid': '11', - 'oc:permissions': 'RDNVCK', - 'oc:size': '120', - }, - [ - 'd:getcontenttype', - 'd:getcontentlength', - ], - ) - + makeResponseBlock( - '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt', - { - 'd:getlastmodified': 'Fri, 10 Jul 2015 13:38:05 GMT', - 'd:getetag': '"559fcabd79a38"', - 'd:getcontenttype': 'text/plain', - 'd:getcontentlength': 250, - 'd:resourcetype': '', - 'oc:id': '00000051oc2d13a6a068', - 'oc:fileid': '51', - 'oc:permissions': 'RDNVW', - }, - [ - 'oc:size', - ], - ) - + makeResponseBlock( - '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/sub', - { - 'd:getlastmodified': 'Fri, 10 Jul 2015 14:00:00 GMT', - 'd:getetag': '"66cfcabd79abb"', - 'd:resourcetype': '', - 'oc:id': '00000015oc2d13a6a068', - 'oc:fileid': '15', - 'oc:permissions': 'RDNVCK', - 'oc:size': '100', - }, - [ - 'd:getcontenttype', - 'd:getcontentlength', - ], - ) - + '') - - it('sends REPORT with filter information', function() { - client.getFilteredFiles({ - systemTagIds: ['123', '456'], - }) - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('REPORT') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl) - - const body = requestStub.lastCall.args[3] - const doc = (new window.DOMParser()).parseFromString( - body, - 'application/xml', - ) - - const ns = 'http://owncloud.org/ns' - expect(doc.documentElement.localName).toEqual('filter-files') - expect(doc.documentElement.namespaceURI).toEqual(ns) - - const filterRoots = doc.getElementsByTagNameNS(ns, 'filter-rules') - const rulesList = filterRoots[0] = doc.getElementsByTagNameNS(ns, 'systemtag') - expect(rulesList.length).toEqual(2) - expect(rulesList[0].localName).toEqual('systemtag') - expect(rulesList[0].namespaceURI).toEqual(ns) - expect(rulesList[0].textContent).toEqual('123') - expect(rulesList[1].localName).toEqual('systemtag') - expect(rulesList[1].namespaceURI).toEqual(ns) - expect(rulesList[1].textContent).toEqual('456') - }) - it('sends REPORT with explicit properties to filter file list', function() { - client.getFilteredFiles({ - systemTagIds: ['123', '456'], - }) - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('REPORT') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl) - - const props = getRequestedProperties(requestStub.lastCall.args[3]) - expect(props).toContain('{DAV:}getlastmodified') - expect(props).toContain('{DAV:}getcontentlength') - expect(props).toContain('{DAV:}getcontenttype') - expect(props).toContain('{DAV:}getetag') - expect(props).toContain('{DAV:}resourcetype') - expect(props).toContain('{http://owncloud.org/ns}fileid') - expect(props).toContain('{http://owncloud.org/ns}size') - expect(props).toContain('{http://owncloud.org/ns}permissions') - expect(props).toContain('{http://nextcloud.org/ns}is-encrypted') - }) - it('parses the result list into a FileInfo array', function() { - const promise = client.getFilteredFiles({ - systemTagIds: ['123', '456'], - }) - - expect(requestStub.calledOnce).toEqual(true) - - requestDeferred.resolve({ - status: 207, - body: folderContentsXml, - }) - - promise.then(function(status, response) { - expect(status).toEqual(207) - expect(_.isArray(response)).toEqual(true) - - // returns all entries - expect(response.length).toEqual(3) - - // file entry - let info = response[0] - expect(info instanceof OC.Files.FileInfo).toEqual(true) - expect(info.id).toEqual(11) - - // file entry - info = response[1] - expect(info instanceof OC.Files.FileInfo).toEqual(true) - expect(info.id).toEqual(51) - - // sub entry - info = response[2] - expect(info instanceof OC.Files.FileInfo).toEqual(true) - expect(info.id).toEqual(15) - }) - }) - it('throws exception if arguments are missing', function() { - let thrown = null - try { - client.getFilteredFiles({}) - } catch (e) { - thrown = true - } - - expect(thrown).toEqual(true) - }) - }) - - describe('file info', function() { - const responseXml = dav.Client.prototype.parseMultiStatus('' - + '' - + makeResponseBlock( - '/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/', - { - 'd:getlastmodified': 'Fri, 10 Jul 2015 10:00:05 GMT', - 'd:getetag': '"56cfcabd79abb"', - 'd:resourcetype': '', - 'oc:id': '00000011oc2d13a6a068', - 'oc:fileid': '11', - 'oc:permissions': 'GRDNVCK', - 'oc:size': '120', - 'nc:is-encrypted': '1', - }, - [ - 'd:getcontenttype', - 'd:getcontentlength', - ], - ) - + '') - - it('sends PROPFIND with zero depth to get single file info', function() { - client.getFileInfo('path/to space/文件夹') - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('PROPFIND') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9') - expect(requestStub.lastCall.args[2].Depth).toEqual('0') - - const props = getRequestedProperties(requestStub.lastCall.args[3]) - expect(props).toContain('{DAV:}getlastmodified') - expect(props).toContain('{DAV:}getcontentlength') - expect(props).toContain('{DAV:}getcontenttype') - expect(props).toContain('{DAV:}getetag') - expect(props).toContain('{DAV:}resourcetype') - expect(props).toContain('{http://owncloud.org/ns}fileid') - expect(props).toContain('{http://owncloud.org/ns}size') - expect(props).toContain('{http://owncloud.org/ns}permissions') - expect(props).toContain('{http://nextcloud.org/ns}is-encrypted') - }) - it('parses the result into a FileInfo', function() { - const promise = client.getFileInfo('path/to space/文件夹') - - expect(requestStub.calledOnce).toEqual(true) - - requestDeferred.resolve({ - status: 207, - body: responseXml, - }) - - promise.then(function(status, response) { - expect(status).toEqual(207) - expect(_.isArray(response)).toEqual(false) - - const info = response - expect(info instanceof OC.Files.FileInfo).toEqual(true) - expect(info.id).toEqual(11) - expect(info.path).toEqual('/path/to space') - expect(info.name).toEqual('文件夹') - expect(info.permissions).toEqual(31) - expect(info.size).toEqual(120) - expect(info.mtime).toEqual(1436522405000) - expect(info.mimetype).toEqual('httpd/unix-directory') - expect(info.etag).toEqual('56cfcabd79abb') - expect(info.isEncrypted).toEqual(true) - }) - }) - it('properly parses entry inside root', function() { - const responseXml = dav.Client.prototype.parseMultiStatus('' - + '' - + makeResponseBlock( - '/owncloud/remote.php/webdav/in%20root', - { - 'd:getlastmodified': 'Fri, 10 Jul 2015 10:00:05 GMT', - 'd:getetag': '"56cfcabd79abb"', - 'd:resourcetype': '', - 'oc:id': '00000011oc2d13a6a068', - 'oc:fileid': '11', - 'oc:permissions': 'GRDNVCK', - 'oc:size': '120', - }, - [ - 'd:getcontenttype', - 'd:getcontentlength', - ], - ) - + '') - - const promise = client.getFileInfo('in root') - - expect(requestStub.calledOnce).toEqual(true) - - requestDeferred.resolve({ - status: 207, - body: responseXml, - }) - - promise.then(function(status, response) { - expect(status).toEqual(207) - expect(_.isArray(response)).toEqual(false) - - const info = response - expect(info instanceof OC.Files.FileInfo).toEqual(true) - expect(info.id).toEqual(11) - expect(info.path).toEqual('/') - expect(info.name).toEqual('in root') - expect(info.permissions).toEqual(31) - expect(info.size).toEqual(120) - expect(info.mtime).toEqual(1436522405000) - expect(info.mimetype).toEqual('httpd/unix-directory') - expect(info.etag).toEqual('56cfcabd79abb') - expect(info.isEncrypted).toEqual(false) - }) - }) - it('rejects promise when an error occurred', function() { - const promise = client.getFileInfo('path/to space/文件夹') - respondAndCheckError(promise, 404) - }) - it('throws exception if arguments are missing', function() { - // TODO - }) - }) - - describe('permissions', function() { - function getFileInfoWithPermission(webdavPerm, isFile) { - const props = { - 'd:getlastmodified': 'Fri, 10 Jul 2015 13:38:05 GMT', - 'd:getetag': '"559fcabd79a38"', - 'd:getcontentlength': 250, - 'oc:id': '00000051oc2d13a6a068', - 'oc:fileid': '51', - 'oc:permissions': webdavPerm, - } - - if (isFile) { - props['d:getcontenttype'] = 'text/plain' - } else { - props['d:resourcetype'] = '' - } - - const def = new $.Deferred() - requestStub.reset() - requestStub.returns(def) - - const responseXml = dav.Client.prototype.parseMultiStatus('' - + '' - + makeResponseBlock( - '/owncloud/remote.php/webdav/file.txt', - props, - ) - + '') - - const promise = client.getFileInfo('file.txt') - - expect(requestStub.calledOnce).toEqual(true) - - def.resolve({ - status: 207, - body: responseXml, - }) - - return promise - } - - function testPermission(permission, isFile, expectedPermissions) { - const promise = getFileInfoWithPermission(permission, isFile) - promise.then(function(status, result) { - expect(result.permissions).toEqual(expectedPermissions) - }) - } - - function testMountType(permission, isFile, expectedMountType) { - const promise = getFileInfoWithPermission(permission, isFile) - promise.then(function(status, result) { - expect(result.mountType).toEqual(expectedMountType) - }) - } - - it('properly parses file permissions', function() { - // permission, isFile, expectedPermissions - const testCases = [ - ['', true, OC.PERMISSION_NONE], - ['C', true, OC.PERMISSION_CREATE], - ['K', true, OC.PERMISSION_CREATE], - ['G', true, OC.PERMISSION_READ], - ['W', true, OC.PERMISSION_UPDATE], - ['D', true, OC.PERMISSION_DELETE], - ['R', true, OC.PERMISSION_SHARE], - ['CKGWDR', true, OC.PERMISSION_ALL], - ] - _.each(testCases, function(testCase) { - return testPermission.apply(this, testCase) - }) - }) - it('properly parses mount types', function() { - const testCases = [ - ['CKGWDR', false, null], - ['M', false, 'external'], - ['S', false, 'shared'], - ['SM', false, 'shared'], - ] - - _.each(testCases, function(testCase) { - return testMountType.apply(this, testCase) - }) - }) - }) - - describe('get file contents', function() { - it('returns file contents', function() { - const promise = client.getFileContents('path/to space/文件夹/One.txt') - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('GET') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt') - - requestDeferred.resolve({ - status: 200, - body: 'some contents', - }) - - promise.then(function(status, response) { - expect(status).toEqual(200) - expect(response).toEqual('some contents') - }) - }) - it('rejects promise when an error occurred', function() { - const promise = client.getFileContents('path/to space/文件夹/One.txt') - respondAndCheckError(promise, 409) - }) - it('throws exception if arguments are missing', function() { - // TODO - }) - }) - - describe('put file contents', function() { - it('sends PUT with file contents', function() { - const promise = client.putFileContents( - 'path/to space/文件夹/One.txt', - 'some contents', - ) - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('PUT') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt') - expect(requestStub.lastCall.args[2]['If-None-Match']).toEqual('*') - expect(requestStub.lastCall.args[2]['Content-Type']).toEqual('text/plain;charset=utf-8') - expect(requestStub.lastCall.args[3]).toEqual('some contents') - - respondAndCheckStatus(promise, 201) - }) - it('sends PUT with file contents with headers matching options', function() { - const promise = client.putFileContents( - 'path/to space/文件夹/One.txt', - 'some contents', - { - overwrite: false, - contentType: 'text/markdown', - }, - ) - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('PUT') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/One.txt') - expect(requestStub.lastCall.args[2]['If-None-Match']).not.toBeDefined() - expect(requestStub.lastCall.args[2]['Content-Type']).toEqual('text/markdown') - expect(requestStub.lastCall.args[3]).toEqual('some contents') - - respondAndCheckStatus(promise, 201) - }) - it('rejects promise when an error occurred', function() { - const promise = client.putFileContents( - 'path/to space/文件夹/One.txt', - 'some contents', - ) - respondAndCheckError(promise, 409) - }) - it('throws exception if arguments are missing', function() { - // TODO - }) - }) - - describe('create directory', function() { - it('sends MKCOL with specified path', function() { - const promise = client.createDirectory('path/to space/文件夹/new dir') - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('MKCOL') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/new%20dir') - - respondAndCheckStatus(promise, 201) - }) - it('rejects promise when an error occurred', function() { - const promise = client.createDirectory('path/to space/文件夹/new dir') - respondAndCheckError(promise, 404) - }) - it('throws exception if arguments are missing', function() { - // TODO - }) - }) - - describe('deletion', function() { - it('sends DELETE with specified path', function() { - const promise = client.remove('path/to space/文件夹') - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('DELETE') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9') - - respondAndCheckStatus(promise, 201) - }) - it('rejects promise when an error occurred', function() { - const promise = client.remove('path/to space/文件夹') - respondAndCheckError(promise, 404) - }) - it('throws exception if arguments are missing', function() { - // TODO - }) - }) - - describe('move', function() { - it('sends MOVE with specified paths with fail on overwrite by default', function() { - const promise = client.move( - 'path/to space/文件夹', - 'path/to space/anotherdir/文件夹', - ) - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('MOVE') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9') - expect(requestStub.lastCall.args[2].Destination) - .toEqual(baseUrl + 'path/to%20space/anotherdir/%E6%96%87%E4%BB%B6%E5%A4%B9') - expect(requestStub.lastCall.args[2].Overwrite) - .toEqual('F') - - respondAndCheckStatus(promise, 201) - }) - it('sends MOVE with silent overwrite mode when specified', function() { - const promise = client.move( - 'path/to space/文件夹', - 'path/to space/anotherdir/文件夹', - { allowOverwrite: true }, - ) - - expect(requestStub.calledOnce).toEqual(true) - expect(requestStub.lastCall.args[0]).toEqual('MOVE') - expect(requestStub.lastCall.args[1]).toEqual(baseUrl + 'path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9') - expect(requestStub.lastCall.args[2].Destination) - .toEqual(baseUrl + 'path/to%20space/anotherdir/%E6%96%87%E4%BB%B6%E5%A4%B9') - expect(requestStub.lastCall.args[2].Overwrite) - .not.toBeDefined() - - respondAndCheckStatus(promise, 201) - }) - it('rejects promise when an error occurred', function() { - const promise = client.move( - 'path/to space/文件夹', - 'path/to space/anotherdir/文件夹', - { allowOverwrite: true }, - ) - respondAndCheckError(promise, 404) - }) - it('throws exception if arguments are missing', function() { - // TODO - }) - }) -}) diff --git a/core/js/tests/specs/jquery.avatarSpec.js b/core/js/tests/specs/jquery.avatarSpec.js deleted file mode 100644 index a96a06ce064..00000000000 --- a/core/js/tests/specs/jquery.avatarSpec.js +++ /dev/null @@ -1,219 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2015 ownCloud Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -describe('jquery.avatar tests', function() { - let $div - let devicePixelRatio - - beforeEach(function() { - $('#testArea').append($('
')) - $div = $('#avatardiv') - - devicePixelRatio = window.devicePixelRatio - window.devicePixelRatio = 1 - - spyOn(window, 'Image').and.returnValue({ - onload: function() { - }, - onerror: function() { - }, - }) - }) - - afterEach(function() { - $div.remove() - - window.devicePixelRatio = devicePixelRatio - }) - - describe('size', function() { - it('undefined', function() { - $div.avatar('foo') - - expect(Math.round($div.height())).toEqual(64) - expect(Math.round($div.width())).toEqual(64) - }) - - it('undefined but div has height', function() { - $div.height(9) - $div.avatar('foo') - - expect(window.Image).toHaveBeenCalled() - window.Image().onerror() - - expect(Math.round($div.height())).toEqual(9) - expect(Math.round($div.width())).toEqual(9) - }) - - it('undefined but data size is set', function() { - $div.data('size', 10) - $div.avatar('foo') - - expect(window.Image).toHaveBeenCalled() - window.Image().onerror() - - expect(Math.round($div.height())).toEqual(10) - expect(Math.round($div.width())).toEqual(10) - }) - - it('defined', function() { - $div.avatar('foo', 8) - - expect(window.Image).toHaveBeenCalled() - window.Image().onerror() - - expect(Math.round($div.height())).toEqual(8) - expect(Math.round($div.width())).toEqual(8) - }) - }) - - it('undefined user', function() { - spyOn($div, 'imageplaceholder') - spyOn($div, 'css') - - $div.avatar() - - expect($div.imageplaceholder).toHaveBeenCalledWith('?') - expect($div.css).toHaveBeenCalledWith('background-color', '#b9b9b9') - }) - - describe('no avatar', function() { - it('show placeholder for existing user', function() { - spyOn($div, 'imageplaceholder') - $div.avatar('foo', undefined, undefined, undefined, undefined, 'bar') - - expect(window.Image).toHaveBeenCalled() - window.Image().onerror() - expect($div.imageplaceholder).toHaveBeenCalledWith('foo', 'bar') - }) - - it('show placeholder for non existing user', function() { - spyOn($div, 'imageplaceholder') - spyOn($div, 'css') - $div.avatar('foo') - - expect(window.Image).toHaveBeenCalled() - window.Image().onerror() - - expect($div.imageplaceholder).toHaveBeenCalledWith('?') - expect($div.css).toHaveBeenCalledWith('background-color', '#b9b9b9') - }) - - it('show no placeholder is ignored', function() { - spyOn($div, 'imageplaceholder') - spyOn($div, 'css') - $div.avatar('foo', undefined, undefined, true) - - expect(window.Image).toHaveBeenCalled() - window.Image().onerror() - - expect($div.imageplaceholder).toHaveBeenCalledWith('?') - expect($div.css).toHaveBeenCalledWith('background-color', '#b9b9b9') - }) - }) - - describe('url generation', function() { - beforeEach(function() { - window.devicePixelRatio = 1 - }) - - it('default', function() { - window.devicePixelRatio = 1 - $div.avatar('foo', 32) - - expect(window.Image).toHaveBeenCalled() - expect(window.Image().src).toEqual('http://localhost/index.php/avatar/foo/32') - }) - - it('high DPI icon', function() { - window.devicePixelRatio = 4 - $div.avatar('foo', 32) - - expect(window.Image).toHaveBeenCalled() - expect(window.Image().src).toEqual('http://localhost/index.php/avatar/foo/128') - }) - - it('high DPI icon round up size', function() { - window.devicePixelRatio = 1.9 - $div.avatar('foo', 32) - - expect(window.Image).toHaveBeenCalled() - expect(window.Image().src).toEqual('http://localhost/index.php/avatar/foo/61') - }) - }) - - describe('valid avatar', function() { - beforeEach(function() { - window.devicePixelRatio = 1 - }) - - it('default (no ie8 fix)', function() { - $div.avatar('foo', 32) - - expect(window.Image).toHaveBeenCalled() - window.Image().onload() - - expect(window.Image().height).toEqual(32) - expect(window.Image().width).toEqual(32) - expect(window.Image().src).toEqual('http://localhost/index.php/avatar/foo/32') - }) - - it('default high DPI icon', function() { - window.devicePixelRatio = 1.9 - - $div.avatar('foo', 32) - - expect(window.Image).toHaveBeenCalled() - window.Image().onload() - - expect(window.Image().height).toEqual(32) - expect(window.Image().width).toEqual(32) - expect(window.Image().src).toEqual('http://localhost/index.php/avatar/foo/61') - }) - - it('with ie8 fix (ignored)', function() { - $div.avatar('foo', 32, true) - - expect(window.Image).toHaveBeenCalled() - window.Image().onload() - - expect(window.Image().height).toEqual(32) - expect(window.Image().width).toEqual(32) - expect(window.Image().src).toEqual('http://localhost/index.php/avatar/foo/32') - }) - - it('unhide div', function() { - $div.hide() - - $div.avatar('foo', 32) - - expect(window.Image).toHaveBeenCalled() - window.Image().onload() - - expect(window.Image().height).toEqual(32) - expect(window.Image().width).toEqual(32) - expect(window.Image().src).toEqual('http://localhost/index.php/avatar/foo/32') - }) - - it('callback called', function() { - const observer = { callback: function() { dump('FOO') } } - - spyOn(observer, 'callback') - - $div.avatar('foo', 32, undefined, undefined, function() { - observer.callback() - }) - - expect(window.Image).toHaveBeenCalled() - window.Image().onload() - - expect(window.Image().height).toEqual(32) - expect(window.Image().width).toEqual(32) - expect(window.Image().src).toEqual('http://localhost/index.php/avatar/foo/32') - expect(observer.callback).toHaveBeenCalled() - }) - }) -}) diff --git a/core/js/tests/specs/jquery.placeholderSpec.js b/core/js/tests/specs/jquery.placeholderSpec.js deleted file mode 100644 index 8fa0cf6b915..00000000000 --- a/core/js/tests/specs/jquery.placeholderSpec.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -describe('jquery.placeholder tests', function() { - let $div - - beforeEach(function() { - $('#testArea').append($('
')) - $div = $('#placeholderdiv') - }) - - afterEach(function() { - $div.remove() - }) - - describe('placeholder text', function() { - it('shows one first letter if one word in a input text', function() { - spyOn($div, 'html') - $div.imageplaceholder('Seed', 'Name') - expect($div.html).toHaveBeenCalledWith('N') - }) - - it('shows two first letters if two words in a input text', function() { - spyOn($div, 'html') - $div.imageplaceholder('Seed', 'First Second') - expect($div.html).toHaveBeenCalledWith('FS') - }) - - it('shows two first letters if more then two words in a input text', function() { - spyOn($div, 'html') - $div.imageplaceholder('Seed', 'First Second Middle') - expect($div.html).toHaveBeenCalledWith('FS') - }) - }) -}) diff --git a/core/js/tests/specs/l10nSpec.js b/core/js/tests/specs/l10nSpec.js deleted file mode 100644 index c5788e9026d..00000000000 --- a/core/js/tests/specs/l10nSpec.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2014 ownCloud Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -describe('OC.L10N tests', function() { - const TEST_APP = 'jsunittestapp' - - beforeEach(function() { - window._oc_appswebroots[TEST_APP] = OC.getRootPath() + '/apps3/jsunittestapp' - - window.OC = window.OC ?? {} - window.OC.appswebroots = window.OC.appswebroots || {} - window.OC.appswebroots[TEST_APP] = OC.getRootPath() + '/apps3/jsunittestapp' - }) - afterEach(function() { - OC.L10N._unregister(TEST_APP) - delete window._oc_appswebroots[TEST_APP] - delete window.OC.appswebroots[TEST_APP] - }) - - describe('text translation', function() { - beforeEach(function() { - spyOn(console, 'warn') - OC.L10N.register(TEST_APP, { - 'Hello world!': 'Hallo Welt!', - 'Hello {name}, the weather is {weather}': 'Hallo {name}, das Wetter ist {weather}', - sunny: 'sonnig', - }) - }) - it('returns untranslated text when no bundle exists', function() { - OC.L10N._unregister(TEST_APP) - expect(t(TEST_APP, 'unknown text')).toEqual('unknown text') - }) - it('returns untranslated text when no key exists', function() { - expect(t(TEST_APP, 'unknown text')).toEqual('unknown text') - }) - it('returns translated text when key exists', function() { - expect(t(TEST_APP, 'Hello world!')).toEqual('Hallo Welt!') - }) - it('returns translated text with placeholder', function() { - expect(t(TEST_APP, 'Hello {name}, the weather is {weather}', { name: 'Steve', weather: t(TEST_APP, 'sunny') })).toEqual('Hallo Steve, das Wetter ist sonnig') - }) - it('returns text with escaped placeholder', function() { - expect(t(TEST_APP, 'Hello {name}', { name: 'Steve' })).toEqual('Hello <strong>Steve</strong>') - }) - it('returns text with not escaped placeholder', function() { - expect(t(TEST_APP, 'Hello {name}', { name: 'Steve' }, null, { escape: false })).toEqual('Hello Steve') - }) - it('uses DOMPurify to escape the text', function() { - expect(t(TEST_APP, 'These are your search results', null, { escape: false })).toEqual('These are your search results') - }) - it('keeps old texts when registering existing bundle', function() { - OC.L10N.register(TEST_APP, { - sunny: 'sonnig', - new: 'neu', - }) - expect(t(TEST_APP, 'sunny')).toEqual('sonnig') - expect(t(TEST_APP, 'new')).toEqual('neu') - }) - }) - describe('plurals', function() { - function checkPlurals() { - expect(n(TEST_APP, 'download %n file', 'download %n files', 0)).toEqual('0 Dateien herunterladen') - expect(n(TEST_APP, 'download %n file', 'download %n files', 1)).toEqual('1 Datei herunterladen') - expect(n(TEST_APP, 'download %n file', 'download %n files', 2)).toEqual('2 Dateien herunterladen') - expect(n(TEST_APP, 'download %n file', 'download %n files', 1024)).toEqual('1024 Dateien herunterladen') - } - - it('generates plural for default text when translation does not exist', function() { - spyOn(console, 'warn') - OC.L10N.register(TEST_APP, { - }) - expect(n(TEST_APP, 'download %n file', 'download %n files', 0)).toEqual('download 0 files') - expect(n(TEST_APP, 'download %n file', 'download %n files', 1)).toEqual('download 1 file') - expect(n(TEST_APP, 'download %n file', 'download %n files', 2)).toEqual('download 2 files') - expect(n(TEST_APP, 'download %n file', 'download %n files', 1024)).toEqual('download 1024 files') - }) - it('generates plural with default function when no forms specified', function() { - spyOn(console, 'warn') - OC.L10N.register(TEST_APP, { - '_download %n file_::_download %n files_': - ['%n Datei herunterladen', '%n Dateien herunterladen'], - }) - checkPlurals() - }) - }) -}) diff --git a/core/js/tests/specs/oc-backbone-webdavSpec.js b/core/js/tests/specs/oc-backbone-webdavSpec.js deleted file mode 100644 index 9230626948e..00000000000 --- a/core/js/tests/specs/oc-backbone-webdavSpec.js +++ /dev/null @@ -1,394 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2014 ownCloud Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -/* global dav */ - -describe('Backbone Webdav extension', function() { - let davClientRequestStub - let davClientPropPatchStub - let davClientPropFindStub - let deferredRequest - - beforeEach(function() { - deferredRequest = $.Deferred() - davClientRequestStub = sinon.stub(dav.Client.prototype, 'request') - davClientPropPatchStub = sinon.stub(dav.Client.prototype, 'propPatch') - davClientPropFindStub = sinon.stub(dav.Client.prototype, 'propFind') - davClientRequestStub.returns(deferredRequest.promise()) - davClientPropPatchStub.returns(deferredRequest.promise()) - davClientPropFindStub.returns(deferredRequest.promise()) - }) - afterEach(function() { - davClientRequestStub.restore() - davClientPropPatchStub.restore() - davClientPropFindStub.restore() - }) - - describe('collections', function() { - let TestModel - let TestCollection - beforeEach(function() { - TestModel = OC.Backbone.Model.extend({ - sync: OC.Backbone.davSync, - davProperties: { - firstName: '{http://owncloud.org/ns}first-name', - lastName: '{http://owncloud.org/ns}last-name', - age: '{http://owncloud.org/ns}age', - married: '{http://owncloud.org/ns}married', - }, - parse: function(data) { - return { - id: data.id, - firstName: data.firstName, - lastName: data.lastName, - age: parseInt(data.age, 10), - married: data.married === 'true' || data.married === true, - } - }, - }) - TestCollection = OC.Backbone.Collection.extend({ - sync: OC.Backbone.davSync, - model: TestModel, - url: 'http://example.com/owncloud/remote.php/test/', - }) - }) - - it('makes a POST request to create model into collection', function(done) { - const collection = new TestCollection() - const model = collection.create({ - firstName: 'Hello', - lastName: 'World', - }) - - expect(davClientRequestStub.calledOnce).toEqual(true) - expect(davClientRequestStub.getCall(0).args[0]) - .toEqual('POST') - expect(davClientRequestStub.getCall(0).args[1]) - .toEqual('http://example.com/owncloud/remote.php/test/') - expect(davClientRequestStub.getCall(0).args[2]['Content-Type']) - .toEqual('application/json') - expect(davClientRequestStub.getCall(0).args[2]['X-Requested-With']) - .toEqual('XMLHttpRequest') - expect(davClientRequestStub.getCall(0).args[3]) - .toEqual(JSON.stringify({ - firstName: 'Hello', - lastName: 'World', - })) - - const responseHeaderStub = sinon.stub() - .withArgs('Content-Location') - .returns('http://example.com/owncloud/remote.php/test/123') - deferredRequest.resolve({ - status: 201, - body: '', - xhr: { - getResponseHeader: responseHeaderStub, - }, - }) - - setTimeout(function() { - expect(model.id).toEqual('123') - - done() - }, 0) - }) - - it('uses PROPFIND to retrieve collection', function(done) { - const successStub = sinon.stub() - const errorStub = sinon.stub() - const collection = new TestCollection() - collection.fetch({ - success: successStub, - error: errorStub, - }) - - expect(davClientPropFindStub.calledOnce).toEqual(true) - expect(davClientPropFindStub.getCall(0).args[0]) - .toEqual('http://example.com/owncloud/remote.php/test/') - expect(davClientPropFindStub.getCall(0).args[1]) - .toEqual([ - '{http://owncloud.org/ns}first-name', - '{http://owncloud.org/ns}last-name', - '{http://owncloud.org/ns}age', - '{http://owncloud.org/ns}married', - ]) - expect(davClientPropFindStub.getCall(0).args[2]) - .toEqual(1) - expect(davClientPropFindStub.getCall(0).args[3]['X-Requested-With']) - .toEqual('XMLHttpRequest') - - deferredRequest.resolve({ - status: 207, - body: [ - // root element - { - href: 'http://example.org/owncloud/remote.php/test/', - propStat: [], - }, - // first model - { - href: 'http://example.org/owncloud/remote.php/test/123', - propStat: [{ - status: 'HTTP/1.1 200 OK', - properties: { - '{http://owncloud.org/ns}first-name': 'Hello', - '{http://owncloud.org/ns}last-name': 'World', - }, - }], - }, - // second model - { - href: 'http://example.org/owncloud/remote.php/test/456', - propStat: [{ - status: 'HTTP/1.1 200 OK', - properties: { - '{http://owncloud.org/ns}first-name': 'Test', - '{http://owncloud.org/ns}last-name': 'Person', - }, - }], - }, - ], - }) - - setTimeout(function() { - expect(collection.length).toEqual(2) - - let model = collection.get('123') - expect(model.id).toEqual('123') - expect(model.get('firstName')).toEqual('Hello') - expect(model.get('lastName')).toEqual('World') - - model = collection.get('456') - expect(model.id).toEqual('456') - expect(model.get('firstName')).toEqual('Test') - expect(model.get('lastName')).toEqual('Person') - - expect(successStub.calledOnce).toEqual(true) - expect(errorStub.notCalled).toEqual(true) - - done() - }, 0) - }) - - function testMethodError(doCall, done) { - const successStub = sinon.stub() - const errorStub = sinon.stub() - - doCall(successStub, errorStub) - - deferredRequest.resolve({ - status: 404, - body: '', - }) - - setTimeout(function() { - expect(successStub.notCalled).toEqual(true) - expect(errorStub.calledOnce).toEqual(true) - - done() - }, 0) - } - - it('calls error handler if error status in PROPFIND response', function(done) { - testMethodError(function(success, error) { - const collection = new TestCollection() - collection.fetch({ - success, - error, - }) - }, done) - }) - it('calls error handler if error status in POST response', function(done) { - testMethodError(function(success, error) { - const collection = new TestCollection() - collection.create({ - firstName: 'Hello', - lastName: 'World', - }, { - success, - error, - }) - }, done) - }) - }) - describe('models', function() { - let TestModel - beforeEach(function() { - TestModel = OC.Backbone.Model.extend({ - sync: OC.Backbone.davSync, - davProperties: { - firstName: '{http://owncloud.org/ns}first-name', - lastName: '{http://owncloud.org/ns}last-name', - age: '{http://owncloud.org/ns}age', // int - married: '{http://owncloud.org/ns}married', // bool - }, - url: function() { - return 'http://example.com/owncloud/remote.php/test/' + this.id - }, - parse: function(data) { - return { - id: data.id, - firstName: data.firstName, - lastName: data.lastName, - age: parseInt(data.age, 10), - married: data.married === 'true' || data.married === true, - } - }, - }) - }) - - it('makes a PROPPATCH request to update model', function() { - const model = new TestModel({ - id: '123', - firstName: 'Hello', - lastName: 'World', - age: 32, - married: false, - }) - - model.save({ - firstName: 'Hey', - age: 33, - married: true, - }) - - expect(davClientPropPatchStub.calledOnce).toEqual(true) - expect(davClientPropPatchStub.getCall(0).args[0]) - .toEqual('http://example.com/owncloud/remote.php/test/123') - expect(davClientPropPatchStub.getCall(0).args[1]) - .toEqual({ - '{http://owncloud.org/ns}first-name': 'Hey', - '{http://owncloud.org/ns}age': '33', - '{http://owncloud.org/ns}married': 'true', - }) - expect(davClientPropPatchStub.getCall(0).args[2]['X-Requested-With']) - .toEqual('XMLHttpRequest') - - deferredRequest.resolve({ - status: 201, - body: '', - }) - - expect(model.id).toEqual('123') - expect(model.get('firstName')).toEqual('Hey') - expect(model.get('age')).toEqual(33) - expect(model.get('married')).toEqual(true) - }) - - it('uses PROPFIND to fetch single model', function(done) { - const model = new TestModel({ - id: '123', - }) - - model.fetch() - - expect(davClientPropFindStub.calledOnce).toEqual(true) - expect(davClientPropFindStub.getCall(0).args[0]) - .toEqual('http://example.com/owncloud/remote.php/test/123') - expect(davClientPropFindStub.getCall(0).args[1]) - .toEqual([ - '{http://owncloud.org/ns}first-name', - '{http://owncloud.org/ns}last-name', - '{http://owncloud.org/ns}age', - '{http://owncloud.org/ns}married', - ]) - expect(davClientPropFindStub.getCall(0).args[2]) - .toEqual(0) - expect(davClientPropFindStub.getCall(0).args[3]['X-Requested-With']) - .toEqual('XMLHttpRequest') - - deferredRequest.resolve({ - status: 207, - body: { - href: 'http://example.org/owncloud/remote.php/test/123', - propStat: [{ - status: 'HTTP/1.1 200 OK', - properties: { - '{http://owncloud.org/ns}first-name': 'Hello', - '{http://owncloud.org/ns}last-name': 'World', - '{http://owncloud.org/ns}age': '35', - '{http://owncloud.org/ns}married': 'true', - }, - }], - }, - }) - - setTimeout(function() { - expect(model.id).toEqual('123') - expect(model.get('firstName')).toEqual('Hello') - expect(model.get('lastName')).toEqual('World') - expect(model.get('age')).toEqual(35) - expect(model.get('married')).toEqual(true) - - done() - }) - }) - it('makes a DELETE request to destroy model', function() { - const model = new TestModel({ - id: '123', - firstName: 'Hello', - lastName: 'World', - }) - - model.destroy() - - expect(davClientRequestStub.calledOnce).toEqual(true) - expect(davClientRequestStub.getCall(0).args[0]) - .toEqual('DELETE') - expect(davClientRequestStub.getCall(0).args[1]) - .toEqual('http://example.com/owncloud/remote.php/test/123') - expect(davClientRequestStub.getCall(0).args[2]['X-Requested-With']) - .toEqual('XMLHttpRequest') - expect(davClientRequestStub.getCall(0).args[3]) - .toBeFalsy() - - deferredRequest.resolve({ - status: 200, - body: '', - }) - }) - - function testMethodError(doCall, done) { - const successStub = sinon.stub() - const errorStub = sinon.stub() - - doCall(successStub, errorStub) - - deferredRequest.resolve({ - status: 404, - body: '', - }) - - setTimeout(function() { - expect(successStub.notCalled).toEqual(true) - expect(errorStub.calledOnce).toEqual(true) - - done() - }) - } - - it('calls error handler if error status in PROPFIND response', function(done) { - testMethodError(function(success, error) { - const model = new TestModel() - model.fetch({ - success, - error, - }) - }, done) - }) - it('calls error handler if error status in PROPPATCH response', function(done) { - testMethodError(function(success, error) { - const model = new TestModel() - model.save({ - firstName: 'Hey', - }, { - success, - error, - }) - }, done) - }) - }) -}) diff --git a/package-lock.json b/package-lock.json index 30482b20818..c3e4b1b7628 100644 --- a/package-lock.json +++ b/package-lock.json @@ -127,23 +127,12 @@ "exports-loader": "^5.0.0", "file-loader": "^6.2.0", "handlebars-loader": "^1.7.3", - "jasmine-core": "~2.5.2", - "jasmine-sinon": "^0.4.0", "jsdom": "^27.0.0", - "karma": "^6.4.4", - "karma-chrome-launcher": "^3.2.0", - "karma-coverage": "2.2.1", - "karma-jasmine": "^1.1.2", - "karma-jasmine-sinon": "^1.0.4", - "karma-spec-reporter": "^0.0.36", - "karma-viewport": "^1.0.9", "mime": "^4.1.0", "msw": "^2.11.3", - "puppeteer": "^24.23.0", "raw-loader": "^4.0.2", "regextras": "^0.8.0", "sass": "^1.93.2", - "sinon": "<= 5.0.7", "stylelint": "^16.24.0", "stylelint-use-logical": "^2.1.2", "tar": "^7.5.1", @@ -2051,6 +2040,7 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.1.90" } @@ -5160,64 +5150,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.10", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", - "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", - "dev": true, - "dependencies": { - "debug": "^4.4.3", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.2", - "tar-fs": "^3.1.0", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", - "dev": true, - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", @@ -5618,62 +5550,6 @@ "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.2.0.tgz", "integrity": "sha512-N3fuA1AAnTo5gCStYoIoiasPccC+xPLx2YU88Dv0GeAmPQTWHETlZQq5xZ0DgUq1H9loXMWQH5qqUjcI7BHJ1A==" }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/commons/node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/formatio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", - "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "samsam": "1.3.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", - "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, "node_modules/@stylistic/eslint-plugin": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz", @@ -5873,12 +5749,6 @@ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "license": "MIT" }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true - }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -5977,16 +5847,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -6132,17 +5992,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/karma": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/@types/karma/-/karma-6.3.9.tgz", - "integrity": "sha512-sjE/MHnoAZAQYAKRXAbjTOiBKyGGErEM725bruRcmDdMa2vp1bjWPhApI7/i564PTyHlzc3vIGXLL6TFIpAxFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "log4js": "^6.4.1" - } - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -7465,6 +7314,7 @@ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -7698,6 +7548,7 @@ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -7802,13 +7653,6 @@ "license": "MIT", "peer": true }, - "node_modules/array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", - "dev": true, - "license": "MIT" - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -7936,18 +7780,6 @@ "node": ">=18" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/ast-v8-to-istanbul": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.4.tgz", @@ -8075,20 +7907,6 @@ "axios": "0.x || 1.x" } }, - "node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "dev": true, - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/babel-loader": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", @@ -8198,89 +8016,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/bare-events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", - "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", - "dev": true - }, - "node_modules/bare-fs": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", - "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", - "dev": true, - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", - "dev": true, - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "dev": true, - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", - "dev": true, - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", - "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", - "dev": true, - "optional": true, - "dependencies": { - "bare-path": "^3.0.0" - } - }, "node_modules/base-64": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", @@ -8308,25 +8043,6 @@ ], "license": "MIT" }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -8377,6 +8093,7 @@ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -8443,6 +8160,7 @@ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -8468,6 +8186,7 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -8477,7 +8196,8 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/body-parser/node_modules/qs": { "version": "6.13.0", @@ -8485,6 +8205,7 @@ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "side-channel": "^1.0.6" }, @@ -8779,6 +8500,7 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -9014,6 +8736,7 @@ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -9039,6 +8762,7 @@ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -9066,19 +8790,6 @@ "node": ">=6.0" } }, - "node_modules/chromium-bidi": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz", - "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==", - "dev": true, - "dependencies": { - "mitt": "^3.0.1", - "zod": "^3.24.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, "node_modules/ci-info": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", @@ -9316,16 +9027,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -9502,22 +9203,6 @@ "dev": true, "license": "ISC" }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -9529,23 +9214,6 @@ "node": ">=0.8" } }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -9618,6 +9286,7 @@ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -9678,20 +9347,6 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -9965,13 +9620,6 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true, - "license": "MIT" - }, "node_modules/cypress": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz", @@ -10144,15 +9792,6 @@ "node": ">=0.10" } }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, "node_modules/data-urls": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz", @@ -10220,16 +9859,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, "node_modules/date-format-parse": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/date-format-parse/-/date-format-parse-0.2.7.tgz", @@ -10493,20 +10122,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -10528,6 +10143,7 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -10593,6 +10209,7 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -10800,29 +10417,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/devtools-protocol": { - "version": "0.0.1508733", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", - "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==", - "dev": true - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -10950,19 +10544,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -11169,7 +10750,8 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ejs": { "version": "3.1.10", @@ -11248,6 +10830,7 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -11262,77 +10845,6 @@ "once": "^1.4.0" } }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/enhanced-resolve": { "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", @@ -11361,22 +10873,6 @@ "node": ">=8.6" } }, - "node_modules/ent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", - "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "punycode": "^1.4.1", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -12145,7 +11641,8 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/events": { "version": "3.3.0", @@ -12157,15 +11654,6 @@ "node": ">=0.8.x" } }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "dev": true, - "dependencies": { - "bare-events": "^2.7.0" - } - }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -12445,12 +11933,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -12774,55 +12256,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/find-babel-config": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.2.tgz", @@ -13327,20 +12760,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "dev": true, - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/getos": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", @@ -14024,6 +13443,7 @@ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -14041,6 +13461,7 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -14059,6 +13480,7 @@ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -14205,6 +13627,7 @@ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -14456,15 +13879,6 @@ "node": ">=10.13.0" } }, - "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -14572,6 +13986,7 @@ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -15214,19 +14629,6 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -15261,23 +14663,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -15385,26 +14770,6 @@ "node": ">=10" } }, - "node_modules/jasmine-core": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.5.2.tgz", - "integrity": "sha512-kpf1e8MlD9rnurToeGLjfmsSSAupkgZM+ky9BmXFKbFnr/MgNnLokfGkrZg+dqtbsQF7hv/1s67vFVLS3iOVxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jasmine-sinon": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/jasmine-sinon/-/jasmine-sinon-0.4.0.tgz", - "integrity": "sha512-2FtXVwMoINdQHE/GiU+qSx+37PQh+/rvpQoGEducAUVTwgxXaKsJLef46H7oLqi73ZIzbBbzNuQYUIXcNQZ6kQ==", - "dev": true, - "license": "BSD", - "dependencies": { - "sinon": ">= 1.7.1" - }, - "engines": { - "node": ">=0.1.103" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -15744,16 +15109,6 @@ "node": ">=0.10.0" } }, - "node_modules/jsonschema": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", - "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/jsprim": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", @@ -15770,353 +15125,75 @@ "verror": "1.10.0" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } }, - "node_modules/karma": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", - "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.7.2", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, - "node_modules/karma-chrome-launcher": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", - "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "which": "^1.2.1" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" } }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/layerr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/layerr/-/layerr-3.0.0.tgz", + "integrity": "sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==", + "license": "MIT" + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "license": "MIT", + "engines": { + "node": "> 0.8" } }, - "node_modules/karma-coverage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", - "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", - "dependencies": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" - }, "engines": { - "node": ">=10.0.0" + "node": ">=6" } }, - "node_modules/karma-coverage/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma-coverage/node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/karma-coverage/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-jasmine": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", - "integrity": "sha512-SENGE9DhlIIFTSZWiNq4eGeXL8G6z9cqHIOdkx9jh1qhhQqwEy3tAoLRyER0vOcHqdOlKmGpOuXk+HOipIy7sg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - }, - "peerDependencies": { - "jasmine-core": "*", - "karma": "*" - } - }, - "node_modules/karma-jasmine-sinon": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-jasmine-sinon/-/karma-jasmine-sinon-1.0.4.tgz", - "integrity": "sha512-7/wljAZ+tnLLlnGFM/aO5f700jDBmrMnGMsPpdhZ8zx+8cGNuGKt3V1Usq02NErU5yBGT6AFDSwqqdvgo4DyfQ==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - }, - "peerDependencies": { - "jasmine-sinon": "*", - "karma": ">=0.10", - "sinon": "*" - } - }, - "node_modules/karma-spec-reporter": { - "version": "0.0.36", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.36.tgz", - "integrity": "sha512-11bvOl1x6ryKZph7kmbmMpbi8vsngEGxGOoeTlIcDaH3ab3j8aPJnZ+r+K/SS0sBSGy5VGkGYO2+hLct7hw/6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "colors": "1.4.0" - }, - "peerDependencies": { - "karma": ">=0.9" - } - }, - "node_modules/karma-viewport": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/karma-viewport/-/karma-viewport-1.0.9.tgz", - "integrity": "sha512-E1xVe66vBQtI66TGOtZMzV5nf6BW5tW4TQVUqPK+oakVLdsG/ZUG688tGK0lL1q0t7nfQD1dwLD8Z9Guu/RVdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/karma": "^6.3.3", - "jsonschema": "^1.4.0" - } - }, - "node_modules/karma/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/karma/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/karma/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/karma/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/known-css-properties": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", - "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/launch-editor": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", - "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" - } - }, - "node_modules/layerr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/layerr/-/layerr-3.0.0.tgz", - "integrity": "sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==", - "license": "MIT" - }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "> 0.8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16244,14 +15321,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -16355,30 +15424,6 @@ "node": ">=8" } }, - "node_modules/log4js": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", - "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.5" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", @@ -16677,6 +15722,7 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -17363,25 +16409,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -17670,6 +16697,7 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -17686,67 +16714,6 @@ "integrity": "sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA==", "license": "MIT" }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - }, - "node_modules/nise/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/nise/node_modules/lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -18121,6 +17088,7 @@ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -18387,38 +17355,6 @@ "node": ">=6" } }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "dev": true, - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dev": true, - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -18529,6 +17465,7 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -19427,15 +18364,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/property-information": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", @@ -19504,34 +18432,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -19581,56 +18481,8 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true, - "license": "MIT" - }, - "node_modules/puppeteer": { - "version": "24.23.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.23.0.tgz", - "integrity": "sha512-BVR1Lg8sJGKXY79JARdIssFWK2F6e1j+RyuJP66w4CUmpaXjENicmA3nNpUXA8lcTdDjAndtP+oNdni3T/qQqA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@puppeteer/browsers": "2.10.10", - "chromium-bidi": "9.1.0", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1508733", - "puppeteer-core": "24.23.0", - "typed-query-selector": "^2.12.0" - }, - "bin": { - "puppeteer": "lib/cjs/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "24.23.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.23.0.tgz", - "integrity": "sha512-yl25C59gb14sOdIiSnJ08XiPP+O2RjuyZmEG+RjYmCXO7au0jcLf7fRiyii96dXGUBW7Zwei/mVKfxMx/POeFw==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "2.10.10", - "chromium-bidi": "9.1.0", - "debug": "^4.4.3", - "devtools-protocol": "0.0.1508733", - "typed-query-selector": "^2.12.0", - "webdriver-bidi-protocol": "0.3.6", - "ws": "^8.18.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, "license": "MIT", - "engines": { - "node": ">=0.9" - } + "peer": true }, "node_modules/qrcode": { "version": "1.5.4", @@ -19888,6 +18740,7 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -19898,6 +18751,7 @@ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -19972,6 +18826,7 @@ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -20562,104 +19417,41 @@ "node": ">=8" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/rettime": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", - "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", - "dev": true - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 4" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "dev": true + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -20860,14 +19652,6 @@ "dev": true, "license": "MIT" }, - "node_modules/samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "deprecated": "This package has been deprecated in favour of @sinonjs/samsam", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/sass": { "version": "1.93.2", "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", @@ -21327,7 +20111,8 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/sha.js": { "version": "2.4.12", @@ -21560,46 +20345,6 @@ "node": ">=14.16" } }, - "node_modules/sinon": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.7.tgz", - "integrity": "sha512-GvNLrwpvLZ8jIMZBUhHGUZDq5wlUdceJWyHvZDmqBxnjazpxY1L0FNbGBX6VpcOEoQ8Q4XMWFzm2myJMvx+VjA==", - "deprecated": "16.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/formatio": "^2.0.0", - "diff": "^3.1.0", - "lodash.get": "^4.4.2", - "lolex": "^2.2.0", - "nise": "^1.2.0", - "supports-color": "^5.1.0", - "type-detect": "^4.0.5" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -21625,16 +20370,6 @@ "node": ">=8" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/smob": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", @@ -21648,126 +20383,6 @@ "integrity": "sha512-x9+obN8qeW1e2mkRbMuEPYcnulYWv8G+hhxLiOHKKv8WMzA1LGvb+jJ4qUEOSWqI5n5bkGCo6gG1gjpj9vnUJg==", "license": "ISC" }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -21792,34 +20407,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "dev": true, - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/sort-object-keys": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", @@ -22107,6 +20694,7 @@ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -22190,67 +20778,6 @@ "node": ">= 6" } }, - "node_modules/streamroller": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", - "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/streamroller/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/streamroller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/streamroller/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "dev": true, - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, "node_modules/strengthify": { "version": "0.5.9", "resolved": "git+ssh://git@github.com/nextcloud/strengthify.git#d78452649da2cd59df594a2a5c210cb7045ac899", @@ -23433,15 +21960,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4" - } - }, "node_modules/thingies": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", @@ -23687,6 +22205,7 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.6" } @@ -23978,22 +22497,13 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -24079,12 +22589,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", - "dev": true - }, "node_modules/typescript": { "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", @@ -24129,33 +22633,6 @@ "integrity": "sha512-dFSOFBKV6uwaloBCCUhxlD3Pr/P1a/tJdcmPrTXCHlEFD3faj0mztjcGn6VBAhQ0/Bdy8K3VWrrqwbt/ffsYsg==", "license": "MIT" }, - "node_modules/ua-parser-js": { - "version": "0.7.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", - "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/ua-regexes-lite": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ua-regexes-lite/-/ua-regexes-lite-1.2.1.tgz", @@ -24421,6 +22898,7 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -24586,6 +23064,7 @@ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -24650,6 +23129,7 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -24926,16 +23406,6 @@ "license": "MIT", "peer": true }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/vue": { "version": "2.7.16", "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", @@ -25419,12 +23889,6 @@ ], "license": "MIT" }, - "node_modules/webdriver-bidi-protocol": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.6.tgz", - "integrity": "sha512-mlGndEOA9yK9YAbvtxaPTqdi/kaCWYYfwrZvGzcmkr/3lWM+tQj53BxtpVd6qbC6+E5OnHXgCcAhre6AkXzxjA==", - "dev": true - }, "node_modules/webidl-conversions": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz", diff --git a/package.json b/package.json index 72427aa4761..3bd78f7db60 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "stylelint:fix": "npm run stylelint -- --fix", "test": "vitest run", "test:coverage": "vitest run --coverage --reporter=default --reporter=junit --outputFile=test-report.junit.xml", - "test:jsunit": "karma start tests/karma.config.js --single-run", "test:update-snapshots": "vitest run --update", "test:watch": "vitest watch", "watch": "webpack --node-env development --progress --watch" @@ -164,23 +163,12 @@ "exports-loader": "^5.0.0", "file-loader": "^6.2.0", "handlebars-loader": "^1.7.3", - "jasmine-core": "~2.5.2", - "jasmine-sinon": "^0.4.0", "jsdom": "^27.0.0", - "karma": "^6.4.4", - "karma-chrome-launcher": "^3.2.0", - "karma-coverage": "2.2.1", - "karma-jasmine": "^1.1.2", - "karma-jasmine-sinon": "^1.0.4", - "karma-spec-reporter": "^0.0.36", - "karma-viewport": "^1.0.9", "mime": "^4.1.0", "msw": "^2.11.3", - "puppeteer": "^24.23.0", "raw-loader": "^4.0.2", "regextras": "^0.8.0", "sass": "^1.93.2", - "sinon": "<= 5.0.7", "stylelint": "^16.24.0", "stylelint-use-logical": "^2.1.2", "tar": "^7.5.1", diff --git a/tests/karma.config.js b/tests/karma.config.js deleted file mode 100644 index 92361408dcd..00000000000 --- a/tests/karma.config.js +++ /dev/null @@ -1,194 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2016-2023 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -/** - * This node module is run by the karma executable to specify its configuration. - * - * The list of files from all needed JavaScript files including the ones from the - * apps to test, and the test specs will be passed as configuration object. - * - * Note that it is possible to test a single app by setting the KARMA_TESTSUITE - * environment variable to the apps name, for example "core" or "files_encryption". - * Multiple apps can be specified by separating them with space. - * - * Setting the environment variable NOCOVERAGE to 1 will disable the coverage - * preprocessor, which is needed to be able to debug tests properly in a browser. - */ - -if (!process.env.CHROMIUM_BIN) { - const chrome = require('puppeteer').executablePath() - process.env.CHROMIUM_BIN = chrome -} - -/* jshint node: true */ -module.exports = function(config) { - // respect NOCOVERAGE env variable - // it is useful to disable coverage for debugging - // because the coverage preprocessor will wrap the JS files somehow - var enableCoverage = !parseInt(process.env.NOCOVERAGE, 10); - console.log( - 'Coverage preprocessor: ', - enableCoverage ? 'enabled' : 'disabled' - ); - - // read core files from core.json, - // these are required by all apps so always need to be loaded - // note that the loading order is important that's why they - // are specified in a separate file - var corePath = 'dist/'; - var coreModule = require('../core/js/core.json'); - var files = [ - // core mocks - 'core/js/tests/specHelper.js', - ]; - var preprocessors = {}; - - var srcFile, i; - // add core library files - for (i = 0; i < coreModule.libraries.length; i++) { - srcFile = corePath + coreModule.libraries[i]; - files.push(srcFile); - } - - files.push('core/js/tests/html-domparser.js'); - files.push('dist/core-main.js'); - files.push('dist/core-files_fileinfo.js'); - files.push('dist/core-files_client.js'); - files.push('dist/core-systemtags.js'); - - // add core modules files - for (i = 0; i < coreModule.modules.length; i++) { - srcFile = corePath + coreModule.modules[i]; - files.push(srcFile); - if (enableCoverage) { - preprocessors[srcFile] = 'coverage'; - } - } - - // core tests - files.push('core/js/tests/specs/**/*.js'); - // serve images to avoid warnings - files.push({ - pattern: 'core/img/**/*', - watched: false, - included: false, - served: true - }); - - // include core CSS - files.push({ - pattern: 'core/css/*.css', - watched: true, - included: true, - served: true - }); - - // Allow fonts - files.push({ - pattern: 'core/fonts/*', - watched: false, - included: false, - served: true - }); - - console.log(files) - - config.set({ - // base path, that will be used to resolve files and exclude - basePath: '..', - - // frameworks to use - frameworks: ['jasmine', 'jasmine-sinon', 'viewport'], - - // list of files / patterns to load in the browser - files, - - // list of files to exclude - exclude: [], - - proxies: { - // prevent warnings for images - '/base/tests/img/': 'http://localhost:9876/base/core/img/', - '/base/tests/css/': 'http://localhost:9876/base/core/css/', - '/base/core/css/images/': 'http://localhost:9876/base/core/css/images/', - '/actions/': 'http://localhost:9876/base/core/img/actions/', - '/base/core/fonts/': 'http://localhost:9876/base/core/fonts/', - '/svg/': '../core/img/' - }, - - // test results reporter to use - // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage' - reporters: ['spec'], - - specReporter: { - maxLogLines: 5, - suppressErrorSummary: false, - suppressFailed: false, - suppressPassed: true, - suppressSkipped: true, - showSpecTiming: false, - }, - - junitReporter: { - outputFile: 'tests/autotest-results-js.xml' - }, - - // web server port - port: 9876, - - preprocessors: preprocessors, - - coverageReporter: { - dir: 'tests/karma-coverage', - reporters: [ - { type: 'html' }, - { type: 'cobertura' }, - { type: 'lcovonly' } - ] - }, - - // enable / disable colors in the output (reporters and logs) - colors: true, - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: true, - - // Start these browsers, currently available: - // - Chrome - // - ChromeCanary - // - Firefox - // - Opera (has to be installed with `npm install karma-opera-launcher`) - // - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`) - // - PhantomJS - // - IE (only Windows; has to be installed with `npm install karma-ie-launcher`) - // use PhantomJS_debug for extra local debug - browsers: ['Chrome_without_sandbox'], - - // you can define custom flags - customLaunchers: { - PhantomJS_debug: { - base: 'PhantomJS', - debug: true - }, - // fix CI - Chrome_without_sandbox: { - base: 'ChromiumHeadless', - flags: ['--no-sandbox'], - }, - }, - - // If browser does not capture in given timeout [ms], kill it - captureTimeout: 60000, - - // Continuous Integration mode - // if true, it capture browsers, run tests and exit - singleRun: false - }); -};