Преглед на файлове

unit tests for adsCandidatesPage and tableViewPage on fe

pull/109/head
Dzenis Hadzifejzovic преди 3 години
родител
ревизия
cd05fdaa1e

+ 77
- 88
package-lock.json Целия файл

"version": "8.19.0", "version": "8.19.0",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz",
"integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==", "integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==",
"dev": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.10.4", "@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5", "@babel/runtime": "^7.12.5",
"version": "7.14.0", "version": "7.14.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz",
"integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==",
"dev": true,
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.13.4" "regenerator-runtime": "^0.13.4"
} }
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"dependencies": { "dependencies": {
"color-convert": "^2.0.1" "color-convert": "^2.0.1"
}, },
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.1.tgz", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.1.tgz",
"integrity": "sha512-4cPQjOYM2mqq7mZG8CSxkUvL2Yv/x29VhGq5LKehTsxRnoVQps1YGt9NyjcNQsznEsD4rr8a6zGxqeNTqJWjpA==", "integrity": "sha512-4cPQjOYM2mqq7mZG8CSxkUvL2Yv/x29VhGq5LKehTsxRnoVQps1YGt9NyjcNQsznEsD4rr8a6zGxqeNTqJWjpA==",
"dev": true,
"dependencies": { "dependencies": {
"deep-equal": "^2.0.5" "deep-equal": "^2.0.5"
} }
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"dependencies": { "dependencies": {
"ansi-styles": "^4.1.0", "ansi-styles": "^4.1.0",
"supports-color": "^7.1.0" "supports-color": "^7.1.0"
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"dependencies": { "dependencies": {
"color-name": "~1.1.4" "color-name": "~1.1.4"
}, },
"node_modules/@testing-library/dom/node_modules/color-name": { "node_modules/@testing-library/dom/node_modules/color-name": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
}, },
"node_modules/@testing-library/dom/node_modules/deep-equal": { "node_modules/@testing-library/dom/node_modules/deep-equal": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
"integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
"dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.0", "call-bind": "^1.0.0",
"es-get-iterator": "^1.1.1", "es-get-iterator": "^1.1.1",
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
"node_modules/@testing-library/dom/node_modules/isarray": { "node_modules/@testing-library/dom/node_modules/isarray": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
"dev": true
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
}, },
"node_modules/@testing-library/dom/node_modules/pretty-format": { "node_modules/@testing-library/dom/node_modules/pretty-format": {
"version": "27.5.1", "version": "27.5.1",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
"integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
"dev": true,
"dependencies": { "dependencies": {
"ansi-regex": "^5.0.1", "ansi-regex": "^5.0.1",
"ansi-styles": "^5.0.0", "ansi-styles": "^5.0.0",
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
}, },
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"dependencies": { "dependencies": {
"has-flag": "^4.0.0" "has-flag": "^4.0.0"
}, },
"node_modules/@types/aria-query": { "node_modules/@types/aria-query": {
"version": "4.2.1", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz",
"integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==",
"dev": true
"integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg=="
}, },
"node_modules/@types/babel__core": { "node_modules/@types/babel__core": {
"version": "7.1.14", "version": "7.1.14",
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
"integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
"dev": true,
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
}, },
"node_modules/dom-accessibility-api": { "node_modules/dom-accessibility-api": {
"version": "0.5.14", "version": "0.5.14",
"resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz",
"integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==",
"dev": true
"integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg=="
}, },
"node_modules/dom-converter": { "node_modules/dom-converter": {
"version": "0.2.0", "version": "0.2.0",
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
"integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
"dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"get-intrinsic": "^1.1.0", "get-intrinsic": "^1.1.0",
"node_modules/es-get-iterator/node_modules/isarray": { "node_modules/es-get-iterator/node_modules/isarray": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
"dev": true
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
}, },
"node_modules/es-to-primitive": { "node_modules/es-to-primitive": {
"version": "1.2.1", "version": "1.2.1",
"version": "0.3.3", "version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"dev": true,
"dependencies": { "dependencies": {
"is-callable": "^1.1.3" "is-callable": "^1.1.3"
} }
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
"integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
"dev": true,
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
"integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
"dev": true,
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
"version": "1.1.9", "version": "1.1.9",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz",
"integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==",
"dev": true,
"dependencies": { "dependencies": {
"available-typed-arrays": "^1.0.5", "available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
"integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
"dev": true,
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
"integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
"dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1" "get-intrinsic": "^1.1.1"
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
"integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA=="
}, },
"node_modules/jquery": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.2.tgz",
"integrity": "sha512-/e7ulNIEEYk1Z/l4X0vpxGt+B/dNsV8ghOPAWZaJs8pkGvsSC0tm33aMGylXcj/U7y4IcvwtMXPMyBFZn/gK9A==",
"peer": true
},
"node_modules/js-tokens": { "node_modules/js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"version": "1.4.4", "version": "1.4.4",
"resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
"integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=",
"dev": true,
"bin": { "bin": {
"lz-string": "bin/bin.js" "lz-string": "bin/bin.js"
} }
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz",
"integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==",
"dev": true,
"bin": { "bin": {
"prettier": "bin-prettier.js" "prettier": "bin-prettier.js"
}, },
"is-typedarray": "^1.0.0" "is-typedarray": "^1.0.0"
} }
}, },
"node_modules/typescript": {
"version": "4.9.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
"integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/typescript-compare": { "node_modules/typescript-compare": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz",
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
"integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
"dev": true,
"dependencies": { "dependencies": {
"is-map": "^2.0.1", "is-map": "^2.0.1",
"is-set": "^2.0.1", "is-set": "^2.0.1",
"version": "1.1.8", "version": "1.1.8",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
"integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==",
"dev": true,
"dependencies": { "dependencies": {
"available-typed-arrays": "^1.0.5", "available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"@emotion/use-insertion-effect-with-fallbacks": { "@emotion/use-insertion-effect-with-fallbacks": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz",
"integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A=="
"integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==",
"requires": {}
}, },
"@emotion/utils": { "@emotion/utils": {
"version": "1.2.0", "version": "1.2.0",
"@mui/types": { "@mui/types": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.0.tgz", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.0.tgz",
"integrity": "sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA=="
"integrity": "sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA==",
"requires": {}
}, },
"@mui/utils": { "@mui/utils": {
"version": "5.10.9", "version": "5.10.9",
"version": "8.19.0", "version": "8.19.0",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz",
"integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==", "integrity": "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==",
"dev": true,
"requires": { "requires": {
"@babel/code-frame": "^7.10.4", "@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5", "@babel/runtime": "^7.12.5",
"version": "7.14.0", "version": "7.14.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz",
"integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==",
"dev": true,
"requires": { "requires": {
"regenerator-runtime": "^0.13.4" "regenerator-runtime": "^0.13.4"
} }
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": { "requires": {
"color-convert": "^2.0.1" "color-convert": "^2.0.1"
} }
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.1.tgz", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.1.tgz",
"integrity": "sha512-4cPQjOYM2mqq7mZG8CSxkUvL2Yv/x29VhGq5LKehTsxRnoVQps1YGt9NyjcNQsznEsD4rr8a6zGxqeNTqJWjpA==", "integrity": "sha512-4cPQjOYM2mqq7mZG8CSxkUvL2Yv/x29VhGq5LKehTsxRnoVQps1YGt9NyjcNQsznEsD4rr8a6zGxqeNTqJWjpA==",
"dev": true,
"requires": { "requires": {
"deep-equal": "^2.0.5" "deep-equal": "^2.0.5"
} }
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": { "requires": {
"ansi-styles": "^4.1.0", "ansi-styles": "^4.1.0",
"supports-color": "^7.1.0" "supports-color": "^7.1.0"
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": { "requires": {
"color-name": "~1.1.4" "color-name": "~1.1.4"
} }
"color-name": { "color-name": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
}, },
"deep-equal": { "deep-equal": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
"integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
"dev": true,
"requires": { "requires": {
"call-bind": "^1.0.0", "call-bind": "^1.0.0",
"es-get-iterator": "^1.1.1", "es-get-iterator": "^1.1.1",
"has-flag": { "has-flag": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
}, },
"isarray": { "isarray": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
"dev": true
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
}, },
"pretty-format": { "pretty-format": {
"version": "27.5.1", "version": "27.5.1",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
"integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
"dev": true,
"requires": { "requires": {
"ansi-regex": "^5.0.1", "ansi-regex": "^5.0.1",
"ansi-styles": "^5.0.0", "ansi-styles": "^5.0.0",
"ansi-styles": { "ansi-styles": {
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="
} }
} }
}, },
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": { "requires": {
"has-flag": "^4.0.0" "has-flag": "^4.0.0"
} }
"@types/aria-query": { "@types/aria-query": {
"version": "4.2.1", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz",
"integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==",
"dev": true
"integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg=="
}, },
"@types/babel__core": { "@types/babel__core": {
"version": "7.1.14", "version": "7.1.14",
"acorn-jsx": { "acorn-jsx": {
"version": "5.3.2", "version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"requires": {}
}, },
"acorn-walk": { "acorn-walk": {
"version": "7.2.0", "version": "7.2.0",
"ajv-errors": { "ajv-errors": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
"integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="
"integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
"requires": {}
}, },
"ajv-keywords": { "ajv-keywords": {
"version": "3.5.2", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"requires": {}
}, },
"alphanum-sort": { "alphanum-sort": {
"version": "1.0.2", "version": "1.0.2",
"available-typed-arrays": { "available-typed-arrays": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
"integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
"dev": true
"integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
}, },
"axe-core": { "axe-core": {
"version": "4.2.2", "version": "4.2.2",
"babel-plugin-named-asset-import": { "babel-plugin-named-asset-import": {
"version": "0.3.7", "version": "0.3.7",
"resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz",
"integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw=="
"integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==",
"requires": {}
}, },
"babel-plugin-polyfill-corejs2": { "babel-plugin-polyfill-corejs2": {
"version": "0.2.2", "version": "0.2.2",
"dom-accessibility-api": { "dom-accessibility-api": {
"version": "0.5.14", "version": "0.5.14",
"resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz",
"integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==",
"dev": true
"integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg=="
}, },
"dom-converter": { "dom-converter": {
"version": "0.2.0", "version": "0.2.0",
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
"integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
"dev": true,
"requires": { "requires": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"get-intrinsic": "^1.1.0", "get-intrinsic": "^1.1.0",
"isarray": { "isarray": {
"version": "2.0.5", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
"dev": true
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
} }
} }
}, },
"version": "8.3.0", "version": "8.3.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
"integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
"dev": true
"dev": true,
"requires": {}
}, },
"eslint-config-react-app": { "eslint-config-react-app": {
"version": "6.0.0", "version": "6.0.0",
"eslint-plugin-react-hooks": { "eslint-plugin-react-hooks": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz",
"integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ=="
"integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==",
"requires": {}
}, },
"eslint-plugin-security": { "eslint-plugin-security": {
"version": "1.4.0", "version": "1.4.0",
"version": "0.3.3", "version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"dev": true,
"requires": { "requires": {
"is-callable": "^1.1.3" "is-callable": "^1.1.3"
} }
"is-map": { "is-map": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
"integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
"dev": true
"integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg=="
}, },
"is-module": { "is-module": {
"version": "1.0.0", "version": "1.0.0",
"is-set": { "is-set": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
"integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
"dev": true
"integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g=="
}, },
"is-shared-array-buffer": { "is-shared-array-buffer": {
"version": "1.0.2", "version": "1.0.2",
"version": "1.1.9", "version": "1.1.9",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz",
"integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==",
"dev": true,
"requires": { "requires": {
"available-typed-arrays": "^1.0.5", "available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"is-weakmap": { "is-weakmap": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
"integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
"dev": true
"integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA=="
}, },
"is-weakref": { "is-weakref": {
"version": "1.0.2", "version": "1.0.2",
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
"integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
"dev": true,
"requires": { "requires": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1" "get-intrinsic": "^1.1.1"
"jest-pnp-resolver": { "jest-pnp-resolver": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
"integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w=="
"integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
"requires": {}
}, },
"jest-regex-util": { "jest-regex-util": {
"version": "26.0.0", "version": "26.0.0",
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
"integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA=="
}, },
"jquery": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.2.tgz",
"integrity": "sha512-/e7ulNIEEYk1Z/l4X0vpxGt+B/dNsV8ghOPAWZaJs8pkGvsSC0tm33aMGylXcj/U7y4IcvwtMXPMyBFZn/gK9A==",
"peer": true
},
"js-tokens": { "js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"lz-string": { "lz-string": {
"version": "1.4.4", "version": "1.4.4",
"resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
"integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=",
"dev": true
"integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY="
}, },
"magic-string": { "magic-string": {
"version": "0.25.7", "version": "0.25.7",
"prettier": { "prettier": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz",
"integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==",
"dev": true
"integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA=="
}, },
"prettier-linter-helpers": { "prettier-linter-helpers": {
"version": "1.0.0", "version": "1.0.0",
"redux-thunk": { "redux-thunk": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz",
"integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q=="
"integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==",
"requires": {}
}, },
"regenerate": { "regenerate": {
"version": "1.4.2", "version": "1.4.2",
"rifm": { "rifm": {
"version": "0.12.1", "version": "0.12.1",
"resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz", "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz",
"integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg=="
"integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==",
"requires": {}
}, },
"rimraf": { "rimraf": {
"version": "3.0.2", "version": "3.0.2",
"slick-carousel": { "slick-carousel": {
"version": "1.8.1", "version": "1.8.1",
"resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
"integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA=="
"integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
"requires": {}
}, },
"snapdragon": { "snapdragon": {
"version": "0.8.2", "version": "0.8.2",
"is-typedarray": "^1.0.0" "is-typedarray": "^1.0.0"
} }
}, },
"typescript": {
"version": "4.9.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
"integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
"peer": true
},
"typescript-compare": { "typescript-compare": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz",
"use-dynamic-refs": { "use-dynamic-refs": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/use-dynamic-refs/-/use-dynamic-refs-1.0.0.tgz", "resolved": "https://registry.npmjs.org/use-dynamic-refs/-/use-dynamic-refs-1.0.0.tgz",
"integrity": "sha512-1Ky+Jaj6MIpTRz6NTaCLVm/iDXfRNwUMH9X7BkLtgSL2RCXHQhK2p9SVhut8jZPDfxLDtOIYNM3txsiLXd4yVQ=="
"integrity": "sha512-1Ky+Jaj6MIpTRz6NTaCLVm/iDXfRNwUMH9X7BkLtgSL2RCXHQhK2p9SVhut8jZPDfxLDtOIYNM3txsiLXd4yVQ==",
"requires": {}
}, },
"util": { "util": {
"version": "0.11.1", "version": "0.11.1",
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
"integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
"dev": true,
"requires": { "requires": {
"is-map": "^2.0.1", "is-map": "^2.0.1",
"is-set": "^2.0.1", "is-set": "^2.0.1",
"version": "1.1.8", "version": "1.1.8",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
"integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==",
"dev": true,
"requires": { "requires": {
"available-typed-arrays": "^1.0.5", "available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"ws": { "ws": {
"version": "7.4.6", "version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
"requires": {}
}, },
"xdg-basedir": { "xdg-basedir": {
"version": "4.0.0", "version": "4.0.0",

+ 105
- 0
src/__tests__/ReduxTests/adsCandidatesPageReducer.test.js Целия файл

import * as redux from "react-redux";
import store from "../../store";
import { Router } from "react-router-dom";
import history from "../../store/utils/history";
import { mockState } from "../../mockState";
import { render } from "@testing-library/react";
import * as api from "../../request/candidatesRequest";
import { runSaga } from "redux-saga";
import { ADS_CANDIDATES_FETCH } from "../../store/actions/candidates/candidatesActionConstants";
import { getAdsCandidates } from "../../store/saga/candidatesSaga";
import {
fetchAdsCandidates,
fetchAdsCandidatesError,
} from "../../store/actions/candidates/candidatesActions";
import AdsCandidatesPage from "../../pages/CandidatesPage/AdsCandidatesPage";

describe("AdsCandidatesPage render tests", () => {
const cont = (
<redux.Provider store={store}>
<Router history={history}>
<AdsCandidatesPage search="" />
</Router>
</redux.Provider>
);

let spyOnUseSelector;
let spyOnUseDispatch;
let mockDispatch;

beforeEach(() => {
// Mock useSelector hook
spyOnUseSelector = jest.spyOn(redux, "useSelector");
spyOnUseSelector
.mockReturnValueOnce(mockState.candidates.adsCandidates)
.mockReturnValueOnce(mockState.candidates.adsCandidates);
// Mock useDispatch hook
spyOnUseDispatch = jest.spyOn(redux, "useDispatch");

// Mock dispatch function returned from useDispatch
mockDispatch = jest.fn();
spyOnUseDispatch.mockReturnValue(mockDispatch);
});

afterEach(() => {
jest.restoreAllMocks();
});

it("Should dispatch get adsCandidates request when rendered", () => {
render(cont);
expect(mockDispatch).toHaveBeenCalledWith({
type: ADS_CANDIDATES_FETCH,
payload: {
currentPage: 0,
employmentType: "",
maxDateOfApplication: "",
maxExperience: 0,
minDateOfApplication: "",
minExperience: 0,
pageSize: 0,
technologies: [],
},
});
});

it("should load and handle adsCandidates in case of success", async () => {
const dispatchedActions = [];

const mockedCall = { data: mockState.technologies.technologies };
api.getFilteredAdsCandidates = jest.fn(() => Promise.resolve(mockedCall));

const fakeStore = {
getState: () => mockState.candidates.adsCandidates,
dispatch: (action) => dispatchedActions.push(action),
};

await runSaga(fakeStore, getAdsCandidates, {}).done;
expect(api.getFilteredAdsCandidates.mock.calls.length).toBe(1);
expect(dispatchedActions[0].payload).toBe(
fetchAdsCandidates(mockedCall.data).payload
);
});

// it("should handle adsCandidates load errors in case of failure", async () => {
// const dispatchedActions = [];

// const error = {
// response: {
// data: { message: mockState.candidates.fetchCandidatesErrorMessage },
// },
// };
// api.getFilteredAdsCandidates = jest.fn(() => Promise.reject(error));

// const fakeStore = {
// getState: () => mockState.candidates.adsCandidates,
// dispatch: (action) => dispatchedActions.push(action),
// };

// await runSaga(fakeStore, getAdsCandidates,{}).done;

// expect(api.getFilteredAdsCandidates.mock.calls.length).toBe(1);
// expect(dispatchedActions).toContainEqual(
// fetchAdsCandidates(error.response.data.message)
// );
// });
});

+ 18
- 18
src/__tests__/ReduxTests/candidatesPageReducer.test.js Целия файл

expect(dispatchedActions).toContainEqual(setTechnologies(mockedCall.data)); expect(dispatchedActions).toContainEqual(setTechnologies(mockedCall.data));
}); });


// it("should handle technologies load errors in case of failure", async () => {
// const dispatchedActions = [];
// it("should handle technologies load errors in case of failure", async () => {
// const dispatchedActions = [];


// const error = {
// response: {
// data: { message: mockState.technologies.fetchTecnologiesErrorMessage },
// },
// };
// api.getAllTechnologies = jest.fn(() => Promise.reject(error));
// const error = {
// response: {
// data: { message: mockState.technologies.fetchTecnologiesErrorMessage },
// },
// };
// api.getAllTechnologies = jest.fn(() => Promise.reject(error));


// const fakeStore = {
// getState: () => mockState.technologies.technologies,
// dispatch: (action) => dispatchedActions.push(action),
// };
// const fakeStore = {
// getState: () => mockState.technologies.technologies,
// dispatch: (action) => dispatchedActions.push(action),
// };


// await runSaga(fakeStore, getTechnologies).done;
// await runSaga(fakeStore, getTechnologies).done;


// expect(api.getAllTechnologies.mock.calls.length).toBe(1);
// expect(dispatchedActions).toContainEqual(
// setTechnologiesError(error.response.data.message)
// );
// });
// expect(api.getAllTechnologies.mock.calls.length).toBe(1);
// expect(dispatchedActions).toContainEqual(
// setTechnologiesError(error.response.data.message)
// );
// });
}); });

+ 61
- 45
src/__tests__/ReduxTests/processesReducer.test.js Целия файл

import { runSaga } from 'redux-saga';
import * as api from '../../request/processesReguest';
import { runSaga } from "redux-saga";
import * as api from "../../request/processesReguest";
import { render } from "@testing-library/react"; import { render } from "@testing-library/react";
import * as redux from "react-redux"; import * as redux from "react-redux";
import SelectionProcessPage from '../../pages/selectionProcessPage/selectionProcessPage'; "../../pages/SelectionProcessPage/SelectionProcessPage";
import SelectionProcessPage from "../../pages/selectionProcessPage/selectionProcessPage";
("../../pages/SelectionProcessPage/SelectionProcessPage");
import store from "../../store"; import store from "../../store";
import "../../i18n"; import "../../i18n";
import { mockState } from "../../mockState"; import { mockState } from "../../mockState";
import {
FETCH_PROCESSES_REQ
} from "../../store/actions/processes/processesActionConstants";
import { FETCH_PROCESSES_REQ } from "../../store/actions/processes/processesActionConstants";
import { Router } from "react-router-dom"; import { Router } from "react-router-dom";
import history from "../../store/utils/history"; import history from "../../store/utils/history";
import { getProcesses, getFilteredProcesses } from '../../store/saga/processSaga';
import { setProcesses, setProcessesError } from '../../store/actions/processes/processesAction';
import {
getProcesses,
getFilteredProcesses,
} from "../../store/saga/processSaga";
import {
setProcesses,
setProcessesError,
} from "../../store/actions/processes/processesAction";


describe("SelectionProcessPage render tests", () => { describe("SelectionProcessPage render tests", () => {
const cont = ( const cont = (
beforeEach(() => { beforeEach(() => {
// Mock useSelector hook // Mock useSelector hook
spyOnUseSelector = jest.spyOn(redux, "useSelector"); spyOnUseSelector = jest.spyOn(redux, "useSelector");
spyOnUseSelector.mockReturnValueOnce(mockState.selections).mockReturnValueOnce(mockState.selections.processes).mockReturnValueOnce(mockState.selections.statuses);
spyOnUseSelector
.mockReturnValueOnce(mockState.selections)
.mockReturnValueOnce(mockState.selections.processes)
.mockReturnValueOnce(mockState.selections.statuses);
// Mock useDispatch hook // Mock useDispatch hook
spyOnUseDispatch = jest.spyOn(redux, "useDispatch"); spyOnUseDispatch = jest.spyOn(redux, "useDispatch");


}); });
}); });


it('should load and handle levels with processes in case of success', async () => {
it("should load and handle levels with processes in case of success", async () => {
// we push all dispatched actions to make assertions easier // we push all dispatched actions to make assertions easier
// and our tests less brittle // and our tests less brittle
const dispatchedActions = []; const dispatchedActions = [];
api.getAllLevels = jest.fn(() => Promise.resolve(mockedCall)); api.getAllLevels = jest.fn(() => Promise.resolve(mockedCall));


const fakeStore = { const fakeStore = {
getState: () => (mockState.selections.processes),
dispatch: action => dispatchedActions.push(action),
getState: () => mockState.selections.processes,
dispatch: (action) => dispatchedActions.push(action),
}; };


// wait for saga to complete // wait for saga to complete
expect(dispatchedActions).toContainEqual(setProcesses(mockedCall.data)); expect(dispatchedActions).toContainEqual(setProcesses(mockedCall.data));
}); });



it('should handle processes load errors in case of failure', async () => {
it("should handle processes load errors in case of failure", async () => {
const dispatchedActions = []; const dispatchedActions = [];


// we simulate an error by rejecting the promise // we simulate an error by rejecting the promise
// then we assert if our saga dispatched the action(s) correctly // then we assert if our saga dispatched the action(s) correctly
const error = { response: { data: { message: mockState.selections.fetchSelectionsErrorMessage } } };
const error = {
response: {
data: { message: mockState.selections.fetchSelectionsErrorMessage },
},
};
api.getAllLevels = jest.fn(() => Promise.reject(error)); api.getAllLevels = jest.fn(() => Promise.reject(error));


const fakeStore = { const fakeStore = {
getState: () => (mockState.users.users),
dispatch: action => dispatchedActions.push(action),
getState: () => mockState.users.users,
dispatch: (action) => dispatchedActions.push(action),
}; };


await runSaga(fakeStore, getProcesses).done; await runSaga(fakeStore, getProcesses).done;


expect(api.getAllLevels.mock.calls.length).toBe(1); expect(api.getAllLevels.mock.calls.length).toBe(1);
expect(dispatchedActions).toContainEqual(setProcessesError(error.response.data.message));
expect(dispatchedActions).toContainEqual(
setProcessesError(error.response.data.message)
);
}); });
it('should load and handle levels with filtered processes in case of success', async () => {
it("should load and handle levels with filtered processes in case of success", async () => {
// we push all dispatched actions to make assertions easier // we push all dispatched actions to make assertions easier
// and our tests less brittle // and our tests less brittle
const dispatchedActions = []; const dispatchedActions = [];
const filter = { const filter = {
statuses: ["Zakazan","Odrađen"],
dateStart: new Date(2023,0,5),
dateEnd: new Date(2024,1,1)
statuses: ["Zakazan", "Odrađen"],
dateStart: new Date(2023, 0, 5),
dateEnd: new Date(2024, 1, 1),
}; };
const filteredData = []; const filteredData = [];
mockState.selections.processes.forEach(level => {
mockState.selections.processes.forEach((level) => {
const filteredLevel = level; const filteredLevel = level;
filteredLevel.selectionProcesses = level.selectionProcesses.filter(v => v.date >= filter.dateStart && v.date <= filter.dateEnd && filter.statuses.includes(v.status));
filteredLevel.selectionProcesses = level.selectionProcesses.filter(
(v) =>
v.date >= filter.dateStart &&
v.date <= filter.dateEnd &&
filter.statuses.includes(v.status)
);
filteredData.push(filteredLevel); filteredData.push(filteredLevel);
}); });
// we don't want to perform an actual api call in our tests // we don't want to perform an actual api call in our tests
api.getAllFilteredProcessesReq = jest.fn(() => Promise.resolve(mockedCall)); api.getAllFilteredProcessesReq = jest.fn(() => Promise.resolve(mockedCall));


const fakeStore = { const fakeStore = {
getState: () => (mockState.selections.processes),
dispatch: action => dispatchedActions.push(action),
getState: () => mockState.selections.processes,
dispatch: (action) => dispatchedActions.push(action),
}; };


// wait for saga to complete // wait for saga to complete
await runSaga(fakeStore, getFilteredProcesses,filter).done;
await runSaga(fakeStore, getFilteredProcesses, filter).done;
expect(api.getAllFilteredProcessesReq.mock.calls.length).toBe(1); expect(api.getAllFilteredProcessesReq.mock.calls.length).toBe(1);
expect(dispatchedActions).toContainEqual(setProcesses(filteredData)); expect(dispatchedActions).toContainEqual(setProcesses(filteredData));
}); });
it('should handle process to set it done in case of success', async () => {
it("should handle process to set it done in case of success", async () => {
// we push all dispatched actions to make assertions easier // we push all dispatched actions to make assertions easier
// and our tests less brittle // and our tests less brittle
const dispatchedActions = []; const dispatchedActions = [];
const filter = { const filter = {
statuses: ["Zakazan","Odrađen"],
dateStart: new Date(2023,0,5),
dateEnd: new Date(2024,1,1)
statuses: ["Zakazan", "Odrađen"],
dateStart: new Date(2023, 0, 5),
dateEnd: new Date(2024, 1, 1),
}; };
const filteredData = []; const filteredData = [];
mockState.selections.processes.forEach(level => {
mockState.selections.processes.forEach((level) => {
const filteredLevel = level; const filteredLevel = level;
filteredLevel.selectionProcesses = level.selectionProcesses.filter(v => v.date >= filter.dateStart && v.date <= filter.dateEnd && filter.statuses.includes(v.status));
filteredLevel.selectionProcesses = level.selectionProcesses.filter(
(v) =>
v.date >= filter.dateStart &&
v.date <= filter.dateEnd &&
filter.statuses.includes(v.status)
);
filteredData.push(filteredLevel); filteredData.push(filteredLevel);
}); });
// we don't want to perform an actual api call in our tests // we don't want to perform an actual api call in our tests
api.getAllFilteredProcessesReq = jest.fn(() => Promise.resolve(mockedCall)); api.getAllFilteredProcessesReq = jest.fn(() => Promise.resolve(mockedCall));


const fakeStore = { const fakeStore = {
getState: () => (mockState.selections.processes),
dispatch: action => dispatchedActions.push(action),
getState: () => mockState.selections.processes,
dispatch: (action) => dispatchedActions.push(action),
}; };


// wait for saga to complete // wait for saga to complete
await runSaga(fakeStore, getFilteredProcesses,filter).done;
await runSaga(fakeStore, getFilteredProcesses, filter).done;
expect(api.getAllFilteredProcessesReq.mock.calls.length).toBe(1); expect(api.getAllFilteredProcessesReq.mock.calls.length).toBe(1);
expect(dispatchedActions).toContainEqual(setProcesses(filteredData)); expect(dispatchedActions).toContainEqual(setProcesses(filteredData));
}); });
}); });








+ 105
- 0
src/__tests__/ReduxTests/tableViewPageReducer.test.js Целия файл

import * as redux from "react-redux";
import store from "../../store";
import { Router } from "react-router-dom";
import history from "../../store/utils/history";
import { mockState } from "../../mockState";
import { render } from "@testing-library/react";
import { FILTER_CANDIDATES } from "../../store/actions/candidates/candidatesActionConstants";
import TableViewPage from "../../pages/CandidatesPage/TableViewPage";
import * as api from "../../request/candidatesRequest";
import { runSaga } from "redux-saga";

import * as fc from "../../store/saga/candidatesSaga";
import {
filterCandidates,
filterCandidatesError,
} from "../../store/actions/candidates/candidatesActions";
import { PAGE_SIZE_CANDIDATES } from "../../constants/keyCodeConstants";

describe("TableViewPage render tests", () => {
const cont = (
<redux.Provider store={store}>
<Router history={history}>
<TableViewPage page={1} search="" />
</Router>
</redux.Provider>
);

let spyOnUseSelector;
let spyOnUseDispatch;
let mockDispatch;

beforeEach(() => {
// Mock useSelector hook
spyOnUseSelector = jest.spyOn(redux, "useSelector");
spyOnUseSelector
.mockReturnValueOnce(mockState.candidates.candidates)
.mockReturnValueOnce(mockState.candidates.pagination);
spyOnUseDispatch = jest.spyOn(redux, "useDispatch");

mockDispatch = jest.fn();
spyOnUseDispatch.mockReturnValue(mockDispatch);
});

afterEach(() => {
jest.restoreAllMocks();
});

it("Should dispatch filter candidates request when rendered", () => {
render(cont);
expect(mockDispatch).toHaveBeenCalledWith({
type: FILTER_CANDIDATES,
payload: {
currentPage: 1,
employmentType: "",
maxDateOfApplication: "",
maxExperience: 0,
minDateOfApplication: "",
minExperience: 0,
pageSize: PAGE_SIZE_CANDIDATES,
technologies: [],
},
});
});

it("should load and handle candidates in case of success", async () => {
const dispatchedActions = [];

const mockedCall = { data: mockState.candidates.items };
api.getFilteredCandidates = jest.fn(() => Promise.resolve(mockedCall));

const fakeStore = {
getState: () => mockState.candidates.items,
dispatch: (action) => dispatchedActions.push(action),
};

await runSaga(fakeStore, fc.filterCandidates, {}).done;
expect(api.getFilteredCandidates.mock.calls.length).toBe(1);
expect(dispatchedActions[0].payload).toEqual(
filterCandidates(mockedCall.data).payload
);
});

// it("should handle candidates load errors in case of failure", async () => {
// const dispatchedActions = [];

// const error = {
// response: {
// data: { message: mockState.candidates.fetchCandidatesErrorMessage },
// },
// };
// api.getFilteredCandidates = jest.fn(() => Promise.reject(error));

// const fakeStore = {
// getState: () => mockState.candidates.items,
// dispatch: (action) => dispatchedActions.push(action),
// };

// await runSaga(fakeStore, fc.filterCandidates, {}).done;

// expect(api.getFilteredCandidates.mock.calls.length).toBe(1);
// expect(dispatchedActions).toContainEqual(
// filterCandidatesError(error.response.data.message)
// );
// });
});

+ 49
- 0
src/__tests__/UITests/adsCandidatesPageUI.test.js Целия файл

import { render } from "@testing-library/react";
import * as redux from "react-redux";
import store from "../../store";
import { mockState } from "../../mockState";
import { Router } from "react-router-dom";
import history from "../../store/utils/history";
import AdsCandidatesPage from "../../pages/CandidatesPage/AdsCandidatesPage";

describe("TableViewPage render tests", () => {
const cont = (
<redux.Provider store={store}>
<Router history={history}>
<AdsCandidatesPage search="" />
</Router>
</redux.Provider>
);

let spyOnUseSelector;

beforeEach(() => {
spyOnUseSelector = jest.spyOn(redux, "useSelector");
spyOnUseSelector.mockReturnValueOnce(mockState.candidates.adsCandidates);
});

afterEach(() => {
jest.restoreAllMocks();
});

it("Should render", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("ads-candidates-container")[0]
).toBeDefined();
});

it("Number of sliders should be equal to length of our array adsCandidates", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("ads-candidates").length).toBe(
mockState.candidates.adsCandidates.length
);
});

it("Number of arrows (left and right) should be 0 because there is no more than 4 candidates in any of ads", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("active-ads-ads-arrows").length
).toBe(0);
});
});

+ 14
- 9
src/__tests__/UITests/candidatesPageUI.test.js Целия файл



it("should be rendered button which is used for showing input responsible for searching by name", () => { it("should be rendered button which is used for showing input responsible for searching by name", () => {
const { container } = render(cont); const { container } = render(cont);
expect(
container.getElementsByClassName("candidate-btn")[1]
).toBeDefined();
expect(container.getElementsByClassName("candidate-btn")[1]).toBeDefined();
}); });


it("Should render filter button", () => { it("Should render filter button", () => {
); );
}); });


// it("input for searching by name should be shown after clicking button for first time",() => {
// const { container } = render(cont);
// fireEvent.click(container.getElementsByClassName("candidate-btn")[1])
// expect(container.getElementsByClassName("proba")[0].style.visibility).toBe('vissible');
// })
// it("input for searching by name should be shown after clicking button for first time",() => {
// const { container } = render(cont);
// fireEvent.click(container.getElementsByClassName("candidate-btn")[1])
// expect(container.getElementsByClassName("proba")[0].style.visibility).toBe('vissible');
// })

it("Should render TableViewPage component when page is initialy rendered", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("candidates-table")[0]
).toBeDefined();
});


// it("should be rendered AdsCandidatesPage component when button for switching to another view is clicked for the first time",() => {
// it("should render AdsCandidatesPage component when button for switching to another view is clicked for the first time",() => {
// const { container } = render(cont); // const { container } = render(cont);
// fireEvent.click(container.getElementsByClassName("candidate-btn")[0]) // fireEvent.click(container.getElementsByClassName("candidate-btn")[0])
// expect(container.getElementsByClassName("ads-candidates-container")[0]).toBeDefined(); // expect(container.getElementsByClassName("ads-candidates-container")[0]).toBeDefined();

+ 68
- 0
src/__tests__/UITests/tableViewPageUI.test.js Целия файл

import { render, screen, fireEvent } from "@testing-library/react";
import * as redux from "react-redux";
import store from "../../store";
import { mockState } from "../../mockState";
import { Router } from "react-router-dom";
import history from "../../store/utils/history";
import TableViewPage from "../../pages/CandidatesPage/TableViewPage";
import { PAGE_SIZE_CANDIDATES } from "../../constants/keyCodeConstants";

describe("TableViewPage render tests", () => {
const cont = (
<redux.Provider store={store}>
<Router history={history}>
<TableViewPage search="" />
</Router>
</redux.Provider>
);

let spyOnUseSelector;

beforeEach(() => {
spyOnUseSelector = jest.spyOn(redux, "useSelector");
spyOnUseSelector
.mockReturnValueOnce(mockState.candidates.candidates)
.mockReturnValueOnce(mockState.candidates.pagination);
});

afterEach(() => {
jest.restoreAllMocks();
});

it("Should render", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("candidates-table")[0]
).toBeDefined();
});

it("Should render pagination component", () => {
const { container } = render(cont);
expect(
container.getElementsByClassName("candidates-pagination")[0]
).toBeDefined();
});

it("Pagination component should show 1 page because number of elements of our candidates arrat is 2 and the size of page is 2)", () => {
const { container } = render(cont);
expect(
container
.getElementsByClassName("css-wjh20t-MuiPagination-ul")[0]
.getElementsByTagName("li").length - 2 // we substract because list will contain left and right arrow
).toBe(
parseInt(mockState.candidates.candidates.length) <= PAGE_SIZE_CANDIDATES
? 1
: Math.ceil(
parseInt(mockState.candidates.candidates.length) /
PAGE_SIZE_CANDIDATES
)
);
});

it("Table should initialy contain 2 rows", () => {
const { container } = render(cont);
expect(container.getElementsByClassName("cadidate-row").length).toBe(
mockState.candidates.candidates.length
);
});
});

+ 5
- 0
src/assets/styles/components/_candidatesPage.scss Целия файл

margin-left: 45px !important; margin-left: 45px !important;
} }


.candidates-pagination{
align-self: center;
margin-top: 20px;
}

@media only screen and (max-width: 600px) { @media only screen and (max-width: 600px) {
.ads-candidates-title { .ads-candidates-title {
font-size: 18px; font-size: 18px;

+ 295
- 2
src/mockState.js Целия файл

export const mockState = { export const mockState = {
candidate: {
candidate: {
applicantId: 1,
firstName: "Dzenis",
lastName: "Hadzifejzovic",
position: ".NET Developer",
dateOfApplication: "2022-02-11T00:00:00",
cv: "link",
email: "dzenis@gmail.com",
phoneNumber: "774567",
linkedlnLink: "link1",
githubLink: "link2",
bitBucketLink: null,
experience: 1,
applicationChannel: null,
typeOfEmployment: "Posao",
technologyApplicants: [
{
technology: {
technologyId: 1,
technologyType: "Backend",
name: ".NET",
},
},
{
technology: {
technologyId: 3,
technologyType: "Frontend",
name: "HTML/CSS",
},
},
],
comments: [
{
content: "[Safet Purkovic]proba",
dateOfSending: "2022-01-01T11:43:21.6545266",
user: {
id: 17,
firstName: "Dzenis",
lastName: "Hadzifejzovic",
email: "dzenis.hadzifejzovic@dilig.net",
isEnabled: true,
},
},
{
content: "[Ermin Bronja]",
dateOfSending: "2022-12-05T12:49:14.9767749",
user: {
id: 17,
firstName: "Dzenis",
lastName: "Hadzifejzovic",
email: "dzenis.hadzifejzovic@dilig.net",
isEnabled: true,
},
},
{
content: "[Safet Purkovic]dsadad [Ermin Bronja]",
dateOfSending: "2022-12-06T15:49:36.0651505",
user: {
id: 17,
firstName: "Dzenis",
lastName: "Hadzifejzovic",
email: "dzenis.hadzifejzovic@dilig.net",
isEnabled: true,
},
},
],
ads: [
{
id: 10,
title: ".NET Intern",
minimumExperience: 2,
createdAt: "2022-11-14T08:23:00.772",
expiredAt: "2024-12-06T09:53:42.439572",
keyResponsibilities: "KR|KR|KR|KR",
requirements: "RQ|RQ|RQ|RQ",
offer: "OF|OF|OF|OF",
technologies: [
{
technologyId: 1,
technologyType: "Backend",
name: ".NET",
},
{
technologyId: 2,
technologyType: "Other",
name: "Git",
},
],
workHour: "FullTime",
employmentType: "Intership",
},
{
id: 12,
title: ".NET Developer",
minimumExperience: 4,
createdAt: "2021-11-12T00:00:00",
expiredAt: "2022-12-08T12:08:51.1360986",
keyResponsibilities: "FS|SD|SD",
requirements: "RE|RQ|RS",
offer: "F|S|D",
technologies: [
{
technologyId: 3,
technologyType: "Frontend",
name: "HTML/CSS",
},
],
workHour: "FullTime",
employmentType: "Intership",
},
],
selectionProcesses: [],
},
users: [
{
id: 1,
firstName: "First",
lastName: "User",
email: "first@gmail.com",
isEnabled: false,
},
{
id: 2,
firstName: "Second",
lastName: "User",
email: "second@gmail.com",
isEnabled: true,
},
{
id: 3,
firstName: "Third",
lastName: "User",
email: "third@gmail.com",
isEnabled: false,
},
],
user: {
id: 2,
firstName: "Second",
lastName: "User",
email: "second@gmail.com",
isEnabled: true,
},
fetchCandidateErrorMessage: "Server error",
},
users: { users: {
users: [ users: [
{ {
technologyType: "Backend", technologyType: "Backend",
name: ".NET", name: ".NET",
isChecked: false, isChecked: false,
isChecked: false,
}, },
{ {
technologyId: 2, technologyId: 2,
technologyType: "Other", technologyType: "Other",
name: "Git", name: "Git",
isChecked: false, isChecked: false,
isChecked: false,
}, },
{ {
technologyId: 3, technologyId: 3,
technologyType: "Frontend", technologyType: "Frontend",
name: "HTML/CSS", name: "HTML/CSS",
isChecked: false, isChecked: false,
isChecked: false,
}, },
], ],
fetchTecnologiesErrorMessage: "Server error", fetchTecnologiesErrorMessage: "Server error",
}, },
candidates: { candidates: {
total: 2,
items: [
pagination: 2,
candidates: [
{ {
applicantId: 1, applicantId: 1,
firstName: "Dzenis", firstName: "Dzenis",
selectionProcesses: [], selectionProcesses: [],
}, },
], ],
fetchCandidatesErrorMessage: "Server error",
adsCandidates: [
{
id: 1,
title: ".NET Intern",
applicants: [
{
applicantId: 1,
firstName: "Dzenis",
lastName: "Hadzifejzovic",
dateOfApplication: "2022-02-11T00:00:00",
cv: "link",
experience: 1,
technologyApplicants: [
{
technology: {
technologyId: 1,
technologyType: "Backend",
name: ".NET",
},
},
],
},
{
applicantId: 24,
firstName: "Proba",
lastName: "Proba",
dateOfApplication: "2022-02-11T00:00:00",
cv: "link",
experience: 2,
technologyApplicants: [
{
technology: {
technologyId: 2,
technologyType: "Other",
name: "Git",
},
},
],
},
{
applicantId: 29,
firstName: "Ermin",
lastName: "Bronja",
dateOfApplication: "2022-12-14T09:03:29.5150747",
cv: "PDF",
experience: 1,
technologyApplicants: [
{
technology: {
technologyId: 3,
technologyType: "Frontend",
name: "HTML/CSS",
},
},
],
},
{
applicantId: 32,
firstName: "AHS",
lastName: "Jasj",
dateOfApplication: "2022-12-14T11:30:36.3658961",
cv: "PDF",
experience: 1,
technologyApplicants: [
{
technology: {
technologyId: 1,
technologyType: "Backend",
name: ".NET",
},
},
],
},
],
nubmerOfApplicants: 4,
},
{
id: 2,
title: "GO developer",
applicants: [
{
applicantId: 1,
firstName: "Dzenis",
lastName: "Hadzifejzovic",
dateOfApplication: "2022-02-11T00:00:00",
cv: "link",
experience: 1,
technologyApplicants: [
{
technology: {
technologyId: 1,
technologyType: "Backend",
name: ".NET",
},
},
{
technology: {
technologyId: 3,
technologyType: "Frontend",
name: "HTML/CSS",
},
},
],
},
],
nubmerOfApplicants: 1,
},
],
},
users: {
users: [
{
id: 1,
firstName: "First",
lastName: "User",
email: "first@gmail.com",
isEnabled: false,
},
{
id: 2,
firstName: "Second",
lastName: "User",
email: "second@gmail.com",
isEnabled: true,
},
{
id: 3,
firstName: "Third",
lastName: "User",
email: "third@gmail.com",
isEnabled: false,
},
],
user: {
id: 2,
firstName: "Second",
lastName: "User",
email: "second@gmail.com",
isEnabled: true,
},
selected: {},
fetchUsersErrorMessage: "Server error",
toggleEnableErrorMessage: "",
}, },
selections: { selections: {
process: { doneProcess: false }, process: { doneProcess: false },

+ 5
- 4
src/pages/CandidatesPage/AdsCandidatesPage.js Целия файл

import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { useTheme } from "@mui/system"; import { useTheme } from "@mui/system";
import { useMediaQuery } from "@mui/material"; import { useMediaQuery } from "@mui/material";
import { selectAdsCandidates } from "../../store/selectors/candidatesSelectors";


const AdsCandidatesPage = ({ history, search }) => { const AdsCandidatesPage = ({ history, search }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { adsCandidates } = useSelector((s) => s.candidates);
const adsCandidates = useSelector(selectAdsCandidates);
const [getRef, setRef] = useDynamicRefs(); const [getRef, setRef] = useDynamicRefs();
const theme = useTheme(); const theme = useTheme();
const matches = useMediaQuery(theme.breakpoints.down("361")); const matches = useMediaQuery(theme.breakpoints.down("361"));
</p> </p>
</div> </div>
<div className="ads-candidates-slider"> <div className="ads-candidates-slider">
{filterByName(adCandidates).length > 3 && (
{filterByName(adCandidates).length > 4 && (
<div <div
className="active-ads-ads-arrows" className="active-ads-ads-arrows"
style={matches ? { marginLeft: 36 } : { marginLeft: 0 }} style={matches ? { marginLeft: 36 } : { marginLeft: 0 }}
ref={setRef(index.toString())} ref={setRef(index.toString())}
className={`left-move-candidateAd-page ${ className={`left-move-candidateAd-page ${
matches matches
? filterByName(adCandidates).length > 3
? filterByName(adCandidates).length > 4
? "cls1" ? "cls1"
: "cls2" : "cls2"
: filterByName(adCandidates).length > 3
: filterByName(adCandidates).length > 4
? "cls3" ? "cls3"
: "cls4" : "cls4"
}`} }`}

+ 18
- 7
src/pages/CandidatesPage/CandidateDetailsPage.js Целия файл

import { deleteCandidate } from "../../store/actions/candidate/candidateActions"; import { deleteCandidate } from "../../store/actions/candidate/candidateActions";
import ConfirmDialog from "../../components/MUI/ConfirmDialog"; import ConfirmDialog from "../../components/MUI/ConfirmDialog";
import deleteIcon from "../../assets/images/delete.png"; import deleteIcon from "../../assets/images/delete.png";
import { selectCandidate } from "../../store/selectors/candidateSelectors";
import { selectAuthUser } from "../../store/selectors/userSelectors";
import { selectUsers } from "../../store/selectors/usersSelector";


const CandidateDetailsPage = ({ history }) => { const CandidateDetailsPage = ({ history }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { users } = useSelector((s) => s.users);
const { user } = useSelector((s) => s.user);
const { candidate } = useSelector((s) => s.candidate);
const users = useSelector(selectUsers);
const user = useSelector(selectAuthUser);
const candidate = useSelector(selectCandidate);
const [inputValue, setInputValue] = useState(""); const [inputValue, setInputValue] = useState("");
let { id } = useParams(); let { id } = useParams();
const messageContainer = useRef(); const messageContainer = useRef();
flexDirection: "column", flexDirection: "column",
gap: 5, gap: 5,
marginLeft: 3, marginLeft: 3,
maxHeight: 95,
overflowY: "auto",
}} }}
> >
{children} {children}
</div> </div>
</div> </div>
<div className="applicant-ads-container"> <div className="applicant-ads-container">
<p style={{marginLeft:matches ? 36 : 144}}>Sve prijave</p>
<p style={{ marginLeft: matches ? 36 : 144 }}>Sve prijave</p>
<div className="applicant-ads-container-2"> <div className="applicant-ads-container-2">
<div style={{marginLeft:matches ? 36 : (candidate.ads.length < 5 ? 108 : 72)}}>
{(matches ? candidate.ads.length > 1 : candidate.ads.length > 5) && (
<div
style={{
marginLeft: matches ? 36 : candidate.ads.length < 5 ? 108 : 72,
}}
>
{(matches
? candidate.ads.length > 1
: candidate.ads.length > 5) && (
<div className="active-ads-ads-arrows"> <div className="active-ads-ads-arrows">
<button onClick={activeAdsArrowLeftHandler}> <button onClick={activeAdsArrowLeftHandler}>
<img src={arrow_left} alt="arrow-left" /> <img src={arrow_left} alt="arrow-left" />
</div> </div>
)} )}
</div> </div>
<Slider {...settings} style={{ width: "100%"}} ref={adsSliderRef}>
<Slider {...settings} style={{ width: "100%" }} ref={adsSliderRef}>
{candidate.ads.map((add, index) => ( {candidate.ads.map((add, index) => (
<CandidateAd <CandidateAd
add={add} add={add}

+ 15
- 7
src/pages/CandidatesPage/TableViewPage.js Целия файл

import { PAGE_SIZE_CANDIDATES } from "../../constants/keyCodeConstants"; import { PAGE_SIZE_CANDIDATES } from "../../constants/keyCodeConstants";
import { useTheme } from "@mui/system"; import { useTheme } from "@mui/system";
import { useMediaQuery } from "@mui/material"; import { useMediaQuery } from "@mui/material";
import { selectCandidates,selectPagination } from "../../store/selectors/candidatesSelectors";


const TableViewPage = ({ history, setPage, page, search }) => { const TableViewPage = ({ history, setPage, page, search }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const { candidates } = useSelector((s) => s.candidates);
const { pagination } = useSelector((s) => s.candidates); // pagination is total number of candidates on backend
const candidates = useSelector(selectCandidates);
const pagination = useSelector(selectPagination); // pagination is total number of candidates on backend
const theme = useTheme(); const theme = useTheme();
const matches = useMediaQuery(theme.breakpoints.down("361")); const matches = useMediaQuery(theme.breakpoints.down("361"));




return ( return (
<div className="candidates-table"> <div className="candidates-table">
<div style={{ overflowX: "auto",marginLeft:matches ? 36 : 72 }}>
<div style={{ overflowX: "auto", marginLeft: matches ? 36 : 72 }}>
<table className="usersTable" style={{ width: "1017px" }}> <table className="usersTable" style={{ width: "1017px" }}>
<thead> <thead>
<tr className="headingRow"> <tr className="headingRow">
onClick={() => navigate(candidate.applicantId)} onClick={() => navigate(candidate.applicantId)}
> >
<td> <td>
{(candidate.firstName + " " + candidate.lastName).includes(search) ? (
formatLabel(candidate.firstName + " " + candidate.lastName, search)
{(candidate.firstName + " " + candidate.lastName).includes(
search
) ? (
formatLabel(
candidate.firstName + " " + candidate.lastName,
search
)
) : ( ) : (
<span>{candidate.firstName + " " + candidate.lastName}</span>
<span>
{candidate.firstName + " " + candidate.lastName}
</span>
)} )}
</td> </td>
<td>{candidate.experience}</td> <td>{candidate.experience}</td>
: Math.ceil(parseInt(pagination) / PAGE_SIZE_CANDIDATES) : Math.ceil(parseInt(pagination) / PAGE_SIZE_CANDIDATES)
} }
color="primary" color="primary"
style={{ alignSelf: "center", marginTop: "20px" }}
className="candidates-pagination"
onChange={handleChange} onChange={handleChange}
shape="rounded" shape="rounded"
/> />

+ 5
- 1
src/store/saga/technologiesSaga.js Целия файл

setTechnologies, setTechnologies,
setTechnologiesError, setTechnologiesError,
} from "../actions/technologies/technologiesActions"; } from "../actions/technologies/technologiesActions";
import { rejectErrorCodeHelper } from "../../util/helpers/rejectErrorCodeHelper";


export function* getTechnologies() { export function* getTechnologies() {
try { try {
const resultData = result.data.map((res) => ({ ...res, isChecked: false })); const resultData = result.data.map((res) => ({ ...res, isChecked: false }));
yield put(setTechnologies(resultData)); yield put(setTechnologies(resultData));
} catch (error) { } catch (error) {
yield put(setTechnologiesError(error));
if (error.response && error.response.data) {
const errorMessage = yield call(rejectErrorCodeHelper, error);
yield put(setTechnologiesError(errorMessage));
}
} }
} }



+ 5
- 0
src/store/selectors/candidateSelectors.js Целия файл

export const selectCandidate = createSelector( export const selectCandidate = createSelector(
candidateSelector, candidateSelector,
(state) => state.candidate, (state) => state.candidate,
);

export const selectCandidateError = createSelector(
candidateSelector,
(state) => state.errorMessage
); );

+ 27
- 3
src/store/selectors/candidatesSelectors.js Целия файл

// export const selectAdsCandidates = createSelector(
// adsCandidatesSelector,
// (state) => state.adsCandidates,
// );

import { createSelector } from "@reduxjs/toolkit";

export const candidatesSelector = (state) => state.candidates;

export const selectCandidates = createSelector(
candidatesSelector,
(state) => state.candidates
);

export const selectPagination = createSelector(
candidatesSelector,
(state) => state.pagination
);

export const selectAdsCandidates = createSelector( export const selectAdsCandidates = createSelector(
adsCandidatesSelector,
(state) => state.adsCandidates,
);
candidatesSelector,
(state) => state.adsCandidates
);

export const selectCandidatesError = createSelector(
candidatesSelector,
(state) => state.errorMessage
);

+ 10
- 5
src/store/selectors/usersSelector.js Целия файл

import { createSelector } from "@reduxjs/toolkit"; import { createSelector } from "@reduxjs/toolkit";


export const usersSelector = (state) => state.user;
export const usersSelector = (state) => state.users;


export const selectAuthUser = createSelector(
userSelector,
(state) => state.user,
);
// export const selectAuthUser = createSelector(
// usersSelector,
// (state) => state.user,
// );

export const selectUsers = createSelector(
usersSelector,
(state) => state.users
)

+ 63
- 53
yarn.lock Целия файл

"resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz" "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz"
"version" "7.14.4" "version" "7.14.4"


"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.4":
"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.1.0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0", "@babel/core@^7.7.5", "@babel/core@^7.8.4", "@babel/core@7 || ^7.0.0-rc.2":
"integrity" "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==" "integrity" "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg=="
"resolved" "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz" "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz"
"version" "7.14.3" "version" "7.14.3"
"resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz" "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz"
"version" "0.8.0" "version" "0.8.0"


"@emotion/react@^11.1.1", "@emotion/react@^11.5.0":
"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.1.1", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0":
"integrity" "sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA==" "integrity" "sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA=="
"resolved" "https://registry.npmjs.org/@emotion/react/-/react-11.10.4.tgz" "resolved" "https://registry.npmjs.org/@emotion/react/-/react-11.10.4.tgz"
"version" "11.10.4" "version" "11.10.4"
"resolved" "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz" "resolved" "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz"
"version" "1.2.0" "version" "1.2.0"


"@emotion/styled@^11.3.0":
"@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1":
"integrity" "sha512-pRl4R8Ez3UXvOPfc2bzIoV8u9P97UedgHS4FPX594ntwEuAMA114wlaHvOK24HB48uqfXiGlYIZYCxVJ1R1ttQ==" "integrity" "sha512-pRl4R8Ez3UXvOPfc2bzIoV8u9P97UedgHS4FPX594ntwEuAMA114wlaHvOK24HB48uqfXiGlYIZYCxVJ1R1ttQ=="
"resolved" "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.4.tgz" "resolved" "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.4.tgz"
"version" "11.10.4" "version" "11.10.4"
dependencies: dependencies:
"@babel/runtime" "^7.19.0" "@babel/runtime" "^7.19.0"


"@mui/material@^5.0.6":
"@mui/material@^5.0.0", "@mui/material@^5.0.6", "@mui/material@^5.4.1":
"integrity" "sha512-ioLvqY7VvcePz9dnEIRhpiVvtJmAFmvG6rtLXXzVdMmAVbSaelr5Io07mPz/mCyqE+Uv8/4EuJV276DWO7etzA==" "integrity" "sha512-ioLvqY7VvcePz9dnEIRhpiVvtJmAFmvG6rtLXXzVdMmAVbSaelr5Io07mPz/mCyqE+Uv8/4EuJV276DWO7etzA=="
"resolved" "https://registry.npmjs.org/@mui/material/-/material-5.10.10.tgz" "resolved" "https://registry.npmjs.org/@mui/material/-/material-5.10.10.tgz"
"version" "5.10.10" "version" "5.10.10"
"csstype" "^3.1.1" "csstype" "^3.1.1"
"prop-types" "^15.8.1" "prop-types" "^15.8.1"


"@mui/system@^5.10.10":
"@mui/system@^5.10.10", "@mui/system@^5.4.1":
"integrity" "sha512-TXwtKN0adKpBrZmO+eilQWoPf2veh050HLYrN78Kps9OhlvO70v/2Kya0+mORFhu9yhpAwjHXO8JII/R4a5ZLA==" "integrity" "sha512-TXwtKN0adKpBrZmO+eilQWoPf2veh050HLYrN78Kps9OhlvO70v/2Kya0+mORFhu9yhpAwjHXO8JII/R4a5ZLA=="
"resolved" "https://registry.npmjs.org/@mui/system/-/system-5.10.10.tgz" "resolved" "https://registry.npmjs.org/@mui/system/-/system-5.10.10.tgz"
"version" "5.10.10" "version" "5.10.10"
dependencies: dependencies:
"defer-to-connect" "^1.0.1" "defer-to-connect" "^1.0.1"


"@testing-library/dom@^8.0.0":
"@testing-library/dom@^8.0.0", "@testing-library/dom@>=7.21.4":
"integrity" "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==" "integrity" "sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A=="
"resolved" "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz" "resolved" "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz"
"version" "8.19.0" "version" "8.19.0"
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"


"@types/react@*":
"@types/react@*", "@types/react@^17.0.0 || ^18.0.0":
"integrity" "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==" "integrity" "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA=="
"resolved" "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz" "resolved" "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz"
"version" "18.0.21" "version" "18.0.21"
"@types/source-list-map" "*" "@types/source-list-map" "*"
"source-map" "^0.7.3" "source-map" "^0.7.3"


"@types/webpack@^4.41.8":
"@types/webpack@^4.41.8", "@types/webpack@4.x":
"integrity" "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==" "integrity" "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q=="
"resolved" "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz" "resolved" "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz"
"version" "4.41.29" "version" "4.41.29"
dependencies: dependencies:
"@types/yargs-parser" "*" "@types/yargs-parser" "*"


"@typescript-eslint/eslint-plugin@^4.5.0":
"@typescript-eslint/eslint-plugin@^4.0.0", "@typescript-eslint/eslint-plugin@^4.5.0", "@typescript-eslint/eslint-plugin@>= 4":
"integrity" "sha512-yA7IWp+5Qqf+TLbd8b35ySFOFzUfL7i+4If50EqvjT6w35X8Lv0eBHb6rATeWmucks37w+zV+tWnOXI9JlG6Eg==" "integrity" "sha512-yA7IWp+5Qqf+TLbd8b35ySFOFzUfL7i+4If50EqvjT6w35X8Lv0eBHb6rATeWmucks37w+zV+tWnOXI9JlG6Eg=="
"resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.0.tgz" "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.0.tgz"
"version" "4.26.0" "version" "4.26.0"
"eslint-scope" "^5.1.1" "eslint-scope" "^5.1.1"
"eslint-utils" "^3.0.0" "eslint-utils" "^3.0.0"


"@typescript-eslint/parser@^4.5.0":
"@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@^4.5.0":
"integrity" "sha512-b4jekVJG9FfmjUfmM4VoOItQhPlnt6MPOBUL0AQbiTmm+SSpSdhHYlwayOm4IW9KLI/4/cRKtQCmDl1oE2OlPg==" "integrity" "sha512-b4jekVJG9FfmjUfmM4VoOItQhPlnt6MPOBUL0AQbiTmm+SSpSdhHYlwayOm4IW9KLI/4/cRKtQCmDl1oE2OlPg=="
"resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.26.0.tgz" "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.26.0.tgz"
"version" "4.26.0" "version" "4.26.0"
"resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
"version" "7.2.0" "version" "7.2.0"


"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.1.0", "acorn@^7.1.1", "acorn@^7.4.0":
"integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
"resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
"version" "7.4.1"

"acorn@^6.4.1": "acorn@^6.4.1":
"integrity" "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" "integrity" "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ=="
"resolved" "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" "resolved" "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz"
"version" "6.4.2" "version" "6.4.2"


"acorn@^7.1.0", "acorn@^7.1.1", "acorn@^7.4.0":
"integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
"resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
"version" "7.4.1"

"acorn@^8.2.4": "acorn@^8.2.4":
"integrity" "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==" "integrity" "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw=="
"resolved" "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz" "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz"
"resolved" "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" "resolved" "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
"version" "3.5.2" "version" "3.5.2"


"ajv@^6.1.0", "ajv@^6.10.0", "ajv@^6.10.2", "ajv@^6.12.4", "ajv@^6.12.5":
"ajv@^6.1.0", "ajv@^6.10.0", "ajv@^6.10.2", "ajv@^6.12.4", "ajv@^6.12.5", "ajv@^6.9.1", "ajv@>=5.0.0":
"integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="
"resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
"version" "6.12.6" "version" "6.12.6"
"resolved" "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz" "resolved" "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz"
"version" "2.2.0" "version" "2.2.0"


"babel-eslint@^10.1.0":
"babel-eslint@^10.0.0", "babel-eslint@^10.1.0":
"integrity" "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==" "integrity" "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg=="
"resolved" "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz" "resolved" "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz"
"version" "10.1.0" "version" "10.1.0"
dependencies: dependencies:
"pako" "~1.0.5" "pako" "~1.0.5"


"browserslist@^4.0.0", "browserslist@^4.12.0", "browserslist@^4.16.6", "browserslist@^4.6.2", "browserslist@^4.6.4":
"browserslist@^4", "browserslist@^4.0.0", "browserslist@^4.12.0", "browserslist@^4.16.6", "browserslist@^4.6.2", "browserslist@^4.6.4":
"integrity" "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==" "integrity" "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ=="
"resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz" "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz"
"version" "4.16.6" "version" "4.16.6"
"whatwg-mimetype" "^2.3.0" "whatwg-mimetype" "^2.3.0"
"whatwg-url" "^8.0.0" "whatwg-url" "^8.0.0"


"date-fns@^2.29.3":
"date-fns@^2.0.0", "date-fns@^2.25.0", "date-fns@^2.29.3":
"integrity" "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" "integrity" "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA=="
"resolved" "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" "resolved" "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz"
"version" "2.29.3" "version" "2.29.3"
"lodash" "^4.17.15" "lodash" "^4.17.15"
"string-natural-compare" "^3.0.1" "string-natural-compare" "^3.0.1"


"eslint-plugin-import@^2.22.1", "eslint-plugin-import@^2.23.4":
"eslint-plugin-import@^2.22.0", "eslint-plugin-import@^2.22.1", "eslint-plugin-import@^2.23.4":
"integrity" "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==" "integrity" "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ=="
"resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz" "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz"
"version" "2.23.4" "version" "2.23.4"
"resolve" "^1.20.0" "resolve" "^1.20.0"
"tsconfig-paths" "^3.9.0" "tsconfig-paths" "^3.9.0"


"eslint-plugin-jest@^24.1.0":
"eslint-plugin-jest@^24.0.0", "eslint-plugin-jest@^24.1.0":
"integrity" "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==" "integrity" "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg=="
"resolved" "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz" "resolved" "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz"
"version" "24.3.6" "version" "24.3.6"
dependencies: dependencies:
"prettier-linter-helpers" "^1.0.0" "prettier-linter-helpers" "^1.0.0"


"eslint-plugin-react-hooks@^4.2.0":
"eslint-plugin-react-hooks@^4 || ^3 || ^2.3.0 || ^1.7.0", "eslint-plugin-react-hooks@^4.0.8", "eslint-plugin-react-hooks@^4.2.0":
"integrity" "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" "integrity" "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ=="
"resolved" "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz" "resolved" "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz"
"version" "4.2.0" "version" "4.2.0"


"eslint-plugin-react@^7.21.5", "eslint-plugin-react@^7.24.0":
"eslint-plugin-react@^7.20.3", "eslint-plugin-react@^7.21.5", "eslint-plugin-react@^7.24.0":
"integrity" "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==" "integrity" "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q=="
"resolved" "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz" "resolved" "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz"
"version" "7.24.0" "version" "7.24.0"
dependencies: dependencies:
"safe-regex" "^1.1.0" "safe-regex" "^1.1.0"


"eslint-plugin-testing-library@^3.9.2":
"eslint-plugin-testing-library@^3.9.0", "eslint-plugin-testing-library@^3.9.2":
"integrity" "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==" "integrity" "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA=="
"resolved" "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz" "resolved" "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz"
"version" "3.10.2" "version" "3.10.2"
"normalize-path" "^3.0.0" "normalize-path" "^3.0.0"
"schema-utils" "^3.0.0" "schema-utils" "^3.0.0"


"eslint@^7.11.0", "eslint@^7.28.0":
"eslint@*", "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^3 || ^4 || ^5 || ^6 || ^7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "eslint@^5 || ^6 || ^7", "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", "eslint@^5.16.0 || ^6.8.0 || ^7.2.0", "eslint@^7.0.0", "eslint@^7.1.0", "eslint@^7.11.0", "eslint@^7.28.0", "eslint@^7.5.0", "eslint@>= 4.12.1", "eslint@>=5", "eslint@>=5.0.0", "eslint@>=7.0.0":
"integrity" "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==" "integrity" "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA=="
"resolved" "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" "resolved" "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz"
"version" "7.32.0" "version" "7.32.0"
dependencies: dependencies:
"flat-cache" "^3.0.4" "flat-cache" "^3.0.4"


"file-loader@6.1.1":
"file-loader@*", "file-loader@6.1.1":
"integrity" "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==" "integrity" "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw=="
"resolved" "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz" "resolved" "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz"
"version" "6.1.1" "version" "6.1.1"
"resolved" "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz"
"version" "1.1.1" "version" "1.1.1"


"i18next@^20.3.1":
"i18next@^20.3.1", "i18next@>= 19.0.0":
"integrity" "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==" "integrity" "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A=="
"resolved" "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz" "resolved" "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz"
"version" "20.6.1" "version" "20.6.1"
"jest-regex-util" "^26.0.0" "jest-regex-util" "^26.0.0"
"jest-snapshot" "^26.6.2" "jest-snapshot" "^26.6.2"


"jest-resolve@^26.6.2":
"integrity" "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ=="
"resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz"
"version" "26.6.2"
"jest-resolve@*", "jest-resolve@26.6.0":
"integrity" "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ=="
"resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz"
"version" "26.6.0"
dependencies: dependencies:
"@jest/types" "^26.6.2"
"@jest/types" "^26.6.0"
"chalk" "^4.0.0" "chalk" "^4.0.0"
"graceful-fs" "^4.2.4" "graceful-fs" "^4.2.4"
"jest-pnp-resolver" "^1.2.2" "jest-pnp-resolver" "^1.2.2"
"jest-util" "^26.6.2"
"jest-util" "^26.6.0"
"read-pkg-up" "^7.0.1" "read-pkg-up" "^7.0.1"
"resolve" "^1.18.1"
"resolve" "^1.17.0"
"slash" "^3.0.0" "slash" "^3.0.0"


"jest-resolve@26.6.0":
"integrity" "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ=="
"resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz"
"version" "26.6.0"
"jest-resolve@^26.6.2":
"integrity" "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ=="
"resolved" "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz"
"version" "26.6.2"
dependencies: dependencies:
"@jest/types" "^26.6.0"
"@jest/types" "^26.6.2"
"chalk" "^4.0.0" "chalk" "^4.0.0"
"graceful-fs" "^4.2.4" "graceful-fs" "^4.2.4"
"jest-pnp-resolver" "^1.2.2" "jest-pnp-resolver" "^1.2.2"
"jest-util" "^26.6.0"
"jest-util" "^26.6.2"
"read-pkg-up" "^7.0.1" "read-pkg-up" "^7.0.1"
"resolve" "^1.17.0"
"resolve" "^1.18.1"
"slash" "^3.0.0" "slash" "^3.0.0"


"jest-runner@^26.6.0", "jest-runner@^26.6.3": "jest-runner@^26.6.0", "jest-runner@^26.6.3":
"merge-stream" "^2.0.0" "merge-stream" "^2.0.0"
"supports-color" "^7.0.0" "supports-color" "^7.0.0"


"jest@^26.6.0", "jest@26.6.0":
"jest@^26.0.0", "jest@^26.6.0", "jest@26.6.0":
"integrity" "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==" "integrity" "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA=="
"resolved" "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz" "resolved" "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz"
"version" "26.6.0" "version" "26.6.0"
"resolved" "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz" "resolved" "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz"
"version" "1.4.0" "version" "1.4.0"


"jquery@>=1.8.0":
"integrity" "sha512-/e7ulNIEEYk1Z/l4X0vpxGt+B/dNsV8ghOPAWZaJs8pkGvsSC0tm33aMGylXcj/U7y4IcvwtMXPMyBFZn/gK9A=="
"resolved" "https://registry.npmjs.org/jquery/-/jquery-3.6.2.tgz"
"version" "3.6.2"

"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0": "js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
"integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
"resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
dependencies: dependencies:
"fast-diff" "^1.1.2" "fast-diff" "^1.1.2"


"prettier@2.3.1":
"prettier@>=1.13.0", "prettier@2.3.1":
"integrity" "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==" "integrity" "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA=="
"resolved" "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz" "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz"
"version" "2.3.1" "version" "2.3.1"
"strip-ansi" "6.0.0" "strip-ansi" "6.0.0"
"text-table" "0.2.0" "text-table" "0.2.0"


"react-dom@^17.0.2":
"react-dom@^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.6.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0", "react-dom@^17.0.0 || ^18.0.0", "react-dom@^17.0.2", "react-dom@^17.0.2 || ^18.0.0", "react-dom@<18.0.0", "react-dom@>=16.6.0", "react-dom@>=16.8.3":
"integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==" "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA=="
"resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz"
"version" "17.0.2" "version" "17.0.2"
"prop-types" "^15.5.8" "prop-types" "^15.5.8"
"substyle" "^9.1.0" "substyle" "^9.1.0"


"react-redux@^7.2.4":
"react-redux@^7.2.1 || ^8.0.2", "react-redux@^7.2.4":
"integrity" "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==" "integrity" "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ=="
"resolved" "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz" "resolved" "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz"
"version" "7.2.9" "version" "7.2.9"
"prop-types" "^15.7.2" "prop-types" "^15.7.2"
"react-is" "^17.0.2" "react-is" "^17.0.2"


"react-refresh@^0.8.3":
"react-refresh@^0.8.3", "react-refresh@>=0.8.3 <0.10.0":
"integrity" "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" "integrity" "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg=="
"resolved" "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz" "resolved" "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz"
"version" "0.8.3" "version" "0.8.3"
"loose-envify" "^1.4.0" "loose-envify" "^1.4.0"
"prop-types" "^15.6.2" "prop-types" "^15.6.2"


"react@^17.0.2":
"react@^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.3.0 || ^17.0.0", "react@^16.6.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0", "react@^16.8.3 || ^17 || ^18", "react@^16.9.0 || ^17.0.0 || ^18", "react@^17.0.0 || ^18.0.0", "react@^17.0.2", "react@^17.0.2 || ^18.0.0", "react@^18.2.0", "react@<18.0.0", "react@>= 16", "react@>= 16.8 || 18.0.0", "react@>= 16.8.0", "react@>=15", "react@>=16.6.0", "react@>=16.8", "react@>=16.8.0", "react@>=16.8.3", "react@17.0.2":
"integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==" "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA=="
"resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz" "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz"
"version" "17.0.2" "version" "17.0.2"
"resolved" "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz" "resolved" "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz"
"version" "2.4.1" "version" "2.4.1"


"redux@^4.0.0", "redux@^4.0.4", "redux@^4.1.0", "redux@^4.1.2":
"redux@^4", "redux@^4.0.0", "redux@^4.0.4", "redux@^4.1.0", "redux@^4.1.2":
"integrity" "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==" "integrity" "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA=="
"resolved" "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz" "resolved" "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz"
"version" "4.2.0" "version" "4.2.0"
dependencies: dependencies:
"estree-walker" "^0.6.1" "estree-walker" "^0.6.1"


"rollup@^1.31.1":
"rollup@^1.20.0 || ^2.0.0", "rollup@^1.20.0||^2.0.0", "rollup@^1.31.1", "rollup@>=0.60.0 <3", "rollup@>=0.66.0 <3":
"integrity" "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==" "integrity" "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A=="
"resolved" "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz" "resolved" "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz"
"version" "1.32.1" "version" "1.32.1"
"schema-utils" "^3.0.0" "schema-utils" "^3.0.0"
"semver" "^7.3.2" "semver" "^7.3.2"


"sass@^1.34.1":
"sass@^1.3.0", "sass@^1.34.1":
"integrity" "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==" "integrity" "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A=="
"resolved" "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz" "resolved" "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz"
"version" "1.55.0" "version" "1.55.0"
"source-map-resolve" "^0.5.0" "source-map-resolve" "^0.5.0"
"use" "^3.1.0" "use" "^3.1.0"


"sockjs-client@^1.5.0":
"sockjs-client@^1.4.0", "sockjs-client@^1.5.0":
"integrity" "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==" "integrity" "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ=="
"resolved" "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz" "resolved" "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz"
"version" "1.5.1" "version" "1.5.1"
dependencies: dependencies:
"typescript-compare" "^0.0.2" "typescript-compare" "^0.0.2"


"typescript@^3.2.1 || ^4", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta":
"integrity" "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg=="
"resolved" "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz"
"version" "4.9.4"

"unbox-primitive@^1.0.2": "unbox-primitive@^1.0.2":
"integrity" "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==" "integrity" "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw=="
"resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz"
"range-parser" "^1.2.1" "range-parser" "^1.2.1"
"webpack-log" "^2.0.0" "webpack-log" "^2.0.0"


"webpack-dev-server@3.11.1":
"webpack-dev-server@3.11.1", "webpack-dev-server@3.x":
"integrity" "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==" "integrity" "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ=="
"resolved" "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz" "resolved" "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz"
"version" "3.11.1" "version" "3.11.1"
"source-list-map" "^2.0.0" "source-list-map" "^2.0.0"
"source-map" "~0.6.1" "source-map" "~0.6.1"


"webpack@4.44.2":
"webpack@^4.0.0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.36.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", "webpack@>=2", "webpack@>=4.43.0 <6.0.0", "webpack@2 || 3 || 4", "webpack@4.44.2":
"integrity" "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==" "integrity" "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q=="
"resolved" "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz" "resolved" "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz"
"version" "4.44.2" "version" "4.44.2"

Loading…
Отказ
Запис