diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 00000000000..30894c8905d
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,24 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "Debug Jest",
+ "program": "${workspaceFolder}/node_modules/jest/bin/jest.js",
+ "args": [
+ "packages/primeng/src/table/table.service.spec.ts",
+ "--runInBand"
+ ],
+ "cwd": "${workspaceFolder}",
+ "console": "integratedTerminal",
+ "internalConsoleOptions": "neverOpen",
+ "outFiles": [
+ "${workspaceFolder}/**/*.js"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 924522fb08d..eecde2402bb 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -15,5 +15,6 @@
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
- }
+ },
+ "angular.enable-strict-mode-prompt": false
}
diff --git a/apps/showcase/angular.json b/apps/showcase/angular.json
index 4a80bd487ca..cace2df3459 100644
--- a/apps/showcase/angular.json
+++ b/apps/showcase/angular.json
@@ -63,7 +63,7 @@
"development": {
"optimization": false,
"extractLicenses": false,
- "sourceMap": false
+ "sourceMap": true
}
},
"defaultConfiguration": "production"
diff --git a/apps/showcase/doc/table/filteradvanceddoc.ts b/apps/showcase/doc/table/filteradvanceddoc.ts
index 658fca42837..df65bd8d80c 100644
--- a/apps/showcase/doc/table/filteradvanceddoc.ts
+++ b/apps/showcase/doc/table/filteradvanceddoc.ts
@@ -19,7 +19,7 @@ import { Table } from 'primeng/table';
-
+
@@ -227,7 +227,7 @@ export class FilterAdvancedDoc {
-
+
@@ -369,7 +369,7 @@ export class FilterAdvancedDoc {
-
+
diff --git a/basic-test.spec.ts b/basic-test.spec.ts
new file mode 100644
index 00000000000..99a0737742a
--- /dev/null
+++ b/basic-test.spec.ts
@@ -0,0 +1,35 @@
+/**
+ * This is a basic test file is to test
+ * if your current test tooling works in general.
+ */
+import { Component } from '@angular/core';
+import { TestBed } from '@angular/core/testing';
+
+interface MyInterface {
+ name: string;
+}
+
+@Component({
+ template: ``
+})
+class DummyComponent {}
+
+function p1(): MyInterface {
+ return { name: 'p1' };
+}
+
+describe('test', () => {
+ it('p1', () => {
+ expect(p1().name).toBe('p1');
+ });
+
+ it('should create dummy component', () => {
+ TestBed.configureTestingModule({
+ declarations: [DummyComponent]
+ }).compileComponents();
+
+ const fixture = TestBed.createComponent(DummyComponent);
+ const component = fixture.componentInstance;
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/jest.config.ts b/jest.config.ts
new file mode 100644
index 00000000000..3f097c273c9
--- /dev/null
+++ b/jest.config.ts
@@ -0,0 +1,13 @@
+import type { Config } from 'jest';
+
+const config: Config = {
+ collectCoverage: true,
+ coverageReporters: ['html'],
+ preset: 'jest-preset-angular',
+ moduleNameMapper: {
+ '^primeng/(.*)': '/packages/primeng/src/$1/public_api'
+ },
+ setupFilesAfterEnv: ['/setup-jest.ts']
+};
+
+export default config;
diff --git a/package-lock.json b/package-lock.json
index 05f915afe75..4939d48e822 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2153,6 +2153,28 @@
}
}
},
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
"node_modules/deep-is": {
"version": "0.1.4",
"dev": true,
@@ -2517,6 +2539,39 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/eslint": {
"version": "8.57.1",
"dev": true,
@@ -4542,6 +4597,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.merge": {
"version": "4.6.2",
"dev": true,
@@ -4709,6 +4771,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-machine-id": {
"version": "1.1.12",
"dev": true,
@@ -5381,6 +5450,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"dev": true,
@@ -5829,6 +5905,20 @@
"node": ">=0.6.19"
}
},
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/string-width": {
"version": "4.2.3",
"dev": true,
@@ -6417,6 +6507,16 @@
"node": ">= 0.8.0"
}
},
+ "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/type-fest": {
"version": "0.21.3",
"dev": true,
@@ -6578,6 +6678,56 @@
"webidl-conversions": "^4.0.2"
}
},
+ "node_modules/whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/which": {
"version": "2.0.2",
"dev": true,
diff --git a/package.json b/package.json
index ae8cd901ea2..076f4954aef 100644
--- a/package.json
+++ b/package.json
@@ -31,7 +31,9 @@
"format:check": "prettier --check \"**/*.{js,mjs,ts,mts,d.ts,html}\"",
"lint": "eslint --ext \".js,.mjs,.ts,.mts\" --ignore-path .gitignore . --cache",
"lint:fix": "eslint --fix --ext \".js,.mjs,.ts,.mts\" --ignore-path .gitignore .",
- "test:unit": "pnpm --filter primeng test:unit"
+ "test:unit": "pnpm --filter primeng test:unit",
+ "test:jest": "jest",
+ "test:confirm-jest": "jest basic-test.spec.ts"
},
"devDependencies": {
"@angular-devkit/build-angular": "catalog:angular18",
@@ -60,10 +62,13 @@
"fs-extra": "^11.2.0",
"glob": "^10.4.2",
"husky": "^9.1.6",
+ "jest": "^29.7.0",
+ "jest-preset-angular": "^14.3.1",
"lint-staged": "^12.0.0",
"ng-packagr": "catalog:angular18",
"pnpm": "^9.6.0",
"prettier": "^3.0.0",
+ "ts-jest": "^29.2.5",
"tsup": "^8.1.0",
"typescript": "5.4.5"
},
@@ -72,6 +77,8 @@
},
"packageManager": "pnpm@9.6.0",
"lint-staged": {
- "**/*.{js,mjs,ts,mts,d.ts,html}": ["prettier --write"]
+ "**/*.{js,mjs,ts,mts,d.ts,html}": [
+ "prettier --write"
+ ]
}
}
diff --git a/packages/primeng/src/api/filterservice.ts b/packages/primeng/src/api/filterservice.ts
index ed9cb176cfe..92769022568 100644
--- a/packages/primeng/src/api/filterservice.ts
+++ b/packages/primeng/src/api/filterservice.ts
@@ -215,7 +215,10 @@ export class FilterService {
return false;
}
- return value.toDateString() === filter.toDateString();
+ const valueDate = this.getDate(value);
+ const filterDate = this.getDate(filter);
+
+ return valueDate.toDateString() === filterDate.toDateString();
},
dateIsNot: (value: any, filter: any): boolean => {
@@ -227,7 +230,14 @@ export class FilterService {
return false;
}
- return value.toDateString() !== filter.toDateString();
+ const valueDate = this.getDate(value);
+ const filterDate = this.getDate(filter);
+
+ if (isNaN(valueDate.getDate()) || isNaN(filterDate.getDate())) {
+ return true;
+ }
+
+ return valueDate.toDateString() !== filterDate.toDateString();
},
dateBefore: (value: any, filter: any): boolean => {
@@ -239,7 +249,10 @@ export class FilterService {
return false;
}
- return value.getTime() < filter.getTime();
+ const valueDate = this.getDate(value);
+ const filterDate = this.getDate(filter);
+
+ return valueDate.getTime() < filterDate.getTime();
},
dateAfter: (value: any, filter: any): boolean => {
@@ -250,13 +263,27 @@ export class FilterService {
if (value === undefined || value === null) {
return false;
}
- value.setHours(0, 0, 0, 0);
- return value.getTime() > filter.getTime();
+ const valueDate = this.getDate(value);
+ const filterDate = this.getDate(filter);
+
+ valueDate.setHours(0, 0, 0, 0);
+
+ return valueDate.getTime() > filterDate.getTime();
}
};
register(rule: string, fn: Function) {
this.filters[rule] = fn;
}
+
+ private getDate(value: any): Date {
+ if (value instanceof Date) {
+ return value;
+ } else {
+ // Prevent creating a date from an integer e.g. from
+ // an age. In this case in invalid date should be returned.
+ return new Date(`${value}`);
+ }
+ }
}
diff --git a/packages/primeng/src/api/fitlersarg.ts b/packages/primeng/src/api/fitlersarg.ts
new file mode 100644
index 00000000000..0b5682b9efa
--- /dev/null
+++ b/packages/primeng/src/api/fitlersarg.ts
@@ -0,0 +1,3 @@
+import { FilterMetadata } from './filtermetadata';
+
+export type FiltersArg = { [key: string]: FilterMetadata | FilterMetadata[] | string };
diff --git a/packages/primeng/src/table/table.service.spec.ts b/packages/primeng/src/table/table.service.spec.ts
new file mode 100644
index 00000000000..a3e234249d6
--- /dev/null
+++ b/packages/primeng/src/table/table.service.spec.ts
@@ -0,0 +1,971 @@
+import { TestBed } from '@angular/core/testing';
+
+import { FilterOperator } from 'primeng/api';
+import { FiltersArg } from '../api/fitlersarg';
+import { globalFilterFieldName, TableService } from './table.service';
+
+let service: TableService;
+
+beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [TableService]
+ });
+ service = TestBed.inject(TableService);
+});
+
+describe('TableService', () => {
+ describe('filter entries', () => {
+ describe('general edge cases', () => {
+ it('should return empty array when data is falsy', () => {
+ const filters: FiltersArg = {
+ name: { value: 'foo', matchMode: 'startsWith' }
+ };
+
+ const result = service.filter(undefined, filters, [], undefined);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should return empty array when data is empty', () => {
+ const data = [];
+
+ const filters: FiltersArg = {
+ name: { value: 'foo', matchMode: 'startsWith' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should return same data when filters are empty', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }];
+
+ const filters: FiltersArg = {};
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual(data);
+ });
+
+ it('should return same data when filters are undefined', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }];
+
+ const filters: FiltersArg = undefined;
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual(data);
+ });
+
+ it('should return same data when filters are null', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }];
+
+ const filters: FiltersArg = null;
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual(data);
+ });
+ });
+
+ describe('edge cases', () => {
+ describe('(global) date filters return empty data when not a date', () => {
+ describe('dateIs', () => {
+ it('should return empty data when no date in data', () => {
+ const data = [
+ { name: 'foo', city: 'New York' },
+ { name: 'bar', city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {
+ date: { value: new Date(2021, 1, 1), matchMode: 'dateIs' }
+ };
+
+ const result = service.filter(data, filters, ['name', 'city'], undefined);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should return empty data when no date in filter', () => {
+ const data = [
+ { city: 'New York', date: new Date(2021, 1, 1) },
+ { city: 'Los Angeles', date: new Date(2021, 1, 1) }
+ ];
+
+ const filters: FiltersArg = {
+ date: { value: 'today is 1th of Veb 2021', matchMode: 'dateIs' }
+ };
+
+ const result = service.filter(data, filters, ['city', 'date'], undefined);
+
+ expect(result).toEqual([]);
+ });
+ });
+
+ describe('dateIsNot', () => {
+ it('should return empty data when no date in data', () => {
+ const data = [
+ { name: 'foo', city: 'New York' },
+ { name: 'bar', city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {
+ date: { value: new Date(2021, 1, 1), matchMode: 'dateIsNot' }
+ };
+
+ const result = service.filter(data, filters, ['name', 'city'], undefined);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should return empty data when no date in filter', () => {
+ const data = [
+ { city: 'New York', date: new Date(2021, 1, 1) },
+ { city: 'Los Angeles', date: new Date(2021, 1, 1) }
+ ];
+
+ const filters: FiltersArg = {
+ date: { value: 'der erste Ferbruar zwanzig einungzwanzig', matchMode: 'dateIsNot' }
+ };
+
+ const result = service.filter(data, filters, ['city', 'date'], undefined);
+
+ expect(result).toEqual(data);
+ });
+ });
+
+ describe('dateBefore', () => {
+ it('should return empty data when no date in data', () => {
+ const data = [
+ { name: 'foo', city: 'New York' },
+ { name: 'bar', city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {
+ date: { value: new Date(2021, 1, 1), matchMode: 'dateBefore' }
+ };
+
+ const result = service.filter(data, filters, ['name', 'city'], undefined);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should return empty data when no date in filter', () => {
+ const data = [
+ { city: 'New York', date: new Date(2021, 1, 1) },
+ { city: 'Los Angeles', date: new Date(2021, 1, 1) }
+ ];
+
+ const filters: FiltersArg = {
+ date: { value: 'today is 1th of Veb 2021', matchMode: 'dateBefore' }
+ };
+
+ const result = service.filter(data, filters, ['city', 'date'], undefined);
+
+ expect(result).toEqual([]);
+ });
+ });
+
+ describe('dateAfter', () => {
+ it('should return empty data when no date in data', () => {
+ const data = [
+ { name: 'foo', city: 'New York' },
+ { name: 'bar', city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {
+ date: { value: new Date(2021, 1, 1), matchMode: 'dateAfter' }
+ };
+
+ const result = service.filter(data, filters, ['name', 'city'], undefined);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should return empty data when no date in filter', () => {
+ const data = [
+ { city: 'New York', date: new Date(2021, 1, 1) },
+ { city: 'Los Angeles', date: new Date(2021, 1, 1) }
+ ];
+
+ const filters: FiltersArg = {
+ date: { value: 'today is 1th of Veb 2021', matchMode: 'dateAfter' }
+ };
+
+ const result = service.filter(data, filters, ['city', 'date'], undefined);
+
+ expect(result).toEqual([]);
+ });
+ });
+ });
+ });
+
+ describe('by single field aka locally', () => {
+ describe('typical cases', () => {
+ it('should filter with startsWith', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'f', matchMode: 'startsWith' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'foo' }]);
+ });
+
+ it('should filter items with contains', () => {
+ const data = [{ name: 'apple' }, { name: 'banana' }, { name: 'apricot' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'an', matchMode: 'contains' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'banana' }]);
+ });
+
+ it('should filter items with notContains', () => {
+ const data = [{ name: 'apple' }, { name: 'banana' }, { name: 'apricot' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'an', matchMode: 'notContains' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'apple' }, { name: 'apricot' }]);
+ });
+
+ it('should filter items with endsWith', () => {
+ const data = [{ name: 'apple' }, { name: 'banana' }, { name: 'apricot' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'le', matchMode: 'endsWith' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'apple' }]);
+ });
+
+ it('should filter items with equals', () => {
+ const data = [{ name: 'apple' }, { name: 'banana' }, { name: 'apricot' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'banana', matchMode: 'equals' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'banana' }]);
+ });
+
+ it('should filter items with notEquals', () => {
+ const data = [{ name: 'apple' }, { name: 'banana' }, { name: 'apricot' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'banana', matchMode: 'notEquals' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'apple' }, { name: 'apricot' }]);
+ });
+
+ it('should filter items with in', () => {
+ const data = [{ name: 'apple' }, { name: 'banana' }, { name: 'apricot' }];
+
+ const filters: FiltersArg = {
+ name: { value: ['apple', 'apricot'], matchMode: 'in' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'apple' }, { name: 'apricot' }]);
+ });
+
+ it('should filter items with between', () => {
+ const data = [{ value: 5 }, { value: 10 }, { value: 15 }];
+
+ const filters: FiltersArg = {
+ value: { value: [5, 10], matchMode: 'between' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: 5 }, { value: 10 }]);
+ });
+
+ it('should filter items with lt', () => {
+ const data = [{ value: 5 }, { value: 10 }, { value: 15 }];
+
+ const filters: FiltersArg = {
+ value: { value: 10, matchMode: 'lt' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: 5 }]);
+ });
+
+ it('should filter items with lte', () => {
+ const data = [{ value: 5 }, { value: 10 }, { value: 15 }];
+
+ const filters: FiltersArg = {
+ value: { value: 10, matchMode: 'lte' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: 5 }, { value: 10 }]);
+ });
+
+ it('should filter items with gt', () => {
+ const data = [{ value: 5 }, { value: 10 }, { value: 15 }];
+
+ const filters: FiltersArg = {
+ value: { value: 10, matchMode: 'gt' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: 15 }]);
+ });
+
+ it('should filter items with gte', () => {
+ const data = [{ value: 5 }, { value: 10 }, { value: 15 }];
+
+ const filters: FiltersArg = {
+ value: { value: 10, matchMode: 'gte' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: 10 }, { value: 15 }]);
+ });
+
+ it('should filter items with is', () => {
+ const data = [{ name: 'apple' }, { name: 'banana' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'banana', matchMode: 'is' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'banana' }]);
+ });
+
+ it('should filter items with isNot', () => {
+ const data = [{ name: 'apple' }, { name: 'banana' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'banana', matchMode: 'isNot' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'apple' }]);
+ });
+
+ it('should filter items with before', () => {
+ const data = [{ value: new Date(2020, 1, 1) }, { value: new Date(2021, 1, 1) }];
+
+ const filters: FiltersArg = {
+ value: { value: new Date(2021, 1, 1), matchMode: 'before' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: new Date(2020, 1, 1) }]);
+ });
+
+ it('should filter items with after', () => {
+ const data = [{ value: new Date(2020, 1, 1) }, { value: new Date(2021, 1, 1) }];
+
+ const filters: FiltersArg = {
+ value: { value: new Date(2020, 1, 1), matchMode: 'after' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: new Date(2021, 1, 1) }]);
+ });
+
+ it('should filter items with dateIs', () => {
+ const data = [{ value: new Date(2020, 1, 1) }, { value: new Date(2021, 1, 1) }];
+
+ const filters: FiltersArg = {
+ value: { value: new Date(2021, 1, 1), matchMode: 'dateIs' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: new Date(2021, 1, 1) }]);
+ });
+
+ it('should filter items with dateIsNot', () => {
+ const data = [{ value: new Date(2020, 1, 1) }, { value: new Date(2021, 1, 1) }];
+
+ const filters: FiltersArg = {
+ value: { value: new Date(2021, 1, 1), matchMode: 'dateIsNot' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: new Date(2020, 1, 1) }]);
+ });
+
+ it('should filter items with dateBefore', () => {
+ const data = [{ value: new Date(2020, 1, 1) }, { value: new Date(2021, 1, 1) }];
+
+ const filters: FiltersArg = {
+ value: { value: new Date(2021, 1, 1), matchMode: 'dateBefore' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: new Date(2020, 1, 1) }]);
+ });
+
+ it('should filter items with dateAfter', () => {
+ const data = [{ value: new Date(2020, 1, 1) }, { value: new Date(2021, 1, 1) }];
+
+ const filters: FiltersArg = {
+ value: { value: new Date(2020, 1, 1), matchMode: 'dateAfter' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ value: new Date(2021, 1, 1) }]);
+ });
+ });
+ describe('edge cases', () => {
+ it('should filter by combined filters equals and notEquals with default and', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }, { name: 'baz' }];
+
+ const filters: FiltersArg = {
+ name: [
+ { value: 'baz', matchMode: 'equals' },
+ { value: 'bar', matchMode: 'notEquals' }
+ ]
+ };
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'baz' }]);
+ });
+
+ it('should filter by combined filters equals or notEquals', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }, { name: 'baz' }];
+
+ const filters: FiltersArg = {
+ name: [
+ { value: 'baz', matchMode: 'equals', operator: FilterOperator.OR },
+ { value: 'bar', matchMode: 'notEquals' }
+ ]
+ };
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'foo' }, { name: 'baz' }]);
+ });
+
+ it('should filter by combined filters equals and/or notEquals', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }, { name: 'baz' }, { name: 'fly' }];
+
+ const filters: FiltersArg = {
+ name: [
+ // Don't break the filter loop by the OR operator
+ // otherwise this test will fail!
+ { value: 'baz', matchMode: 'equals', operator: FilterOperator.OR },
+ { value: 'bar', matchMode: 'notEquals', operator: FilterOperator.AND },
+ // Also making sure the operator of the last filter is ignored
+ { value: 'fly', matchMode: 'notEquals', operator: FilterOperator.AND }
+ ]
+ };
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'foo' }, { name: 'baz' }]);
+ });
+
+ it('should filter by combined filters and notEquals', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }, { name: 'baz' }];
+
+ const filters: FiltersArg = {
+ name: [
+ { value: 'baz', matchMode: 'notEquals', operator: FilterOperator.AND },
+ { value: 'bar', matchMode: 'notEquals', operator: FilterOperator.AND },
+ { value: 'foo', matchMode: 'notEquals', operator: FilterOperator.AND }
+ ]
+ };
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should filter multiple props', () => {
+ const data = [
+ { name: 'foo', val: 1 },
+ { name: 'bar', val: 2 },
+ { name: 'baz', val: 3 }
+ ];
+
+ const filters: FiltersArg = {
+ name: { value: 'baz', matchMode: 'equals' },
+ val: { value: 3, matchMode: 'equals' }
+ };
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'baz', val: 3 }]);
+ });
+
+ it('should filter compare string and number', () => {
+ const data = [
+ { name: 'foo', val: 1 },
+ { name: 'bar', val: 2 },
+ { name: 'baz', val: 3 }
+ ];
+
+ const filters: FiltersArg = {
+ name: { value: 'baz', matchMode: 'equals' },
+ val: { value: '3 ', matchMode: 'equals' }
+ };
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'baz', val: 3 }]);
+ });
+
+ it('should filter with startsWith by default', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'f' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([{ name: 'foo' }]);
+ });
+
+ it('should return empty data by an unknown prop', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }];
+
+ const filters: FiltersArg = {
+ name: { value: 'bar', matchMode: 'contains' },
+ unknown: { value: 'foo', matchMode: 'contains' }
+ };
+
+ const result = service.filter(data, filters, [], undefined);
+
+ expect(result).toEqual([]);
+ });
+ });
+ });
+
+ describe('by multiple/all fields aka globally', () => {
+ describe('typical cases', () => {
+ it('should filter with startsWith', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'new', matchMode: 'startsWith' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+
+ it('should filter with contains', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'ang', matchMode: 'contains' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'bar', age: 30, city: 'Los Angeles' }]);
+ });
+
+ it('should filter with notContains', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'ang', matchMode: 'notContains' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+
+ it('should filter with endsWith', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'York', matchMode: 'endsWith' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+
+ it('should filter with equals', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'New York', matchMode: 'equals' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+
+ it('should filter with notEquals', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'New York', matchMode: 'notEquals' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'bar', age: 30, city: 'Los Angeles' }]);
+ });
+
+ it('should filter with in', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: ['New York', 'Los Angeles'], matchMode: 'in' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual(data);
+ });
+
+ it('should filter with between', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: [20, 30], matchMode: 'between' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual(data);
+ });
+
+ it('should filter with lt', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 30, matchMode: 'lt' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+
+ it('should filter with lte', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 30, matchMode: 'lte' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual(data);
+ });
+
+ it('should filter with gt', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 25, matchMode: 'gt' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'bar', age: 30, city: 'Los Angeles' }]);
+ });
+
+ it('should filter with gte', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 25, matchMode: 'gte' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual(data);
+ });
+
+ it('should filter with is', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'New York', matchMode: 'is' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+
+ it('should filter with isNot', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'New York', matchMode: 'isNot' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'bar', age: 30, city: 'Los Angeles' }]);
+ });
+
+ it('should filter with before', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 30, matchMode: 'before' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+
+ it('should filter with after', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 25, matchMode: 'after' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'bar', age: 30, city: 'Los Angeles' }]);
+ });
+
+ it('should filter with dateIs', () => {
+ const data = [
+ { name: 'foo', age: 25, date: new Date(2020, 1, 1) },
+ { name: 'bar', age: 30, date: new Date(2021, 1, 1) }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: new Date(2021, 1, 1), matchMode: 'dateIs' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'date'], undefined);
+
+ expect(result).toEqual([{ name: 'bar', age: 30, date: new Date(2021, 1, 1) }]);
+ });
+
+ it('should filter with dateIsNot', () => {
+ const data = [
+ { name: 'foo', age: 25, date: new Date(2020, 1, 1) },
+ { name: 'bar', age: 30, date: new Date(2021, 1, 1) }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: new Date(2021, 1, 1), matchMode: 'dateIsNot' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'date'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, date: new Date(2020, 1, 1) }]);
+ });
+
+ it('should filter with dateBefore', () => {
+ const data = [
+ { name: 'foo', age: 25, date: new Date(2020, 1, 1) },
+ { name: 'bar', age: 30, date: new Date(2021, 1, 1) }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: new Date(2021, 1, 1), matchMode: 'dateBefore' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'date'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, date: new Date(2020, 1, 1) }]);
+ });
+
+ it('should filter with dateAfter', () => {
+ const data = [
+ { name: 'foo', age: 25, date: new Date(2020, 1, 1) },
+ { name: 'bar', age: 30, date: new Date(2021, 1, 1) }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: new Date(2020, 1, 1), matchMode: 'dateAfter' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'date'], undefined);
+
+ expect(result).toEqual([{ name: 'bar', age: 30, date: new Date(2021, 1, 1) }]);
+ });
+ });
+
+ describe('edge cases', () => {
+ it('should fail when match mode does not exist', () => {
+ const data = [{ name: 'foo' }, { name: 'bar' }];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'new', matchMode: 'notExistingMatchMode' };
+
+ expect(() => {
+ service.filter(data, filters, ['name', 'age', 'city'], undefined);
+ }).toThrowError('Unsupported match mode: notExistingMatchMode');
+ });
+
+ it('should work with missing props', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 25, city: 'Los Angeles', global: 'development' },
+ { name: 'baz', age: 35, city: 'Vancouver', global: 'research' }
+ ];
+
+ const filters: FiltersArg = {};
+ filters[globalFilterFieldName] = { value: 'development', matchMode: 'notContains' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city', 'global'], undefined);
+
+ expect(result).toEqual([
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'baz', age: 35, city: 'Vancouver', global: 'research' }
+ ]);
+ });
+ });
+ });
+
+ describe('by multiple/all fields aka global and single field(s) aka local', () => {
+ describe('typical cases', () => {
+ it('should filter with startsWith and notContains', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' },
+ { name: 'baz', age: 35, city: 'New York' }
+ ];
+
+ const filters: FiltersArg = {
+ name: { value: 'ba', matchMode: 'startsWith' }
+ };
+ filters[globalFilterFieldName] = { value: 'new', matchMode: 'notContains' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'bar', age: 30, city: 'Los Angeles' }]);
+ });
+
+ it('should filter with contains and notContains', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 30, city: 'Los Angeles' },
+ { name: 'baz', age: 35, city: 'New York' }
+ ];
+
+ const filters: FiltersArg = {
+ name: { value: 'oo', matchMode: 'contains' }
+ };
+ filters[globalFilterFieldName] = { value: 'ang', matchMode: 'notContains' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+
+ it('should return empty data when filter results not overlap', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'Berlin' },
+ { name: 'bar', age: 30, city: 'Los Angeles' },
+ { name: 'baz', age: 35, city: 'New York' }
+ ];
+
+ const filters: FiltersArg = {
+ name: { value: 'ba', matchMode: 'notContains' }
+ };
+ filters[globalFilterFieldName] = { value: '25', matchMode: 'notContains' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city'], undefined);
+
+ expect(result).toEqual([]);
+ });
+
+ it('should work with a prop `global`', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York', global: 'research' },
+ { name: 'bar', age: 25, city: 'Los Angeles', global: 'development' },
+ { name: 'baz', age: 35, city: 'Vancouver', global: 'research' }
+ ];
+
+ const filters: FiltersArg = {
+ age: { value: '25', matchMode: 'lte' }
+ };
+ filters[globalFilterFieldName] = { value: 'development', matchMode: 'notContains' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city', 'global'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York', global: 'research' }]);
+ });
+
+ it('should work with missing props', () => {
+ const data = [
+ { name: 'foo', age: 25, city: 'New York' },
+ { name: 'bar', age: 25, city: 'Los Angeles', global: 'development' },
+ { name: 'baz', age: 35, city: 'Vancouver', global: 'research' }
+ ];
+
+ const filters: FiltersArg = {
+ age: { value: '25', matchMode: 'lte' }
+ };
+ filters[globalFilterFieldName] = { value: 'development', matchMode: 'notContains' };
+
+ const result = service.filter(data, filters, ['name', 'age', 'city', 'global'], undefined);
+
+ expect(result).toEqual([{ name: 'foo', age: 25, city: 'New York' }]);
+ });
+ });
+ });
+ });
+});
diff --git a/packages/primeng/src/table/table.service.ts b/packages/primeng/src/table/table.service.ts
new file mode 100644
index 00000000000..3c81e6a7f82
--- /dev/null
+++ b/packages/primeng/src/table/table.service.ts
@@ -0,0 +1,196 @@
+import { Injectable } from '@angular/core';
+import { resolveFieldData } from '@primeuix/utils';
+import { Subject } from 'rxjs';
+
+import { FilterMatchMode, FilterMetadata, FilterOperator, FilterService, SortMeta } from 'primeng/api';
+
+import { FiltersArg } from '../api/fitlersarg';
+
+// DEBUG! MAKE HINT!
+export const globalFilterFieldName = '__##__global__##__';
+
+@Injectable()
+export class TableService {
+ private sortSource = new Subject();
+ private selectionSource = new Subject();
+ private contextMenuSource = new Subject();
+ private valueSource = new Subject();
+ private totalRecordsSource = new Subject();
+ private columnsSource = new Subject();
+
+ sortSource$ = this.sortSource.asObservable();
+ selectionSource$ = this.selectionSource.asObservable();
+ contextMenuSource$ = this.contextMenuSource.asObservable();
+ valueSource$ = this.valueSource.asObservable();
+ totalRecordsSource$ = this.totalRecordsSource.asObservable();
+ columnsSource$ = this.columnsSource.asObservable();
+
+ constructor(private filterService: FilterService) {}
+
+ onSort(sortMeta: SortMeta | SortMeta[] | null) {
+ this.sortSource.next(sortMeta);
+ }
+
+ onSelectionChange() {
+ this.selectionSource.next(null);
+ }
+
+ onContextMenu(data: any) {
+ this.contextMenuSource.next(data);
+ }
+
+ onValueChange(value: any) {
+ this.valueSource.next(value);
+ }
+
+ onTotalRecordsChange(value: number) {
+ this.totalRecordsSource.next(value);
+ }
+
+ onColumnsChange(columns: any[]) {
+ this.columnsSource.next(columns);
+ }
+
+ filter(data: any[], filters: FiltersArg, globalFilterFieldsArray: any[], filterLocale: string | undefined): any[] {
+ if (!data || data.length === 0) {
+ return [];
+ }
+
+ if (!filters || Object.keys(filters).length === 0) {
+ return data;
+ }
+
+ let filteredValue = [];
+
+ for (let dataItem of data) {
+ let localMatch = true;
+ let globalMatch = false;
+ let localFiltered = false;
+
+ for (let prop in filters) {
+ if (filters.hasOwnProperty(prop) && prop !== globalFilterFieldName) {
+ localFiltered = true;
+ let filterField = prop;
+ let filterMeta = filters[filterField];
+
+ if (Array.isArray(filterMeta)) {
+ const initialOperator = FilterOperator.AND;
+ let operator: FilterOperator = initialOperator;
+
+ for (let meta of filterMeta) {
+ const currentMatch = this.executeLocalFilter(filterField, dataItem, meta, filterLocale);
+
+ switch (operator) {
+ case FilterOperator.OR:
+ localMatch ||= currentMatch;
+ break;
+
+ case FilterOperator.AND:
+ localMatch &&= currentMatch;
+ break;
+ }
+
+ operator = meta.operator || FilterOperator.AND;
+ }
+ } else {
+ localMatch = this.executeLocalFilter(filterField, dataItem, filterMeta, filterLocale);
+ }
+
+ if (!localMatch) {
+ break;
+ }
+ }
+ }
+
+ if (filters[globalFilterFieldName] && !globalMatch && globalFilterFieldsArray) {
+ globalMatch = this.initGlobalMatch((filters[globalFilterFieldName]).matchMode);
+
+ for (let globalField of globalFilterFieldsArray) {
+ let globalFilterField = globalField.field || globalField;
+ const matchMode = (filters[globalFilterFieldName]).matchMode;
+
+ const resolvedData = resolveFieldData(dataItem, globalFilterField);
+
+ let currentMatch = (this.filterService).filters[matchMode](resolvedData, (filters[globalFilterFieldName]).value, filterLocale);
+
+ if (!resolvedData && this.isNegating(matchMode)) {
+ currentMatch = true;
+ }
+
+ if (this.concatWithOr(matchMode)) {
+ globalMatch ||= currentMatch;
+ if (currentMatch) {
+ break;
+ }
+ } else if (this.concatWithAnd(matchMode)) {
+ globalMatch &&= currentMatch;
+ if (!currentMatch) {
+ break;
+ }
+ }
+ }
+ }
+
+ let matches: boolean;
+ if (filters[globalFilterFieldName]) {
+ matches = localFiltered ? localFiltered && localMatch && globalMatch : globalMatch;
+ } else {
+ matches = localFiltered && localMatch;
+ }
+
+ if (matches) {
+ filteredValue.push(dataItem);
+ }
+ }
+
+ return filteredValue;
+ }
+
+ private initGlobalMatch(matchMode: string): boolean {
+ if (this.concatWithOr(matchMode)) {
+ return false;
+ } else if (this.concatWithAnd(matchMode)) {
+ return true;
+ } else {
+ throw new Error(`Unsupported match mode: ${matchMode}`);
+ }
+ }
+
+ private concatWithOr(matchMode: string): boolean {
+ return [
+ FilterMatchMode.STARTS_WITH,
+ FilterMatchMode.CONTAINS,
+ FilterMatchMode.ENDS_WITH,
+ FilterMatchMode.EQUALS,
+ FilterMatchMode.IN,
+ FilterMatchMode.LESS_THAN,
+ FilterMatchMode.LESS_THAN_OR_EQUAL_TO,
+ FilterMatchMode.GREATER_THAN,
+ FilterMatchMode.GREATER_THAN_OR_EQUAL_TO,
+ FilterMatchMode.BETWEEN,
+ FilterMatchMode.IS,
+ FilterMatchMode.BEFORE,
+ FilterMatchMode.AFTER,
+ FilterMatchMode.DATE_IS,
+ FilterMatchMode.DATE_BEFORE,
+ FilterMatchMode.DATE_AFTER
+ ].includes(matchMode);
+ }
+
+ private concatWithAnd(matchMode: string): boolean {
+ return this.isNegating(matchMode);
+ }
+
+ private isNegating(matchMode: string): boolean {
+ return [FilterMatchMode.NOT_CONTAINS, FilterMatchMode.NOT_EQUALS, FilterMatchMode.IS_NOT, FilterMatchMode.DATE_IS_NOT].includes(matchMode);
+ }
+
+ private executeLocalFilter(field: string, rowData: any, filterMeta: FilterMetadata, filterLocale: string | undefined): boolean {
+ const filterValue = filterMeta.value;
+ const filterMatchMode = filterMeta.matchMode || FilterMatchMode.STARTS_WITH;
+ const dataFieldValue = resolveFieldData(rowData, field);
+ const filterConstraint = (this.filterService).filters[filterMatchMode];
+
+ return filterConstraint(dataFieldValue, filterValue, filterLocale);
+ }
+}
diff --git a/packages/primeng/src/table/table.ts b/packages/primeng/src/table/table.ts
index 1da500f9b26..4080a9a8344 100644
--- a/packages/primeng/src/table/table.ts
+++ b/packages/primeng/src/table/table.ts
@@ -15,7 +15,6 @@ import {
HostListener,
inject,
Inject,
- Injectable,
Input,
NgModule,
NgZone,
@@ -78,7 +77,7 @@ import { Select } from 'primeng/select';
import { SelectButton } from 'primeng/selectbutton';
import { Nullable, VoidListener } from 'primeng/ts-helpers';
import { ObjectUtils, ZIndexUtils } from 'primeng/utils';
-import { Subject, Subscription } from 'rxjs';
+import { Subscription } from 'rxjs';
import { TableStyle } from './style/tablestyle';
import {
ExportCSVOptions,
@@ -101,46 +100,10 @@ import {
TableSelectAllChangeEvent
} from './table.interface';
-@Injectable()
-export class TableService {
- private sortSource = new Subject();
- private selectionSource = new Subject();
- private contextMenuSource = new Subject();
- private valueSource = new Subject();
- private totalRecordsSource = new Subject();
- private columnsSource = new Subject();
+import { TableService } from './table.service';
+export { TableService } from './table.service';
- sortSource$ = this.sortSource.asObservable();
- selectionSource$ = this.selectionSource.asObservable();
- contextMenuSource$ = this.contextMenuSource.asObservable();
- valueSource$ = this.valueSource.asObservable();
- totalRecordsSource$ = this.totalRecordsSource.asObservable();
- columnsSource$ = this.columnsSource.asObservable();
-
- onSort(sortMeta: SortMeta | SortMeta[] | null) {
- this.sortSource.next(sortMeta);
- }
-
- onSelectionChange() {
- this.selectionSource.next(null);
- }
-
- onContextMenu(data: any) {
- this.contextMenuSource.next(data);
- }
-
- onValueChange(value: any) {
- this.valueSource.next(value);
- }
-
- onTotalRecordsChange(value: number) {
- this.totalRecordsSource.next(value);
- }
-
- onColumnsChange(columns: any[]) {
- this.columnsSource.next(columns);
- }
-}
+import { globalFilterFieldName } from './table.service';
@Directive({
selector: '[pRowGroupHeader]',
@@ -5446,7 +5409,7 @@ export class Table extends BaseComponent implements OnInit, AfterViewInit, After
}
filterGlobal(value: any, matchMode: string) {
- this.filter(value, 'global', matchMode);
+ this.filter(value, globalFilterFieldName, matchMode);
}
isFilterBlank(filter: any): boolean {
@@ -5477,64 +5440,12 @@ export class Table extends BaseComponent implements OnInit, AfterViewInit, After
}
} else {
let globalFilterFieldsArray;
- if (this.filters['global']) {
+ if (this.filters[globalFilterFieldName]) {
if (!this.columns && !this.globalFilterFields) throw new Error('Global filtering requires dynamic columns or globalFilterFields to be defined.');
else globalFilterFieldsArray = this.globalFilterFields || this.columns;
}
- this.filteredValue = [];
-
- for (let i = 0; i < this.value.length; i++) {
- let localMatch = true;
- let globalMatch = false;
- let localFiltered = false;
-
- for (let prop in this.filters) {
- if (this.filters.hasOwnProperty(prop) && prop !== 'global') {
- localFiltered = true;
- let filterField = prop;
- let filterMeta = this.filters[filterField];
-
- if (Array.isArray(filterMeta)) {
- for (let meta of filterMeta) {
- localMatch = this.executeLocalFilter(filterField, this.value[i], meta);
-
- if ((meta.operator === FilterOperator.OR && localMatch) || (meta.operator === FilterOperator.AND && !localMatch)) {
- break;
- }
- }
- } else {
- localMatch = this.executeLocalFilter(filterField, this.value[i], filterMeta);
- }
-
- if (!localMatch) {
- break;
- }
- }
- }
-
- if (this.filters['global'] && !globalMatch && globalFilterFieldsArray) {
- for (let j = 0; j < globalFilterFieldsArray.length; j++) {
- let globalFilterField = globalFilterFieldsArray[j].field || globalFilterFieldsArray[j];
- globalMatch = (this.filterService).filters[(this.filters['global']).matchMode](resolveFieldData(this.value[i], globalFilterField), (this.filters['global']).value, this.filterLocale);
-
- if (globalMatch) {
- break;
- }
- }
- }
-
- let matches: boolean;
- if (this.filters['global']) {
- matches = localFiltered ? localFiltered && localMatch && globalMatch : globalMatch;
- } else {
- matches = localFiltered && localMatch;
- }
-
- if (matches) {
- this.filteredValue.push(this.value[i]);
- }
- }
+ this.filteredValue = this.tableService.filter(this.value, this.filters, globalFilterFieldsArray, this.filterLocale);
if (this.filteredValue.length === this.value.length) {
this.filteredValue = null;
@@ -5568,15 +5479,6 @@ export class Table extends BaseComponent implements OnInit, AfterViewInit, After
}
}
- executeLocalFilter(field: string, rowData: any, filterMeta: FilterMetadata): boolean {
- let filterValue = filterMeta.value;
- let filterMatchMode = filterMeta.matchMode || FilterMatchMode.STARTS_WITH;
- let dataFieldValue = resolveFieldData(rowData, field);
- let filterConstraint = (this.filterService).filters[filterMatchMode];
-
- return filterConstraint(dataFieldValue, filterValue, this.filterLocale);
- }
-
hasFilter() {
let empty = true;
for (let prop in this.filters) {
@@ -5596,7 +5498,7 @@ export class Table extends BaseComponent implements OnInit, AfterViewInit, After
sortField: this.sortField,
sortOrder: this.sortOrder,
filters: this.filters,
- globalFilter: this.filters && this.filters['global'] ? (this.filters['global']).value : null,
+ globalFilter: this.filters && this.filters[globalFilterFieldName] ? (this.filters[globalFilterFieldName]).value : null,
multiSortMeta: this.multiSortMeta,
forceUpdate: () => this.cd.detectChanges()
};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9c66ead0c0e..86ce876ffec 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -77,7 +77,7 @@ importers:
devDependencies:
'@angular-devkit/build-angular':
specifier: catalog:angular18
- version: 18.2.12(jfmbvobkja23tkwz64xfvawquy)
+ version: 18.2.12(jugstyfayoove7qi7j3w7ekk7i)
'@angular-eslint/eslint-plugin':
specifier: catalog:angular18
version: 18.4.0(@typescript-eslint/utils@8.14.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.4.5))(eslint@9.14.0(jiti@1.21.6))(typescript@5.4.5)
@@ -153,6 +153,12 @@ importers:
husky:
specifier: ^9.1.6
version: 9.1.6
+ jest:
+ specifier: ^29.7.0
+ version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ jest-preset-angular:
+ specifier: ^14.3.1
+ version: 14.3.2(@angular-devkit/build-angular@18.2.12(jugstyfayoove7qi7j3w7ekk7i))(@angular/compiler-cli@18.2.12(@angular/compiler@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser-dynamic@18.2.12(@angular/common@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.12(@angular/animations@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))))(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)))(typescript@5.4.5)
lint-staged:
specifier: ^12.0.0
version: 12.5.0
@@ -165,6 +171,9 @@ importers:
prettier:
specifier: ^3.0.0
version: 3.3.3
+ ts-jest:
+ specifier: ^29.2.5
+ version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)))(typescript@5.4.5)
tsup:
specifier: ^8.1.0
version: 8.3.5(jiti@1.21.6)(postcss@8.4.41)(typescript@5.4.5)(yaml@2.6.0)
@@ -847,6 +856,11 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/plugin-syntax-bigint@7.8.3':
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/plugin-syntax-class-properties@7.12.13':
resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
peerDependencies:
@@ -896,6 +910,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/plugin-syntax-jsx@7.25.9':
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/plugin-syntax-logical-assignment-operators@7.10.4':
resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
peerDependencies:
@@ -938,6 +958,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/plugin-syntax-unicode-sets-regex@7.18.6':
resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
engines: {node: '>=6.9.0'}
@@ -1275,6 +1301,9 @@ packages:
resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
engines: {node: '>=6.9.0'}
+ '@bcoe/v8-coverage@0.2.3':
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+
'@colors/colors@1.5.0':
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
@@ -2144,18 +2173,76 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
+ '@istanbuljs/load-nyc-config@1.1.0':
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+
'@istanbuljs/schema@0.1.3':
resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
engines: {node: '>=8'}
+ '@jest/console@29.7.0':
+ resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/core@29.7.0':
+ resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+
+ '@jest/environment@29.7.0':
+ resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
'@jest/expect-utils@29.7.0':
resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jest/expect@29.7.0':
+ resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/fake-timers@29.7.0':
+ resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/globals@29.7.0':
+ resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/reporters@29.7.0':
+ resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+
'@jest/schemas@29.6.3':
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@jest/source-map@29.6.3':
+ resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/test-result@29.7.0':
+ resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/test-sequencer@29.7.0':
+ resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/transform@29.7.0':
+ resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
'@jest/types@29.6.3':
resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -2769,12 +2856,22 @@ packages:
resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
engines: {node: '>=18'}
+ '@sinonjs/commons@3.0.1':
+ resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
+
+ '@sinonjs/fake-timers@10.3.0':
+ resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+
'@socket.io/component-emitter@3.1.2':
resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==}
'@stackblitz/sdk@1.9.0':
resolution: {integrity: sha512-3m6C7f8pnR5KXys/Hqx2x6ylnpqOak6HtnZI6T5keEO0yT+E4Spkw37VEbdwuC+2oxmjdgq6YZEgiKX7hM1GmQ==}
+ '@tootallnate/once@2.0.0':
+ resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
+ engines: {node: '>= 10'}
+
'@tsconfig/node10@1.0.11':
resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
@@ -2795,6 +2892,18 @@ packages:
resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==}
engines: {node: ^16.14.0 || >=18.0.0}
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.6.8':
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.20.6':
+ resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+
'@types/body-parser@1.19.5':
resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
@@ -2828,6 +2937,9 @@ packages:
'@types/express@4.17.21':
resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
+ '@types/graceful-fs@4.1.9':
+ resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+
'@types/http-errors@2.0.4':
resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
@@ -2849,6 +2961,9 @@ packages:
'@types/jest@29.5.14':
resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
+ '@types/jsdom@20.0.1':
+ resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==}
+
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -2903,6 +3018,9 @@ packages:
'@types/stack-utils@2.0.3':
resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+ '@types/tough-cookie@4.0.5':
+ resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
+
'@types/wrap-ansi@3.0.0':
resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==}
@@ -3032,6 +3150,10 @@ packages:
'@yarnpkg/lockfile@1.1.0':
resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==}
+ abab@2.0.6:
+ resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
+ deprecated: Use your platform's native atob() and btoa() methods instead
+
abbrev@2.0.0:
resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -3040,6 +3162,9 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
+ acorn-globals@7.0.1:
+ resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
+
acorn-import-attributes@1.9.5:
resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
peerDependencies:
@@ -3067,6 +3192,10 @@ packages:
resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==}
engines: {node: '>=0.8'}
+ agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+
agent-base@7.1.1:
resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
engines: {node: '>= 14'}
@@ -3172,6 +3301,9 @@ packages:
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
@@ -3210,6 +3342,12 @@ packages:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
atob@2.1.2:
resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
engines: {node: '>= 4.5.0'}
@@ -3230,6 +3368,12 @@ packages:
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
+ babel-jest@29.7.0:
+ resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.8.0
+
babel-loader@9.1.3:
resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==}
engines: {node: '>= 14.15.0'}
@@ -3237,6 +3381,14 @@ packages:
'@babel/core': ^7.12.0
webpack: '>=5'
+ babel-plugin-istanbul@6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+
+ babel-plugin-jest-hoist@29.6.3:
+ resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
babel-plugin-polyfill-corejs2@0.4.12:
resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==}
peerDependencies:
@@ -3252,6 +3404,17 @@ packages:
peerDependencies:
'@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ babel-preset-current-node-syntax@1.1.0:
+ resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ babel-preset-jest@29.6.3:
+ resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -3304,6 +3467,13 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
+ bs-logger@0.2.6:
+ resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
+ engines: {node: '>= 6'}
+
+ bser@2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+
btoa@1.2.1:
resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==}
engines: {node: '>= 0.4.0'}
@@ -3349,6 +3519,14 @@ packages:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
caniuse-lite@1.0.30001680:
resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==}
@@ -3364,6 +3542,10 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
+ char-regex@1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+
chardet@0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
@@ -3391,6 +3573,9 @@ packages:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
+ cjs-module-lexer@1.4.1:
+ resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==}
+
clean-stack@2.2.0:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
@@ -3442,6 +3627,10 @@ packages:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
+ co@4.6.0:
+ resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+ engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+
codelyzer@0.0.28:
resolution: {integrity: sha512-DfrZrFWP4MnowANXJHUL0ZMhLqAEFLjC3lJofkHZM+QAczdOvlq8CmLrvqspCXmIdyotVD0xyjUWoPGOPo4lKA==}
peerDependencies:
@@ -3451,6 +3640,9 @@ packages:
resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==}
engines: {node: '>=0.8'}
+ collect-v8-coverage@1.0.2:
+ resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
+
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
@@ -3465,6 +3657,10 @@ packages:
resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
engines: {node: '>=0.1.90'}
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
commander@12.1.0:
resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
engines: {node: '>=18'}
@@ -3574,6 +3770,11 @@ packages:
engines: {node: '>=0.8'}
hasBin: true
+ create-jest@29.7.0:
+ resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ hasBin: true
+
create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
@@ -3612,12 +3813,26 @@ packages:
engines: {node: '>=4'}
hasBin: true
+ cssom@0.3.8:
+ resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
+
+ cssom@0.5.0:
+ resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
+
+ cssstyle@2.3.0:
+ resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
+ engines: {node: '>=8'}
+
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
custom-event@1.0.1:
resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==}
+ data-urls@3.0.2:
+ resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==}
+ engines: {node: '>=12'}
+
data-view-buffer@1.0.1:
resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
engines: {node: '>= 0.4'}
@@ -3659,6 +3874,17 @@ packages:
supports-color:
optional: true
+ decimal.js@10.4.3:
+ resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+
+ dedent@1.5.3:
+ resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==}
+ peerDependencies:
+ babel-plugin-macros: ^3.1.0
+ peerDependenciesMeta:
+ babel-plugin-macros:
+ optional: true
+
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
@@ -3697,6 +3923,10 @@ packages:
resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==}
engines: {node: '>=14.16'}
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
depd@1.1.2:
resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
engines: {node: '>= 0.6'}
@@ -3722,6 +3952,10 @@ packages:
resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
engines: {node: '>=8'}
+ detect-newline@3.1.0:
+ resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+ engines: {node: '>=8'}
+
detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
@@ -3767,6 +4001,11 @@ packages:
domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+ domexception@4.0.0:
+ resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==}
+ engines: {node: '>=12'}
+ deprecated: Use your platform's native DOMException instead
+
domhandler@5.0.3:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
@@ -3783,9 +4022,18 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+ ejs@3.1.10:
+ resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
electron-to-chromium@1.5.60:
resolution: {integrity: sha512-HcraRUkTKJ+8yA3b10i9qvhUlPBRDlKjn1XGek1zDGVfAKcvi8TsUnImGqLiEm9j6ZulxXIWWIo9BmbkbCTGgA==}
+ emittery@0.13.1:
+ resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
+ engines: {node: '>=12'}
+
emoji-regex@10.4.0:
resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
@@ -3927,6 +4175,11 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
+ escodegen@2.1.0:
+ resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
+ engines: {node: '>=6.0'}
+ hasBin: true
+
eslint-config-prettier@9.1.0:
resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
hasBin: true
@@ -4019,6 +4272,11 @@ packages:
resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
esquery@1.6.0:
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
engines: {node: '>=0.10'}
@@ -4060,6 +4318,10 @@ packages:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
+ exit@0.1.2:
+ resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+ engines: {node: '>= 0.8.0'}
+
expect@29.7.0:
resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -4104,6 +4366,9 @@ packages:
resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
engines: {node: '>=0.8.0'}
+ fb-watchman@2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+
fdir@6.4.2:
resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==}
peerDependencies:
@@ -4122,6 +4387,9 @@ packages:
file-saver@2.0.5:
resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
+ filelist@1.0.4:
+ resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
@@ -4185,6 +4453,10 @@ packages:
resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
engines: {node: '>=14'}
+ form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ engines: {node: '>= 6'}
+
forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
@@ -4250,6 +4522,10 @@ packages:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
engines: {node: '>= 0.4'}
+ get-package-type@0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+
get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
@@ -4346,6 +4622,10 @@ packages:
hpack.js@2.1.6:
resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
+ html-encoding-sniffer@3.0.0:
+ resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
+ engines: {node: '>=12'}
+
html-entities@2.5.2:
resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==}
@@ -4376,6 +4656,10 @@ packages:
http-parser-js@0.5.8:
resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==}
+ http-proxy-agent@5.0.0:
+ resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
+ engines: {node: '>= 6'}
+
http-proxy-agent@7.0.2:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
@@ -4397,6 +4681,10 @@ packages:
resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
engines: {node: '>=8.0.0'}
+ https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+
https-proxy-agent@7.0.5:
resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
engines: {node: '>= 14'}
@@ -4454,6 +4742,11 @@ packages:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
+ import-local@3.2.0:
+ resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
+ engines: {node: '>=8'}
+ hasBin: true
+
imurmurhash@0.1.4:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
@@ -4554,6 +4847,10 @@ packages:
resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
engines: {node: '>=18'}
+ is-generator-fn@2.1.0:
+ resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+ engines: {node: '>=6'}
+
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@@ -4609,6 +4906,9 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
@@ -4695,17 +4995,81 @@ packages:
jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+ jake@10.9.2:
+ resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
jasmine-core@4.6.1:
resolution: {integrity: sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==}
+ jest-changed-files@29.7.0:
+ resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-circus@29.7.0:
+ resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-cli@29.7.0:
+ resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ hasBin: true
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+
+ jest-config@29.7.0:
+ resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@types/node': '*'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ ts-node:
+ optional: true
+
jest-diff@29.7.0:
resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-docblock@29.7.0:
+ resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-each@29.7.0:
+ resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-environment-jsdom@29.7.0:
+ resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ canvas: ^2.5.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
+ jest-environment-node@29.7.0:
+ resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
jest-get-type@29.6.3:
resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-haste-map@29.7.0:
+ resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-leak-detector@29.7.0:
+ resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
jest-matcher-utils@29.7.0:
resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -4714,14 +5078,84 @@ packages:
resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-mock@29.7.0:
+ resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-pnp-resolver@1.2.3:
+ resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ jest-resolve: '*'
+ peerDependenciesMeta:
+ jest-resolve:
+ optional: true
+
+ jest-preset-angular@14.3.2:
+ resolution: {integrity: sha512-Aoei1O/o7x1I6bSCpU08jGqtQ2RBq7HvNbMIo/vHHbM50v4HX1gF3sWZTkM0U0KorNkdwZeONjMsPNwHyUAKqA==}
+ engines: {node: ^14.15.0 || >=16.10.0}
+ peerDependencies:
+ '@angular-devkit/build-angular': '>=15.0.0 <19.0.0'
+ '@angular/compiler-cli': '>=15.0.0 <19.0.0'
+ '@angular/core': '>=15.0.0 <19.0.0'
+ '@angular/platform-browser-dynamic': '>=15.0.0 <19.0.0'
+ jest: ^29.0.0
+ typescript: '>=4.8'
+
+ jest-regex-util@29.6.3:
+ resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-resolve-dependencies@29.7.0:
+ resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-resolve@29.7.0:
+ resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-runner@29.7.0:
+ resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-runtime@29.7.0:
+ resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-snapshot@29.7.0:
+ resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
jest-util@29.7.0:
resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-validate@29.7.0:
+ resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-watcher@29.7.0:
+ resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
jest-worker@27.5.1:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
+ jest-worker@29.7.0:
+ resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest@29.7.0:
+ resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ hasBin: true
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+
jiti@1.21.6:
resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
hasBin: true
@@ -4733,6 +5167,10 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+
js-yaml@4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
@@ -4744,6 +5182,15 @@ packages:
resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
engines: {node: '>=12.0.0'}
+ jsdom@20.0.3:
+ resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ canvas: ^2.5.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
jsesc@2.5.2:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
engines: {node: '>=4'}
@@ -4838,6 +5285,10 @@ packages:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
launch-editor@2.9.1:
resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==}
@@ -4859,6 +5310,10 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ leven@3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+
levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
@@ -4948,6 +5403,9 @@ packages:
lodash.isequal@4.5.0:
resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ lodash.memoize@4.1.2:
+ resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
+
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
@@ -5004,6 +5462,9 @@ packages:
resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==}
engines: {node: ^16.14.0 || >=18.0.0}
+ makeerror@1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+
marked@4.3.0:
resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
engines: {node: '>= 12'}
@@ -5077,6 +5538,10 @@ packages:
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+
minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -5227,6 +5692,9 @@ packages:
engines: {node: ^16.14.0 || >=18.0.0}
hasBin: true
+ node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
node-releases@2.0.18:
resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
@@ -5282,6 +5750,9 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+ nwsapi@2.2.13:
+ resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==}
+
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -5683,6 +6154,10 @@ packages:
resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
engines: {node: '>=10'}
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
proxy-addr@2.0.7:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'}
@@ -5690,6 +6165,9 @@ packages:
prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+ psl@1.11.0:
+ resolution: {integrity: sha512-pjFdcBXT4g061k/SQkzNCRnav+1RdIOgrcX8hs5eL3CEQcFZP9qT8T1RWYxGKT11rH1DdIW+kJRfCYykBJuerQ==}
+
punycode@1.4.1:
resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
@@ -5697,6 +6175,9 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
+ pure-rand@6.1.0:
+ resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+
qjobs@1.2.0:
resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==}
engines: {node: '>=0.9'}
@@ -5705,6 +6186,9 @@ packages:
resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
engines: {node: '>=0.6'}
+ querystringify@2.2.0:
+ resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -5799,6 +6283,10 @@ packages:
requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+ resolve-cwd@3.0.0:
+ resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+ engines: {node: '>=8'}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -5811,6 +6299,10 @@ packages:
resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==}
engines: {node: '>=12'}
+ resolve.exports@2.0.2:
+ resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
+ engines: {node: '>=10'}
+
resolve@1.22.8:
resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
hasBin: true
@@ -5922,6 +6414,10 @@ packages:
sax@1.4.1:
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+ saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+
schema-utils@3.3.0:
resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
engines: {node: '>= 10.13.0'}
@@ -6015,6 +6511,9 @@ packages:
resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==}
engines: {node: ^16.14.0 || >=18.0.0}
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
@@ -6082,6 +6581,9 @@ packages:
peerDependencies:
webpack: ^5.72.1
+ source-map-support@0.5.13:
+ resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
@@ -6119,6 +6621,9 @@ packages:
resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
engines: {node: '>=6.0.0'}
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
sprintf-js@1.1.3:
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
@@ -6154,6 +6659,10 @@ packages:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
+ string-length@4.0.2:
+ resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+ engines: {node: '>=10'}
+
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -6195,6 +6704,10 @@ packages:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
+ strip-bom@4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+
strip-final-newline@2.0.0:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
@@ -6232,6 +6745,9 @@ packages:
resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
engines: {node: '>=0.10'}
+ symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
synckit@0.9.2:
resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
engines: {node: ^14.18.0 || >=16.0.0}
@@ -6275,6 +6791,10 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+
text-segmentation@1.0.3:
resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==}
@@ -6315,6 +6835,9 @@ packages:
resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
engines: {node: '>=14.14'}
+ tmpl@1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -6323,9 +6846,17 @@ packages:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
+ tough-cookie@4.1.4:
+ resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
+ engines: {node: '>=6'}
+
tr46@1.0.1:
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
+ tr46@3.0.0:
+ resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==}
+ engines: {node: '>=12'}
+
tree-dump@1.0.2:
resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==}
engines: {node: '>=10.0'}
@@ -6345,12 +6876,36 @@ packages:
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- ts-node@10.9.2:
- resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ ts-jest@29.2.5:
+ resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
- '@swc/core': '>=1.2.50'
- '@swc/wasm': '>=1.2.50'
+ '@babel/core': '>=7.0.0-beta.0 <8'
+ '@jest/transform': ^29.0.0
+ '@jest/types': ^29.0.0
+ babel-jest: ^29.0.0
+ esbuild: '*'
+ jest: ^29.0.0
+ typescript: '>=4.3 <6'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ '@jest/transform':
+ optional: true
+ '@jest/types':
+ optional: true
+ babel-jest:
+ optional: true
+ esbuild:
+ optional: true
+
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
'@types/node': '*'
typescript: '>=2.7'
peerDependenciesMeta:
@@ -6401,6 +6956,10 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
+ type-detect@4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+
type-fest@0.21.3:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
@@ -6485,6 +7044,10 @@ packages:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
+ universalify@0.2.0:
+ resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+ engines: {node: '>= 4.0.0'}
+
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
@@ -6502,6 +7065,9 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ url-parse@1.5.10:
+ resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -6519,6 +7085,10 @@ packages:
v8-compile-cache-lib@3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ v8-to-istanbul@9.3.0:
+ resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==}
+ engines: {node: '>=10.12.0'}
+
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
@@ -6571,6 +7141,13 @@ packages:
vscode-textmate@8.0.0:
resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==}
+ w3c-xmlserializer@4.0.0:
+ resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==}
+ engines: {node: '>=14'}
+
+ walker@1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+
watchpack@2.4.1:
resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==}
engines: {node: '>=10.13.0'}
@@ -6587,6 +7164,10 @@ packages:
webidl-conversions@4.0.2:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
+ webidl-conversions@7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+
webpack-dev-middleware@7.4.2:
resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==}
engines: {node: '>= 18.12.0'}
@@ -6645,6 +7226,18 @@ packages:
resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
engines: {node: '>=0.8.0'}
+ whatwg-encoding@2.0.0:
+ resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
+ engines: {node: '>=12'}
+
+ whatwg-mimetype@3.0.0:
+ resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+ engines: {node: '>=12'}
+
+ whatwg-url@11.0.0:
+ resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==}
+ engines: {node: '>=12'}
+
whatwg-url@7.1.0:
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
@@ -6707,6 +7300,10 @@ packages:
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ write-file-atomic@4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
ws@8.17.1:
resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==}
engines: {node: '>=10.0.0'}
@@ -6740,6 +7337,13 @@ packages:
engines: {node: '>=0.8'}
hasBin: true
+ xml-name-validator@4.0.0:
+ resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+ engines: {node: '>=12'}
+
+ xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@@ -6938,7 +7542,7 @@ snapshots:
transitivePeerDependencies:
- chokidar
- '@angular-devkit/build-angular@18.2.12(jfmbvobkja23tkwz64xfvawquy)':
+ '@angular-devkit/build-angular@18.2.12(jugstyfayoove7qi7j3w7ekk7i)':
dependencies:
'@ampproject/remapping': 2.3.0
'@angular-devkit/architect': 0.1802.12(chokidar@3.6.0)
@@ -7007,6 +7611,8 @@ snapshots:
optionalDependencies:
'@angular/platform-server': 18.2.12(@angular/animations@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.12(@angular/animations@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))
esbuild: 0.23.0
+ jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ jest-environment-jsdom: 29.7.0
karma: 6.4.4
ng-packagr: 18.2.1(@angular/compiler-cli@18.2.12(@angular/compiler@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)))(tslib@2.6.3)(typescript@5.4.5)
tailwindcss: 3.4.15(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
@@ -7530,16 +8136,36 @@ snapshots:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
@@ -7565,56 +8191,121 @@ snapshots:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
'@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
'@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)':
dependencies:
'@babel/core': 7.25.2
@@ -8078,6 +8769,8 @@ snapshots:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
+ '@bcoe/v8-coverage@0.2.3': {}
+
'@colors/colors@1.5.0': {}
'@cspotcode/source-map-support@0.8.1':
@@ -8637,16 +9330,169 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
+ '@istanbuljs/load-nyc-config@1.1.0':
+ dependencies:
+ camelcase: 5.3.1
+ find-up: 4.1.0
+ get-package-type: 0.1.0
+ js-yaml: 3.14.1
+ resolve-from: 5.0.0
+
'@istanbuljs/schema@0.1.3': {}
+ '@jest/console@29.7.0':
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ chalk: 4.1.2
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ slash: 3.0.0
+
+ '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))':
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/reporters': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ exit: 0.1.2
+ graceful-fs: 4.2.11
+ jest-changed-files: 29.7.0
+ jest-config: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ jest-haste-map: 29.7.0
+ jest-message-util: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-resolve-dependencies: 29.7.0
+ jest-runner: 29.7.0
+ jest-runtime: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ jest-watcher: 29.7.0
+ micromatch: 4.0.8
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ strip-ansi: 6.0.1
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+
+ '@jest/environment@29.7.0':
+ dependencies:
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ jest-mock: 29.7.0
+
'@jest/expect-utils@29.7.0':
dependencies:
jest-get-type: 29.6.3
+ '@jest/expect@29.7.0':
+ dependencies:
+ expect: 29.7.0
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/fake-timers@29.7.0':
+ dependencies:
+ '@jest/types': 29.6.3
+ '@sinonjs/fake-timers': 10.3.0
+ '@types/node': 22.9.0
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+
+ '@jest/globals@29.7.0':
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/expect': 29.7.0
+ '@jest/types': 29.6.3
+ jest-mock: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/reporters@29.7.0':
+ dependencies:
+ '@bcoe/v8-coverage': 0.2.3
+ '@jest/console': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.25
+ '@types/node': 22.9.0
+ chalk: 4.1.2
+ collect-v8-coverage: 1.0.2
+ exit: 0.1.2
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-instrument: 6.0.3
+ istanbul-lib-report: 3.0.1
+ istanbul-lib-source-maps: 4.0.1
+ istanbul-reports: 3.1.7
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ slash: 3.0.0
+ string-length: 4.0.2
+ strip-ansi: 6.0.1
+ v8-to-istanbul: 9.3.0
+ transitivePeerDependencies:
+ - supports-color
+
'@jest/schemas@29.6.3':
dependencies:
'@sinclair/typebox': 0.27.8
+ '@jest/source-map@29.6.3':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ callsites: 3.1.0
+ graceful-fs: 4.2.11
+
+ '@jest/test-result@29.7.0':
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ collect-v8-coverage: 1.0.2
+
+ '@jest/test-sequencer@29.7.0':
+ dependencies:
+ '@jest/test-result': 29.7.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ slash: 3.0.0
+
+ '@jest/transform@29.7.0':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.25
+ babel-plugin-istanbul: 6.1.1
+ chalk: 4.1.2
+ convert-source-map: 2.0.0
+ fast-json-stable-stringify: 2.1.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ micromatch: 4.0.8
+ pirates: 4.0.6
+ slash: 3.0.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
'@jest/types@29.6.3':
dependencies:
'@jest/schemas': 29.6.3
@@ -9145,10 +9991,20 @@ snapshots:
'@sindresorhus/merge-streams@2.3.0': {}
+ '@sinonjs/commons@3.0.1':
+ dependencies:
+ type-detect: 4.0.8
+
+ '@sinonjs/fake-timers@10.3.0':
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+
'@socket.io/component-emitter@3.1.2': {}
'@stackblitz/sdk@1.9.0': {}
+ '@tootallnate/once@2.0.0': {}
+
'@tsconfig/node10@1.0.11': {}
'@tsconfig/node12@1.0.11': {}
@@ -9164,6 +10020,27 @@ snapshots:
'@tufjs/canonical-json': 2.0.0
minimatch: 9.0.5
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.26.2
+ '@babel/types': 7.26.0
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.6
+
+ '@types/babel__generator@7.6.8':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.26.2
+ '@babel/types': 7.26.0
+
+ '@types/babel__traverse@7.20.6':
+ dependencies:
+ '@babel/types': 7.26.0
+
'@types/body-parser@1.19.5':
dependencies:
'@types/connect': 3.4.38
@@ -9213,6 +10090,10 @@ snapshots:
'@types/qs': 6.9.17
'@types/serve-static': 1.15.7
+ '@types/graceful-fs@4.1.9':
+ dependencies:
+ '@types/node': 22.9.0
+
'@types/http-errors@2.0.4': {}
'@types/http-proxy@1.17.15':
@@ -9236,6 +10117,12 @@ snapshots:
expect: 29.7.0
pretty-format: 29.7.0
+ '@types/jsdom@20.0.1':
+ dependencies:
+ '@types/node': 22.9.0
+ '@types/tough-cookie': 4.0.5
+ parse5: 7.2.1
+
'@types/json-schema@7.0.15': {}
'@types/json5@0.0.29': {}
@@ -9293,6 +10180,8 @@ snapshots:
'@types/stack-utils@2.0.3': {}
+ '@types/tough-cookie@4.0.5': {}
+
'@types/wrap-ansi@3.0.0': {}
'@types/ws@8.5.13':
@@ -9472,6 +10361,8 @@ snapshots:
'@yarnpkg/lockfile@1.1.0': {}
+ abab@2.0.6: {}
+
abbrev@2.0.0: {}
accepts@1.3.8:
@@ -9479,6 +10370,11 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
+ acorn-globals@7.0.1:
+ dependencies:
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+
acorn-import-attributes@1.9.5(acorn@8.14.0):
dependencies:
acorn: 8.14.0
@@ -9500,6 +10396,12 @@ snapshots:
adler-32@1.3.1: {}
+ agent-base@6.0.2:
+ dependencies:
+ debug: 4.3.7(supports-color@9.4.0)
+ transitivePeerDependencies:
+ - supports-color
+
agent-base@7.1.1:
dependencies:
debug: 4.3.7(supports-color@9.4.0)
@@ -9602,6 +10504,10 @@ snapshots:
arg@5.0.2: {}
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
argparse@2.0.1: {}
aria-query@5.3.2: {}
@@ -9658,6 +10564,10 @@ snapshots:
astral-regex@2.0.0: {}
+ async@3.2.6: {}
+
+ asynckit@0.4.0: {}
+
atob@2.1.2: {}
autoprefixer@10.4.20(postcss@8.4.41):
@@ -9686,6 +10596,19 @@ snapshots:
axobject-query@4.1.0: {}
+ babel-jest@29.7.0(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@jest/transform': 29.7.0
+ '@types/babel__core': 7.20.5
+ babel-plugin-istanbul: 6.1.1
+ babel-preset-jest: 29.6.3(@babel/core@7.26.0)
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ slash: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
babel-loader@9.1.3(@babel/core@7.25.2)(webpack@5.94.0(esbuild@0.23.0)):
dependencies:
'@babel/core': 7.25.2
@@ -9693,13 +10616,30 @@ snapshots:
schema-utils: 4.2.0
webpack: 5.94.0(esbuild@0.24.0)
- babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.25.2):
+ babel-plugin-istanbul@6.1.1:
dependencies:
- '@babel/compat-data': 7.26.2
- '@babel/core': 7.25.2
- '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.25.2)
- semver: 6.3.1
- transitivePeerDependencies:
+ '@babel/helper-plugin-utils': 7.25.9
+ '@istanbuljs/load-nyc-config': 1.1.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-instrument: 5.2.1
+ test-exclude: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-jest-hoist@29.6.3:
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+ '@types/babel__core': 7.20.5
+ '@types/babel__traverse': 7.20.6
+
+ babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.25.2):
+ dependencies:
+ '@babel/compat-data': 7.26.2
+ '@babel/core': 7.25.2
+ '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.25.2)
+ semver: 6.3.1
+ transitivePeerDependencies:
- supports-color
babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2):
@@ -9717,6 +10657,31 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0)
+
+ babel-preset-jest@29.6.3(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ babel-plugin-jest-hoist: 29.6.3
+ babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
+
balanced-match@1.0.2: {}
base64-arraybuffer@1.0.2:
@@ -9782,6 +10747,14 @@ snapshots:
node-releases: 2.0.18
update-browserslist-db: 1.1.1(browserslist@4.24.2)
+ bs-logger@0.2.6:
+ dependencies:
+ fast-json-stable-stringify: 2.1.0
+
+ bser@2.1.1:
+ dependencies:
+ node-int64: 0.4.0
+
btoa@1.2.1: {}
buffer-from@1.1.2: {}
@@ -9831,6 +10804,10 @@ snapshots:
camelcase-css@2.0.1: {}
+ camelcase@5.3.1: {}
+
+ camelcase@6.3.0: {}
+
caniuse-lite@1.0.30001680: {}
canvg@3.0.10:
@@ -9855,6 +10832,8 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
+ char-regex@1.0.2: {}
+
chardet@0.7.0: {}
chart.js@4.4.2:
@@ -9883,6 +10862,8 @@ snapshots:
ci-info@3.9.0: {}
+ cjs-module-lexer@1.4.1: {}
+
clean-stack@2.2.0: {}
clean-stack@4.2.0:
@@ -9936,6 +10917,8 @@ snapshots:
clone@1.0.4: {}
+ co@4.6.0: {}
+
codelyzer@0.0.28(tslint@3.15.1(typescript@5.4.5)):
dependencies:
sprintf-js: 1.1.3
@@ -9943,6 +10926,8 @@ snapshots:
codepage@1.15.0: {}
+ collect-v8-coverage@1.0.2: {}
+
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
@@ -9953,6 +10938,10 @@ snapshots:
colors@1.4.0: {}
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
commander@12.1.0: {}
commander@2.20.3: {}
@@ -10053,6 +11042,21 @@ snapshots:
crc-32@1.2.2: {}
+ create-jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)):
+ dependencies:
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ exit: 0.1.2
+ graceful-fs: 4.2.11
+ jest-config: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ jest-util: 29.7.0
+ prompts: 2.4.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+
create-require@1.1.1: {}
critters@0.0.24:
@@ -10101,10 +11105,24 @@ snapshots:
cssesc@3.0.0: {}
+ cssom@0.3.8: {}
+
+ cssom@0.5.0: {}
+
+ cssstyle@2.3.0:
+ dependencies:
+ cssom: 0.3.8
+
csstype@3.1.3: {}
custom-event@1.0.1: {}
+ data-urls@3.0.2:
+ dependencies:
+ abab: 2.0.6
+ whatwg-mimetype: 3.0.0
+ whatwg-url: 11.0.0
+
data-view-buffer@1.0.1:
dependencies:
call-bind: 1.0.7
@@ -10139,6 +11157,10 @@ snapshots:
optionalDependencies:
supports-color: 9.4.0
+ decimal.js@10.4.3: {}
+
+ dedent@1.5.3: {}
+
deep-is@0.1.4: {}
deepmerge@4.3.1: {}
@@ -10183,6 +11205,8 @@ snapshots:
rimraf: 3.0.2
slash: 4.0.0
+ delayed-stream@1.0.0: {}
+
depd@1.1.2: {}
depd@2.0.0: {}
@@ -10196,6 +11220,8 @@ snapshots:
detect-libc@2.0.3: {}
+ detect-newline@3.1.0: {}
+
detect-node@2.1.0: {}
di@0.0.1: {}
@@ -10237,6 +11263,10 @@ snapshots:
domelementtype@2.3.0: {}
+ domexception@4.0.0:
+ dependencies:
+ webidl-conversions: 7.0.0
+
domhandler@5.0.3:
dependencies:
domelementtype: 2.3.0
@@ -10254,8 +11284,14 @@ snapshots:
ee-first@1.1.1: {}
+ ejs@3.1.10:
+ dependencies:
+ jake: 10.9.2
+
electron-to-chromium@1.5.60: {}
+ emittery@0.13.1: {}
+
emoji-regex@10.4.0: {}
emoji-regex@8.0.0: {}
@@ -10540,6 +11576,14 @@ snapshots:
escape-string-regexp@5.0.0: {}
+ escodegen@2.1.0:
+ dependencies:
+ esprima: 4.0.1
+ estraverse: 5.3.0
+ esutils: 2.0.3
+ optionalDependencies:
+ source-map: 0.6.1
+
eslint-config-prettier@9.1.0(eslint@9.14.0(jiti@1.21.6)):
dependencies:
eslint: 9.14.0(jiti@1.21.6)
@@ -10682,6 +11726,8 @@ snapshots:
acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 4.2.0
+ esprima@4.0.1: {}
+
esquery@1.6.0:
dependencies:
estraverse: 5.3.0
@@ -10718,6 +11764,8 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 2.0.0
+ exit@0.1.2: {}
+
expect@29.7.0:
dependencies:
'@jest/expect-utils': 29.7.0
@@ -10798,6 +11846,10 @@ snapshots:
dependencies:
websocket-driver: 0.7.4
+ fb-watchman@2.0.2:
+ dependencies:
+ bser: 2.1.1
+
fdir@6.4.2(picomatch@4.0.2):
optionalDependencies:
picomatch: 4.0.2
@@ -10810,6 +11862,10 @@ snapshots:
file-saver@2.0.5: {}
+ filelist@1.0.4:
+ dependencies:
+ minimatch: 5.1.6
+
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
@@ -10890,6 +11946,12 @@ snapshots:
cross-spawn: 7.0.5
signal-exit: 4.1.0
+ form-data@4.0.1:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
forwarded@0.2.0: {}
frac@1.1.2: {}
@@ -10948,6 +12010,8 @@ snapshots:
has-symbols: 1.0.3
hasown: 2.0.2
+ get-package-type@0.1.0: {}
+
get-stream@6.0.1: {}
get-symbol-description@1.0.2:
@@ -11059,6 +12123,10 @@ snapshots:
readable-stream: 2.3.8
wbuf: 1.7.3
+ html-encoding-sniffer@3.0.0:
+ dependencies:
+ whatwg-encoding: 2.0.0
+
html-entities@2.5.2: {}
html-escaper@2.0.2: {}
@@ -11097,6 +12165,14 @@ snapshots:
http-parser-js@0.5.8: {}
+ http-proxy-agent@5.0.0:
+ dependencies:
+ '@tootallnate/once': 2.0.0
+ agent-base: 6.0.2
+ debug: 4.3.7(supports-color@9.4.0)
+ transitivePeerDependencies:
+ - supports-color
+
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.1
@@ -11135,6 +12211,13 @@ snapshots:
transitivePeerDependencies:
- debug
+ https-proxy-agent@5.0.1:
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.3.7(supports-color@9.4.0)
+ transitivePeerDependencies:
+ - supports-color
+
https-proxy-agent@7.0.5:
dependencies:
agent-base: 7.1.1
@@ -11180,6 +12263,11 @@ snapshots:
parent-module: 1.0.1
resolve-from: 4.0.0
+ import-local@3.2.0:
+ dependencies:
+ pkg-dir: 4.2.0
+ resolve-cwd: 3.0.0
+
imurmurhash@0.1.4: {}
indent-string@4.0.0: {}
@@ -11262,6 +12350,8 @@ snapshots:
dependencies:
get-east-asian-width: 1.3.0
+ is-generator-fn@2.1.0: {}
+
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
@@ -11298,6 +12388,8 @@ snapshots:
is-plain-object@5.0.0: {}
+ is-potential-custom-element-name@1.0.1: {}
+
is-regex@1.1.4:
dependencies:
call-bind: 1.0.7
@@ -11392,8 +12484,97 @@ snapshots:
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
+ jake@10.9.2:
+ dependencies:
+ async: 3.2.6
+ chalk: 4.1.2
+ filelist: 1.0.4
+ minimatch: 3.1.2
+
jasmine-core@4.6.1: {}
+ jest-changed-files@29.7.0:
+ dependencies:
+ execa: 5.1.1
+ jest-util: 29.7.0
+ p-limit: 3.1.0
+
+ jest-circus@29.7.0:
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/expect': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ chalk: 4.1.2
+ co: 4.6.0
+ dedent: 1.5.3
+ is-generator-fn: 2.1.0
+ jest-each: 29.7.0
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-runtime: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ p-limit: 3.1.0
+ pretty-format: 29.7.0
+ pure-rand: 6.1.0
+ slash: 3.0.0
+ stack-utils: 2.0.6
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+
+ jest-cli@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)):
+ dependencies:
+ '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ create-jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ exit: 0.1.2
+ import-local: 3.2.0
+ jest-config: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+
+ jest-config@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@jest/test-sequencer': 29.7.0
+ '@jest/types': 29.6.3
+ babel-jest: 29.7.0(@babel/core@7.26.0)
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ deepmerge: 4.3.1
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ jest-circus: 29.7.0
+ jest-environment-node: 29.7.0
+ jest-get-type: 29.6.3
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-runner: 29.7.0
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ micromatch: 4.0.8
+ parse-json: 5.2.0
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ strip-json-comments: 3.1.1
+ optionalDependencies:
+ '@types/node': 22.9.0
+ ts-node: 10.9.2(@types/node@22.9.0)(typescript@5.4.5)
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+
jest-diff@29.7.0:
dependencies:
chalk: 4.1.2
@@ -11401,8 +12582,65 @@ snapshots:
jest-get-type: 29.6.3
pretty-format: 29.7.0
+ jest-docblock@29.7.0:
+ dependencies:
+ detect-newline: 3.1.0
+
+ jest-each@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ jest-get-type: 29.6.3
+ jest-util: 29.7.0
+ pretty-format: 29.7.0
+
+ jest-environment-jsdom@29.7.0:
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/jsdom': 20.0.1
+ '@types/node': 22.9.0
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+ jsdom: 20.0.3
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ jest-environment-node@29.7.0:
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+
jest-get-type@29.6.3: {}
+ jest-haste-map@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/graceful-fs': 4.1.9
+ '@types/node': 22.9.0
+ anymatch: 3.1.3
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.11
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ micromatch: 4.0.8
+ walker: 1.0.8
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ jest-leak-detector@29.7.0:
+ dependencies:
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+
jest-matcher-utils@29.7.0:
dependencies:
chalk: 4.1.2
@@ -11422,6 +12660,141 @@ snapshots:
slash: 3.0.0
stack-utils: 2.0.6
+ jest-mock@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ jest-util: 29.7.0
+
+ jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
+ optionalDependencies:
+ jest-resolve: 29.7.0
+
+ jest-preset-angular@14.3.2(@angular-devkit/build-angular@18.2.12(jugstyfayoove7qi7j3w7ekk7i))(@angular/compiler-cli@18.2.12(@angular/compiler@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser-dynamic@18.2.12(@angular/common@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.12(@angular/animations@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))))(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)))(typescript@5.4.5):
+ dependencies:
+ '@angular-devkit/build-angular': 18.2.12(jugstyfayoove7qi7j3w7ekk7i)
+ '@angular/compiler-cli': 18.2.12(@angular/compiler@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5)
+ '@angular/core': 18.2.12(rxjs@7.8.1)(zone.js@0.14.10)
+ '@angular/platform-browser-dynamic': 18.2.12(@angular/common@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.12(@angular/animations@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.12(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.12(rxjs@7.8.1)(zone.js@0.14.10)))
+ bs-logger: 0.2.6
+ esbuild-wasm: 0.23.0
+ jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ jest-environment-jsdom: 29.7.0
+ jest-util: 29.7.0
+ pretty-format: 29.7.0
+ ts-jest: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.19.12)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)))(typescript@5.4.5)
+ typescript: 5.4.5
+ optionalDependencies:
+ esbuild: 0.19.12
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@jest/transform'
+ - '@jest/types'
+ - babel-jest
+ - bufferutil
+ - canvas
+ - supports-color
+ - utf-8-validate
+
+ jest-regex-util@29.6.3: {}
+
+ jest-resolve-dependencies@29.7.0:
+ dependencies:
+ jest-regex-util: 29.6.3
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ jest-resolve@29.7.0:
+ dependencies:
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ resolve: 1.22.8
+ resolve.exports: 2.0.2
+ slash: 3.0.0
+
+ jest-runner@29.7.0:
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/environment': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ chalk: 4.1.2
+ emittery: 0.13.1
+ graceful-fs: 4.2.11
+ jest-docblock: 29.7.0
+ jest-environment-node: 29.7.0
+ jest-haste-map: 29.7.0
+ jest-leak-detector: 29.7.0
+ jest-message-util: 29.7.0
+ jest-resolve: 29.7.0
+ jest-runtime: 29.7.0
+ jest-util: 29.7.0
+ jest-watcher: 29.7.0
+ jest-worker: 29.7.0
+ p-limit: 3.1.0
+ source-map-support: 0.5.13
+ transitivePeerDependencies:
+ - supports-color
+
+ jest-runtime@29.7.0:
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/globals': 29.7.0
+ '@jest/source-map': 29.6.3
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ chalk: 4.1.2
+ cjs-module-lexer: 1.4.1
+ collect-v8-coverage: 1.0.2
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ slash: 3.0.0
+ strip-bom: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ jest-snapshot@29.7.0:
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.2
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ '@jest/expect-utils': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
+ chalk: 4.1.2
+ expect: 29.7.0
+ graceful-fs: 4.2.11
+ jest-diff: 29.7.0
+ jest-get-type: 29.6.3
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ natural-compare: 1.4.0
+ pretty-format: 29.7.0
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
@@ -11431,18 +12804,62 @@ snapshots:
graceful-fs: 4.2.11
picomatch: 2.3.1
+ jest-validate@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ jest-get-type: 29.6.3
+ leven: 3.1.0
+ pretty-format: 29.7.0
+
+ jest-watcher@29.7.0:
+ dependencies:
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ emittery: 0.13.1
+ jest-util: 29.7.0
+ string-length: 4.0.2
+
jest-worker@27.5.1:
dependencies:
'@types/node': 22.9.0
merge-stream: 2.0.0
supports-color: 8.1.1
+ jest-worker@29.7.0:
+ dependencies:
+ '@types/node': 22.9.0
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)):
+ dependencies:
+ '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ '@jest/types': 29.6.3
+ import-local: 3.2.0
+ jest-cli: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+
jiti@1.21.6: {}
joycon@3.1.1: {}
js-tokens@4.0.0: {}
+ js-yaml@3.14.1:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
js-yaml@4.1.0:
dependencies:
argparse: 2.0.1
@@ -11451,6 +12868,39 @@ snapshots:
jsdoc-type-pratt-parser@4.1.0: {}
+ jsdom@20.0.3:
+ dependencies:
+ abab: 2.0.6
+ acorn: 8.14.0
+ acorn-globals: 7.0.1
+ cssom: 0.5.0
+ cssstyle: 2.3.0
+ data-urls: 3.0.2
+ decimal.js: 10.4.3
+ domexception: 4.0.0
+ escodegen: 2.1.0
+ form-data: 4.0.1
+ html-encoding-sniffer: 3.0.0
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ is-potential-custom-element-name: 1.0.1
+ nwsapi: 2.2.13
+ parse5: 7.2.1
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 4.1.4
+ w3c-xmlserializer: 4.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 2.0.0
+ whatwg-mimetype: 3.0.0
+ whatwg-url: 11.0.0
+ ws: 8.18.0
+ xml-name-validator: 4.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
jsesc@2.5.2: {}
jsesc@3.0.2: {}
@@ -11571,6 +13021,8 @@ snapshots:
kind-of@6.0.3: {}
+ kleur@3.0.3: {}
+
launch-editor@2.9.1:
dependencies:
picocolors: 1.1.1
@@ -11596,6 +13048,8 @@ snapshots:
needle: 3.3.1
source-map: 0.6.1
+ leven@3.1.0: {}
+
levn@0.4.1:
dependencies:
prelude-ls: 1.2.1
@@ -11701,6 +13155,8 @@ snapshots:
lodash.isequal@4.5.0: {}
+ lodash.memoize@4.1.2: {}
+
lodash.merge@4.6.2: {}
lodash.sortby@4.7.0: {}
@@ -11782,6 +13238,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ makeerror@1.0.12:
+ dependencies:
+ tmpl: 1.0.5
+
marked@4.3.0: {}
media-typer@0.3.0: {}
@@ -11834,6 +13294,10 @@ snapshots:
dependencies:
brace-expansion: 1.1.11
+ minimatch@5.1.6:
+ dependencies:
+ brace-expansion: 2.0.1
+
minimatch@9.0.5:
dependencies:
brace-expansion: 2.0.1
@@ -12005,6 +13469,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ node-int64@0.4.0: {}
+
node-releases@2.0.18: {}
nopt@7.2.1:
@@ -12070,6 +13536,8 @@ snapshots:
dependencies:
boolbase: 1.0.0
+ nwsapi@2.2.13: {}
+
object-assign@4.1.1: {}
object-hash@3.0.0: {}
@@ -12447,6 +13915,11 @@ snapshots:
err-code: 2.0.3
retry: 0.12.0
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
proxy-addr@2.0.7:
dependencies:
forwarded: 0.2.0
@@ -12455,16 +13928,24 @@ snapshots:
prr@1.0.1:
optional: true
+ psl@1.11.0:
+ dependencies:
+ punycode: 2.3.1
+
punycode@1.4.1: {}
punycode@2.3.1: {}
+ pure-rand@6.1.0: {}
+
qjobs@1.2.0: {}
qs@6.13.0:
dependencies:
side-channel: 1.0.6
+ querystringify@2.2.0: {}
+
queue-microtask@1.2.3: {}
quill-delta@5.1.0:
@@ -12573,6 +14054,10 @@ snapshots:
requires-port@1.0.0: {}
+ resolve-cwd@3.0.0:
+ dependencies:
+ resolve-from: 5.0.0
+
resolve-from@4.0.0: {}
resolve-from@5.0.0: {}
@@ -12585,6 +14070,8 @@ snapshots:
postcss: 8.4.41
source-map: 0.6.1
+ resolve.exports@2.0.2: {}
+
resolve@1.22.8:
dependencies:
is-core-module: 2.15.1
@@ -12719,6 +14206,10 @@ snapshots:
sax@1.4.1:
optional: true
+ saxes@6.0.0:
+ dependencies:
+ xmlchars: 2.2.0
+
schema-utils@3.3.0:
dependencies:
'@types/json-schema': 7.0.15
@@ -12852,6 +14343,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ sisteransi@1.0.5: {}
+
slash@3.0.0: {}
slash@4.0.0: {}
@@ -12941,6 +14434,11 @@ snapshots:
source-map-js: 1.2.1
webpack: 5.94.0(esbuild@0.24.0)
+ source-map-support@0.5.13:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
@@ -12994,6 +14492,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ sprintf-js@1.0.3: {}
+
sprintf-js@1.1.3: {}
ssf@0.11.2:
@@ -13025,6 +14525,11 @@ snapshots:
string-argv@0.3.2: {}
+ string-length@4.0.2:
+ dependencies:
+ char-regex: 1.0.2
+ strip-ansi: 6.0.1
+
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
@@ -13080,6 +14585,8 @@ snapshots:
strip-bom@3.0.0: {}
+ strip-bom@4.0.0: {}
+
strip-final-newline@2.0.0: {}
strip-json-comments@3.1.1: {}
@@ -13111,6 +14618,8 @@ snapshots:
symbol-observable@4.0.0: {}
+ symbol-tree@3.2.4: {}
+
synckit@0.9.2:
dependencies:
'@pkgr/core': 0.1.1
@@ -13158,7 +14667,7 @@ snapshots:
mkdirp: 1.0.4
yallist: 4.0.0
- terser-webpack-plugin@5.3.10(esbuild@0.23.0)(webpack@5.94.0(esbuild@0.23.0)):
+ terser-webpack-plugin@5.3.10(esbuild@0.24.0)(webpack@5.94.0(esbuild@0.23.0)):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
jest-worker: 27.5.1
@@ -13167,7 +14676,7 @@ snapshots:
terser: 5.31.6
webpack: 5.94.0(esbuild@0.24.0)
optionalDependencies:
- esbuild: 0.23.0
+ esbuild: 0.24.0
terser@5.31.6:
dependencies:
@@ -13176,6 +14685,12 @@ snapshots:
commander: 2.20.3
source-map-support: 0.5.21
+ test-exclude@6.0.0:
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+
text-segmentation@1.0.3:
dependencies:
utrie: 1.0.2
@@ -13212,16 +14727,29 @@ snapshots:
tmp@0.2.3: {}
+ tmpl@1.0.5: {}
+
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
toidentifier@1.0.1: {}
+ tough-cookie@4.1.4:
+ dependencies:
+ psl: 1.11.0
+ punycode: 2.3.1
+ universalify: 0.2.0
+ url-parse: 1.5.10
+
tr46@1.0.1:
dependencies:
punycode: 2.3.1
+ tr46@3.0.0:
+ dependencies:
+ punycode: 2.3.1
+
tree-dump@1.0.2(tslib@2.6.3):
dependencies:
tslib: 2.6.3
@@ -13234,6 +14762,46 @@ snapshots:
ts-interface-checker@0.1.13: {}
+ ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.19.12)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)))(typescript@5.4.5):
+ dependencies:
+ bs-logger: 0.2.6
+ ejs: 3.1.10
+ fast-json-stable-stringify: 2.1.0
+ jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ jest-util: 29.7.0
+ json5: 2.2.3
+ lodash.memoize: 4.1.2
+ make-error: 1.3.6
+ semver: 7.6.3
+ typescript: 5.4.5
+ yargs-parser: 21.1.1
+ optionalDependencies:
+ '@babel/core': 7.26.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ babel-jest: 29.7.0(@babel/core@7.26.0)
+ esbuild: 0.19.12
+
+ ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5)))(typescript@5.4.5):
+ dependencies:
+ bs-logger: 0.2.6
+ ejs: 3.1.10
+ fast-json-stable-stringify: 2.1.0
+ jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5))
+ jest-util: 29.7.0
+ json5: 2.2.3
+ lodash.memoize: 4.1.2
+ make-error: 1.3.6
+ semver: 7.6.3
+ typescript: 5.4.5
+ yargs-parser: 21.1.1
+ optionalDependencies:
+ '@babel/core': 7.26.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ babel-jest: 29.7.0(@babel/core@7.26.0)
+ esbuild: 0.24.0
+
ts-node@10.9.2(@types/node@22.9.0)(typescript@5.4.5):
dependencies:
'@cspotcode/source-map-support': 0.8.1
@@ -13313,6 +14881,8 @@ snapshots:
dependencies:
prelude-ls: 1.2.1
+ type-detect@4.0.8: {}
+
type-fest@0.21.3: {}
type-is@1.6.18:
@@ -13403,6 +14973,8 @@ snapshots:
universalify@0.1.2: {}
+ universalify@0.2.0: {}
+
universalify@2.0.1: {}
unpipe@1.0.0: {}
@@ -13417,6 +14989,11 @@ snapshots:
dependencies:
punycode: 2.3.1
+ url-parse@1.5.10:
+ dependencies:
+ querystringify: 2.2.0
+ requires-port: 1.0.0
+
util-deprecate@1.0.2: {}
utils-merge@1.0.1: {}
@@ -13430,6 +15007,12 @@ snapshots:
v8-compile-cache-lib@3.0.1: {}
+ v8-to-istanbul@9.3.0:
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ '@types/istanbul-lib-coverage': 2.0.6
+ convert-source-map: 2.0.0
+
validate-npm-package-license@3.0.4:
dependencies:
spdx-correct: 3.2.0
@@ -13457,6 +15040,14 @@ snapshots:
vscode-textmate@8.0.0: {}
+ w3c-xmlserializer@4.0.0:
+ dependencies:
+ xml-name-validator: 4.0.0
+
+ walker@1.0.8:
+ dependencies:
+ makeerror: 1.0.12
+
watchpack@2.4.1:
dependencies:
glob-to-regexp: 0.4.1
@@ -13474,6 +15065,8 @@ snapshots:
webidl-conversions@4.0.2: {}
+ webidl-conversions@7.0.0: {}
+
webpack-dev-middleware@7.4.2(webpack@5.94.0(esbuild@0.23.0)):
dependencies:
colorette: 2.0.20
@@ -13560,7 +15153,7 @@ snapshots:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
- terser-webpack-plugin: 5.3.10(esbuild@0.23.0)(webpack@5.94.0(esbuild@0.23.0))
+ terser-webpack-plugin: 5.3.10(esbuild@0.24.0)(webpack@5.94.0(esbuild@0.23.0))
watchpack: 2.4.1
webpack-sources: 3.2.3
transitivePeerDependencies:
@@ -13576,6 +15169,17 @@ snapshots:
websocket-extensions@0.1.4: {}
+ whatwg-encoding@2.0.0:
+ dependencies:
+ iconv-lite: 0.6.3
+
+ whatwg-mimetype@3.0.0: {}
+
+ whatwg-url@11.0.0:
+ dependencies:
+ tr46: 3.0.0
+ webidl-conversions: 7.0.0
+
whatwg-url@7.1.0:
dependencies:
lodash.sortby: 4.7.0
@@ -13646,6 +15250,11 @@ snapshots:
wrappy@1.0.2: {}
+ write-file-atomic@4.0.2:
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+
ws@8.17.1: {}
ws@8.18.0: {}
@@ -13662,6 +15271,10 @@ snapshots:
wmf: 1.0.2
word: 0.3.0
+ xml-name-validator@4.0.0: {}
+
+ xmlchars@2.2.0: {}
+
y18n@5.0.8: {}
yallist@3.1.1: {}
diff --git a/setup-jest.ts b/setup-jest.ts
new file mode 100644
index 00000000000..7e05af53d6e
--- /dev/null
+++ b/setup-jest.ts
@@ -0,0 +1,4 @@
+// See also https://thymikee.github.io/jest-preset-angular/docs/getting-started/installation/
+import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone';
+
+setupZoneTestEnv();
diff --git a/tsconfig.spec.json b/tsconfig.spec.json
new file mode 100755
index 00000000000..1c8e648c24c
--- /dev/null
+++ b/tsconfig.spec.json
@@ -0,0 +1,28 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/spec",
+ "types": [
+ "jest",
+ "node",
+ "jasmine"
+ ],
+ "paths": { /* (UPDATED) Specify a set of entries that re-map imports to additional lookup locations. */
+ "primeng/*": ["./packages/primeng/src/*/public_api"],
+ },
+ "resolveJsonModule": true,
+ "allowSyntheticDefaultImports": true
+ },
+ /* Uncomment when you wanna use Karma
+ "files": [
+ "src/test.ts",
+ "src/polyfills.ts"
+ ],
+ */
+ "include": [
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ],
+ "exclude": ["node_modules", "**/node_modules/*"]
+ }
+