diff --git a/build.gradle b/build.gradle
index b374d68..9449464 100644
--- a/build.gradle
+++ b/build.gradle
@@ -17,8 +17,6 @@ jar {
}
dependencies {
- implementation(project(':front'))
-
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
implementation 'org.springframework.boot:spring-boot-starter-web'
diff --git a/front/.gitignore b/front/.gitignore
deleted file mode 100644
index 5eb675a..0000000
--- a/front/.gitignore
+++ /dev/null
@@ -1,50 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# production
-/build
-
-# misc
-.DS_Store
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
-
-.parcel-cache
diff --git a/front/build.gradle b/front/build.gradle
deleted file mode 100644
index c2fe13c..0000000
--- a/front/build.gradle
+++ /dev/null
@@ -1,53 +0,0 @@
-import com.github.gradle.node.util.PlatformHelper
-import groovy.text.SimpleTemplateEngine
-
-plugins {
- id 'java'
- id 'com.github.node-gradle.node' version '3.5.1'
- id "de.undercouch.download" version '5.3.1'
-}
-
-node {
- version = '18.15.0'
- download = true
-}
-
-jar.dependsOn 'npmBuild'
-
-clean.dependsOn 'npmClean'
-
-nodeSetup.dependsOn 'downloadNode'
-
-jar {
- from 'dist'
- into 'static'
-}
-
-task downloadNode(type: Download) {
- final helper = new PlatformHelper()
- final templateData = [
- "url" : node.distBaseUrl.get(),
- "version": node.version.get(),
- "os" : helper.osName,
- "arch" : helper.osArch,
- "ext" : helper.windows ? 'zip' : 'tar.gz'
- ]
- final urlTemplate = '${url}/v${version}/node-v${version}-${os}-${arch}.${ext}'
- final engine = new SimpleTemplateEngine()
- final url = engine.createTemplate(urlTemplate).make(templateData).toString()
- final String destDir = '.gradle/'
- file(destDir).mkdirs()
- src url
- dest destDir
- overwrite false
-}
-
-tasks.register('npmBuild', NpmTask) {
- dependsOn npmInstall
- args = ['run-script', 'build']
-}
-
-tasks.register('npmClean', NpmTask) {
- dependsOn npmInstall
- args = ['run-script', 'clean']
-}
\ No newline at end of file
diff --git a/front/package-lock.json b/front/package-lock.json
deleted file mode 100644
index 819072d..0000000
--- a/front/package-lock.json
+++ /dev/null
@@ -1,3303 +0,0 @@
-{
- "name": "cinema-react-2",
- "version": "0.1.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "cinema-react-2",
- "version": "0.1.0",
- "dependencies": {
- "@fortawesome/fontawesome-free": "^6.2.1",
- "@fortawesome/free-solid-svg-icons": "^6.2.1",
- "@fortawesome/react-fontawesome": "^0.2.0",
- "axios": "^1.2.1",
- "bootstrap": "^5.2.3",
- "font-awesome": "^4.7.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-router-dom": "^6.4.4"
- },
- "devDependencies": {
- "buffer": "^5.7.1",
- "parcel": "2.8.3",
- "process": "^0.11.10",
- "rimraf": "4.4.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.21.4",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
- "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
- "dev": true,
- "dependencies": {
- "@babel/highlight": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@fortawesome/fontawesome-common-types": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz",
- "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==",
- "hasInstallScript": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@fortawesome/fontawesome-free": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz",
- "integrity": "sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ==",
- "hasInstallScript": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@fortawesome/fontawesome-svg-core": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz",
- "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==",
- "hasInstallScript": true,
- "peer": true,
- "dependencies": {
- "@fortawesome/fontawesome-common-types": "6.4.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@fortawesome/free-solid-svg-icons": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz",
- "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==",
- "hasInstallScript": true,
- "dependencies": {
- "@fortawesome/fontawesome-common-types": "6.4.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@fortawesome/react-fontawesome": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz",
- "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==",
- "dependencies": {
- "prop-types": "^15.8.1"
- },
- "peerDependencies": {
- "@fortawesome/fontawesome-svg-core": "~1 || ~6",
- "react": ">=16.3"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz",
- "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.18",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
- "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- }
- },
- "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
- },
- "node_modules/@lezer/common": {
- "version": "0.15.12",
- "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz",
- "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==",
- "dev": true
- },
- "node_modules/@lezer/lr": {
- "version": "0.15.8",
- "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz",
- "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==",
- "dev": true,
- "dependencies": {
- "@lezer/common": "^0.15.0"
- }
- },
- "node_modules/@lmdb/lmdb-darwin-arm64": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz",
- "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@lmdb/lmdb-darwin-x64": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz",
- "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@lmdb/lmdb-linux-arm": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz",
- "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@lmdb/lmdb-linux-arm64": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz",
- "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@lmdb/lmdb-linux-x64": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz",
- "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@lmdb/lmdb-win32-x64": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz",
- "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@mischnic/json-sourcemap": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz",
- "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==",
- "dev": true,
- "dependencies": {
- "@lezer/common": "^0.15.7",
- "@lezer/lr": "^0.15.4",
- "json5": "^2.2.1"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz",
- "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz",
- "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz",
- "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz",
- "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz",
- "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz",
- "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@parcel/bundler-default": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.8.3.tgz",
- "integrity": "sha512-yJvRsNWWu5fVydsWk3O2L4yIy3UZiKWO2cPDukGOIWMgp/Vbpp+2Ct5IygVRtE22bnseW/E/oe0PV3d2IkEJGg==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/graph": "2.8.3",
- "@parcel/hash": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/cache": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.8.3.tgz",
- "integrity": "sha512-k7xv5vSQrJLdXuglo+Hv3yF4BCSs1tQ/8Vbd6CHTkOhf7LcGg6CPtLw053R/KdMpd/4GPn0QrAsOLdATm1ELtQ==",
- "dev": true,
- "dependencies": {
- "@parcel/fs": "2.8.3",
- "@parcel/logger": "2.8.3",
- "@parcel/utils": "2.8.3",
- "lmdb": "2.5.2"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "peerDependencies": {
- "@parcel/core": "^2.8.3"
- }
- },
- "node_modules/@parcel/codeframe": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.8.3.tgz",
- "integrity": "sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.1.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/compressor-raw": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.8.3.tgz",
- "integrity": "sha512-bVDsqleBUxRdKMakWSlWC9ZjOcqDKE60BE+Gh3JSN6WJrycJ02P5wxjTVF4CStNP/G7X17U+nkENxSlMG77ySg==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/config-default": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.8.3.tgz",
- "integrity": "sha512-o/A/mbrO6X/BfGS65Sib8d6SSG45NYrNooNBkH/o7zbOBSRQxwyTlysleK1/3Wa35YpvFyLOwgfakqCtbGy4fw==",
- "dev": true,
- "dependencies": {
- "@parcel/bundler-default": "2.8.3",
- "@parcel/compressor-raw": "2.8.3",
- "@parcel/namer-default": "2.8.3",
- "@parcel/optimizer-css": "2.8.3",
- "@parcel/optimizer-htmlnano": "2.8.3",
- "@parcel/optimizer-image": "2.8.3",
- "@parcel/optimizer-svgo": "2.8.3",
- "@parcel/optimizer-terser": "2.8.3",
- "@parcel/packager-css": "2.8.3",
- "@parcel/packager-html": "2.8.3",
- "@parcel/packager-js": "2.8.3",
- "@parcel/packager-raw": "2.8.3",
- "@parcel/packager-svg": "2.8.3",
- "@parcel/reporter-dev-server": "2.8.3",
- "@parcel/resolver-default": "2.8.3",
- "@parcel/runtime-browser-hmr": "2.8.3",
- "@parcel/runtime-js": "2.8.3",
- "@parcel/runtime-react-refresh": "2.8.3",
- "@parcel/runtime-service-worker": "2.8.3",
- "@parcel/transformer-babel": "2.8.3",
- "@parcel/transformer-css": "2.8.3",
- "@parcel/transformer-html": "2.8.3",
- "@parcel/transformer-image": "2.8.3",
- "@parcel/transformer-js": "2.8.3",
- "@parcel/transformer-json": "2.8.3",
- "@parcel/transformer-postcss": "2.8.3",
- "@parcel/transformer-posthtml": "2.8.3",
- "@parcel/transformer-raw": "2.8.3",
- "@parcel/transformer-react-refresh-wrap": "2.8.3",
- "@parcel/transformer-svg": "2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "peerDependencies": {
- "@parcel/core": "^2.8.3"
- }
- },
- "node_modules/@parcel/core": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.8.3.tgz",
- "integrity": "sha512-Euf/un4ZAiClnlUXqPB9phQlKbveU+2CotZv7m7i+qkgvFn5nAGnrV4h1OzQU42j9dpgOxWi7AttUDMrvkbhCQ==",
- "dev": true,
- "dependencies": {
- "@mischnic/json-sourcemap": "^0.1.0",
- "@parcel/cache": "2.8.3",
- "@parcel/diagnostic": "2.8.3",
- "@parcel/events": "2.8.3",
- "@parcel/fs": "2.8.3",
- "@parcel/graph": "2.8.3",
- "@parcel/hash": "2.8.3",
- "@parcel/logger": "2.8.3",
- "@parcel/package-manager": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/types": "2.8.3",
- "@parcel/utils": "2.8.3",
- "@parcel/workers": "2.8.3",
- "abortcontroller-polyfill": "^1.1.9",
- "base-x": "^3.0.8",
- "browserslist": "^4.6.6",
- "clone": "^2.1.1",
- "dotenv": "^7.0.0",
- "dotenv-expand": "^5.1.0",
- "json5": "^2.2.0",
- "msgpackr": "^1.5.4",
- "nullthrows": "^1.1.1",
- "semver": "^5.7.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/diagnostic": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.8.3.tgz",
- "integrity": "sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==",
- "dev": true,
- "dependencies": {
- "@mischnic/json-sourcemap": "^0.1.0",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/events": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.8.3.tgz",
- "integrity": "sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==",
- "dev": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/fs": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.8.3.tgz",
- "integrity": "sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==",
- "dev": true,
- "dependencies": {
- "@parcel/fs-search": "2.8.3",
- "@parcel/types": "2.8.3",
- "@parcel/utils": "2.8.3",
- "@parcel/watcher": "^2.0.7",
- "@parcel/workers": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "peerDependencies": {
- "@parcel/core": "^2.8.3"
- }
- },
- "node_modules/@parcel/fs-search": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.8.3.tgz",
- "integrity": "sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==",
- "dev": true,
- "dependencies": {
- "detect-libc": "^1.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/graph": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.8.3.tgz",
- "integrity": "sha512-26GL8fYZPdsRhSXCZ0ZWliloK6DHlMJPWh6Z+3VVZ5mnDSbYg/rRKWmrkhnr99ZWmL9rJsv4G74ZwvDEXTMPBg==",
- "dev": true,
- "dependencies": {
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/hash": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.8.3.tgz",
- "integrity": "sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==",
- "dev": true,
- "dependencies": {
- "detect-libc": "^1.0.3",
- "xxhash-wasm": "^0.4.2"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/logger": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.8.3.tgz",
- "integrity": "sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/events": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/markdown-ansi": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.8.3.tgz",
- "integrity": "sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.1.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/namer-default": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.8.3.tgz",
- "integrity": "sha512-tJ7JehZviS5QwnxbARd8Uh63rkikZdZs1QOyivUhEvhN+DddSAVEdQLHGPzkl3YRk0tjFhbqo+Jci7TpezuAMw==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/node-resolver-core": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.8.3.tgz",
- "integrity": "sha512-12YryWcA5Iw2WNoEVr/t2HDjYR1iEzbjEcxfh1vaVDdZ020PiGw67g5hyIE/tsnG7SRJ0xdRx1fQ2hDgED+0Ww==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/utils": "2.8.3",
- "nullthrows": "^1.1.1",
- "semver": "^5.7.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/optimizer-css": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.8.3.tgz",
- "integrity": "sha512-JotGAWo8JhuXsQDK0UkzeQB0UR5hDAKvAviXrjqB4KM9wZNLhLleeEAW4Hk8R9smCeQFP6Xg/N/NkLDpqMwT3g==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/utils": "2.8.3",
- "browserslist": "^4.6.6",
- "lightningcss": "^1.16.1",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/optimizer-htmlnano": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.8.3.tgz",
- "integrity": "sha512-L8/fHbEy8Id2a2E0fwR5eKGlv9VYDjrH9PwdJE9Za9v1O/vEsfl/0T/79/x129l5O0yB6EFQkFa20MiK3b+vOg==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "htmlnano": "^2.0.0",
- "nullthrows": "^1.1.1",
- "posthtml": "^0.16.5",
- "svgo": "^2.4.0"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/optimizer-image": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.8.3.tgz",
- "integrity": "sha512-SD71sSH27SkCDNUNx9A3jizqB/WIJr3dsfp+JZGZC42tpD/Siim6Rqy9M4To/BpMMQIIiEXa5ofwS+DgTEiEHQ==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "@parcel/workers": "2.8.3",
- "detect-libc": "^1.0.3"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/optimizer-svgo": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.8.3.tgz",
- "integrity": "sha512-9KQed99NZnQw3/W4qBYVQ7212rzA9EqrQG019TIWJzkA9tjGBMIm2c/nXpK1tc3hQ3e7KkXkFCQ3C+ibVUnHNA==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "svgo": "^2.4.0"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/optimizer-terser": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.8.3.tgz",
- "integrity": "sha512-9EeQlN6zIeUWwzrzu6Q2pQSaYsYGah8MtiQ/hog9KEPlYTP60hBv/+utDyYEHSQhL7y5ym08tPX5GzBvwAD/dA==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/utils": "2.8.3",
- "nullthrows": "^1.1.1",
- "terser": "^5.2.0"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/package-manager": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.8.3.tgz",
- "integrity": "sha512-tIpY5pD2lH53p9hpi++GsODy6V3khSTX4pLEGuMpeSYbHthnOViobqIlFLsjni+QA1pfc8NNNIQwSNdGjYflVA==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/fs": "2.8.3",
- "@parcel/logger": "2.8.3",
- "@parcel/types": "2.8.3",
- "@parcel/utils": "2.8.3",
- "@parcel/workers": "2.8.3",
- "semver": "^5.7.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "peerDependencies": {
- "@parcel/core": "^2.8.3"
- }
- },
- "node_modules/@parcel/packager-css": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.8.3.tgz",
- "integrity": "sha512-WyvkMmsurlHG8d8oUVm7S+D+cC/T3qGeqogb7sTI52gB6uiywU7lRCizLNqGFyFGIxcVTVHWnSHqItBcLN76lA==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/utils": "2.8.3",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/packager-html": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.8.3.tgz",
- "integrity": "sha512-OhPu1Hx1RRKJodpiu86ZqL8el2Aa4uhBHF6RAL1Pcrh2EhRRlPf70Sk0tC22zUpYL7es+iNKZ/n0Rl+OWSHWEw==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/types": "2.8.3",
- "@parcel/utils": "2.8.3",
- "nullthrows": "^1.1.1",
- "posthtml": "^0.16.5"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/packager-js": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.8.3.tgz",
- "integrity": "sha512-0pGKC3Ax5vFuxuZCRB+nBucRfFRz4ioie19BbDxYnvBxrd4M3FIu45njf6zbBYsI9eXqaDnL1b3DcZJfYqtIzw==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/hash": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/utils": "2.8.3",
- "globals": "^13.2.0",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/packager-raw": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.8.3.tgz",
- "integrity": "sha512-BA6enNQo1RCnco9MhkxGrjOk59O71IZ9DPKu3lCtqqYEVd823tXff2clDKHK25i6cChmeHu6oB1Rb73hlPqhUA==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/packager-svg": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.8.3.tgz",
- "integrity": "sha512-mvIoHpmv5yzl36OjrklTDFShLUfPFTwrmp1eIwiszGdEBuQaX7JVI3Oo2jbVQgcN4W7J6SENzGQ3Q5hPTW3pMw==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/types": "2.8.3",
- "@parcel/utils": "2.8.3",
- "posthtml": "^0.16.4"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/plugin": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.8.3.tgz",
- "integrity": "sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==",
- "dev": true,
- "dependencies": {
- "@parcel/types": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/reporter-cli": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.8.3.tgz",
- "integrity": "sha512-3sJkS6tFFzgIOz3u3IpD/RsmRxvOKKiQHOTkiiqRt1l44mMDGKS7zANRnJYsQzdCsgwc9SOP30XFgJwtoVlMbw==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/types": "2.8.3",
- "@parcel/utils": "2.8.3",
- "chalk": "^4.1.0",
- "term-size": "^2.2.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/reporter-dev-server": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.8.3.tgz",
- "integrity": "sha512-Y8C8hzgzTd13IoWTj+COYXEyCkXfmVJs3//GDBsH22pbtSFMuzAZd+8J9qsCo0EWpiDow7V9f1LischvEh3FbQ==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/resolver-default": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.8.3.tgz",
- "integrity": "sha512-k0B5M/PJ+3rFbNj4xZSBr6d6HVIe6DH/P3dClLcgBYSXAvElNDfXgtIimbjCyItFkW9/BfcgOVKEEIZOeySH/A==",
- "dev": true,
- "dependencies": {
- "@parcel/node-resolver-core": "2.8.3",
- "@parcel/plugin": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/runtime-browser-hmr": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.8.3.tgz",
- "integrity": "sha512-2O1PYi2j/Q0lTyGNV3JdBYwg4rKo6TEVFlYGdd5wCYU9ZIN9RRuoCnWWH2qCPj3pjIVtBeppYxzfVjPEHINWVg==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/runtime-js": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.8.3.tgz",
- "integrity": "sha512-IRja0vNKwvMtPgIqkBQh0QtRn0XcxNC8HU1jrgWGRckzu10qJWO+5ULgtOeR4pv9krffmMPqywGXw6l/gvJKYQ==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/runtime-react-refresh": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.8.3.tgz",
- "integrity": "sha512-2v/qFKp00MfG0234OdOgQNAo6TLENpFYZMbVbAsPMY9ITiqG73MrEsrGXVoGbYiGTMB/Toer/lSWlJxtacOCuA==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "react-error-overlay": "6.0.9",
- "react-refresh": "^0.9.0"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/runtime-service-worker": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.8.3.tgz",
- "integrity": "sha512-/Skkw+EeRiwzOJso5fQtK8c9b452uWLNhQH1ISTodbmlcyB4YalAiSsyHCtMYD0c3/t5Sx4ZS7vxBAtQd0RvOw==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/source-map": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz",
- "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==",
- "dev": true,
- "dependencies": {
- "detect-libc": "^1.0.3"
- },
- "engines": {
- "node": "^12.18.3 || >=14"
- }
- },
- "node_modules/@parcel/transformer-babel": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.8.3.tgz",
- "integrity": "sha512-L6lExfpvvC7T/g3pxf3CIJRouQl+sgrSzuWQ0fD4PemUDHvHchSP4SNUVnd6gOytF3Y1KpnEZIunQGi5xVqQCQ==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/utils": "2.8.3",
- "browserslist": "^4.6.6",
- "json5": "^2.2.0",
- "nullthrows": "^1.1.1",
- "semver": "^5.7.0"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/transformer-css": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.8.3.tgz",
- "integrity": "sha512-xTqFwlSXtnaYen9ivAgz+xPW7yRl/u4QxtnDyDpz5dr8gSeOpQYRcjkd4RsYzKsWzZcGtB5EofEk8ayUbWKEUg==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/utils": "2.8.3",
- "browserslist": "^4.6.6",
- "lightningcss": "^1.16.1",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/transformer-html": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.8.3.tgz",
- "integrity": "sha512-kIZO3qsMYTbSnSpl9cnZog+SwL517ffWH54JeB410OSAYF1ouf4n5v9qBnALZbuCCmPwJRGs4jUtE452hxwN4g==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/hash": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "nullthrows": "^1.1.1",
- "posthtml": "^0.16.5",
- "posthtml-parser": "^0.10.1",
- "posthtml-render": "^3.0.0",
- "semver": "^5.7.1",
- "srcset": "4"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/transformer-image": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.8.3.tgz",
- "integrity": "sha512-cO4uptcCGTi5H6bvTrAWEFUsTNhA4kCo8BSvRSCHA2sf/4C5tGQPHt3JhdO0GQLPwZRCh/R41EkJs5HZ8A8DAg==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "@parcel/workers": "2.8.3",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "peerDependencies": {
- "@parcel/core": "^2.8.3"
- }
- },
- "node_modules/@parcel/transformer-js": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.8.3.tgz",
- "integrity": "sha512-9Qd6bib+sWRcpovvzvxwy/PdFrLUXGfmSW9XcVVG8pvgXsZPFaNjnNT8stzGQj1pQiougCoxMY4aTM5p1lGHEQ==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/utils": "2.8.3",
- "@parcel/workers": "2.8.3",
- "@swc/helpers": "^0.4.12",
- "browserslist": "^4.6.6",
- "detect-libc": "^1.0.3",
- "nullthrows": "^1.1.1",
- "regenerator-runtime": "^0.13.7",
- "semver": "^5.7.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "peerDependencies": {
- "@parcel/core": "^2.8.3"
- }
- },
- "node_modules/@parcel/transformer-json": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.8.3.tgz",
- "integrity": "sha512-B7LmVq5Q7bZO4ERb6NHtRuUKWGysEeaj9H4zelnyBv+wLgpo4f5FCxSE1/rTNmP9u1qHvQ3scGdK6EdSSokGPg==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "json5": "^2.2.0"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/transformer-postcss": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.8.3.tgz",
- "integrity": "sha512-e8luB/poIlz6jBsD1Izms+6ElbyzuoFVa4lFVLZnTAChI3UxPdt9p/uTsIO46HyBps/Bk8ocvt3J4YF84jzmvg==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/hash": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "clone": "^2.1.1",
- "nullthrows": "^1.1.1",
- "postcss-value-parser": "^4.2.0",
- "semver": "^5.7.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/transformer-posthtml": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.8.3.tgz",
- "integrity": "sha512-pkzf9Smyeaw4uaRLsT41RGrPLT5Aip8ZPcntawAfIo+KivBQUV0erY1IvHYjyfFzq1ld/Fo2Ith9He6mxpPifA==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "nullthrows": "^1.1.1",
- "posthtml": "^0.16.5",
- "posthtml-parser": "^0.10.1",
- "posthtml-render": "^3.0.0",
- "semver": "^5.7.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/transformer-raw": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.8.3.tgz",
- "integrity": "sha512-G+5cXnd2/1O3nV/pgRxVKZY/HcGSseuhAe71gQdSQftb8uJEURyUHoQ9Eh0JUD3MgWh9V+nIKoyFEZdf9T0sUQ==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/transformer-react-refresh-wrap": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.8.3.tgz",
- "integrity": "sha512-q8AAoEvBnCf/nPvgOwFwKZfEl/thwq7c2duxXkhl+tTLDRN2vGmyz4355IxCkavSX+pLWSQ5MexklSEeMkgthg==",
- "dev": true,
- "dependencies": {
- "@parcel/plugin": "2.8.3",
- "@parcel/utils": "2.8.3",
- "react-refresh": "^0.9.0"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/transformer-svg": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.8.3.tgz",
- "integrity": "sha512-3Zr/gBzxi1ZH1fftH/+KsZU7w5GqkmxlB0ZM8ovS5E/Pl1lq1t0xvGJue9m2VuQqP8Mxfpl5qLFmsKlhaZdMIQ==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/hash": "2.8.3",
- "@parcel/plugin": "2.8.3",
- "nullthrows": "^1.1.1",
- "posthtml": "^0.16.5",
- "posthtml-parser": "^0.10.1",
- "posthtml-render": "^3.0.0",
- "semver": "^5.7.1"
- },
- "engines": {
- "node": ">= 12.0.0",
- "parcel": "^2.8.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/types": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.8.3.tgz",
- "integrity": "sha512-FECA1FB7+0UpITKU0D6TgGBpGxYpVSMNEENZbSJxFSajNy3wrko+zwBKQmFOLOiPcEtnGikxNs+jkFWbPlUAtw==",
- "dev": true,
- "dependencies": {
- "@parcel/cache": "2.8.3",
- "@parcel/diagnostic": "2.8.3",
- "@parcel/fs": "2.8.3",
- "@parcel/package-manager": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "@parcel/workers": "2.8.3",
- "utility-types": "^3.10.0"
- }
- },
- "node_modules/@parcel/utils": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.8.3.tgz",
- "integrity": "sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==",
- "dev": true,
- "dependencies": {
- "@parcel/codeframe": "2.8.3",
- "@parcel/diagnostic": "2.8.3",
- "@parcel/hash": "2.8.3",
- "@parcel/logger": "2.8.3",
- "@parcel/markdown-ansi": "2.8.3",
- "@parcel/source-map": "^2.1.1",
- "chalk": "^4.1.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.1.0.tgz",
- "integrity": "sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "is-glob": "^4.0.3",
- "micromatch": "^4.0.5",
- "node-addon-api": "^3.2.1",
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/workers": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.8.3.tgz",
- "integrity": "sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==",
- "dev": true,
- "dependencies": {
- "@parcel/diagnostic": "2.8.3",
- "@parcel/logger": "2.8.3",
- "@parcel/types": "2.8.3",
- "@parcel/utils": "2.8.3",
- "chrome-trace-event": "^1.0.2",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "peerDependencies": {
- "@parcel/core": "^2.8.3"
- }
- },
- "node_modules/@popperjs/core": {
- "version": "2.11.7",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz",
- "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==",
- "peer": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
- "node_modules/@remix-run/router": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz",
- "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@swc/helpers": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz",
- "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==",
- "dev": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@trysound/sax": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
- "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
- "dev": true,
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
- },
- "node_modules/abortcontroller-polyfill": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz",
- "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==",
- "dev": true
- },
- "node_modules/acorn": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
- "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "node_modules/axios": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz",
- "integrity": "sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==",
- "dependencies": {
- "follow-redirects": "^1.15.0",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base-x": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
- "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
- "dev": true
- },
- "node_modules/bootstrap": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz",
- "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/twbs"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/bootstrap"
- }
- ],
- "peerDependencies": {
- "@popperjs/core": "^2.11.6"
- }
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.21.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
- "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001449",
- "electron-to-chromium": "^1.4.284",
- "node-releases": "^2.0.8",
- "update-browserslist-db": "^1.0.10"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001476",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001476.tgz",
- "integrity": "sha512-JmpktFppVSvyUN4gsLS0bShY2L9ZUslHLE72vgemBkS43JD2fOvKTKs+GtRwuxrtRGnwJFW0ye7kWRRlLJS9vQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true,
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
- "dev": true,
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/css-select": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
- "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
- "dev": true,
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^6.0.1",
- "domhandler": "^4.3.1",
- "domutils": "^2.8.0",
- "nth-check": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/css-tree": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
- "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
- "dev": true,
- "dependencies": {
- "mdn-data": "2.0.14",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/css-what": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
- "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/csso": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
- "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
- "dev": true,
- "dependencies": {
- "css-tree": "^1.1.2"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
- "dev": true,
- "bin": {
- "detect-libc": "bin/detect-libc.js"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/dom-serializer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
- "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
- "dev": true,
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.0",
- "entities": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
- },
- "node_modules/dom-serializer/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true,
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ]
- },
- "node_modules/domhandler": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
- "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
- "dev": true,
- "dependencies": {
- "domelementtype": "^2.2.0"
- },
- "engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
- }
- },
- "node_modules/domutils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
- "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
- "dev": true,
- "dependencies": {
- "dom-serializer": "^1.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/dotenv": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz",
- "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/dotenv-expand": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
- "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
- "dev": true
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.356",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz",
- "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==",
- "dev": true
- },
- "node_modules/entities": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
- "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
- "dev": true,
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/font-awesome": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
- "integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==",
- "engines": {
- "node": ">=0.10.3"
- }
- },
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/get-port": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz",
- "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/glob": {
- "version": "9.3.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.4.tgz",
- "integrity": "sha512-qaSc49hojMOv1EPM4EuyITjDSgSKI0rthoHnvE81tcOi1SCVndHko7auqxdQ14eiQG2NDBJBE86+2xIrbIvrbA==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "minimatch": "^8.0.2",
- "minipass": "^4.2.4",
- "path-scurry": "^1.6.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/globals": {
- "version": "13.20.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/htmlnano": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.0.3.tgz",
- "integrity": "sha512-S4PGGj9RbdgW8LhbILNK7W9JhmYP8zmDY7KDV/8eCiJBQJlbmltp5I0gv8c5ntLljfdxxfmJ+UJVSqyH4mb41A==",
- "dev": true,
- "dependencies": {
- "cosmiconfig": "^7.0.1",
- "posthtml": "^0.16.5",
- "timsort": "^0.3.0"
- },
- "peerDependencies": {
- "cssnano": "^5.0.11",
- "postcss": "^8.3.11",
- "purgecss": "^5.0.0",
- "relateurl": "^0.2.7",
- "srcset": "4.0.0",
- "svgo": "^2.8.0",
- "terser": "^5.10.0",
- "uncss": "^0.17.3"
- },
- "peerDependenciesMeta": {
- "cssnano": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "purgecss": {
- "optional": true
- },
- "relateurl": {
- "optional": true
- },
- "srcset": {
- "optional": true
- },
- "svgo": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "uncss": {
- "optional": true
- }
- }
- },
- "node_modules/htmlparser2": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
- "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
- "dev": true,
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.2",
- "domutils": "^2.8.0",
- "entities": "^3.0.1"
- }
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-json": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz",
- "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==",
- "dev": true
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lightningcss": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.19.0.tgz",
- "integrity": "sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==",
- "dev": true,
- "dependencies": {
- "detect-libc": "^1.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-darwin-arm64": "1.19.0",
- "lightningcss-darwin-x64": "1.19.0",
- "lightningcss-linux-arm-gnueabihf": "1.19.0",
- "lightningcss-linux-arm64-gnu": "1.19.0",
- "lightningcss-linux-arm64-musl": "1.19.0",
- "lightningcss-linux-x64-gnu": "1.19.0",
- "lightningcss-linux-x64-musl": "1.19.0",
- "lightningcss-win32-x64-msvc": "1.19.0"
- }
- },
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz",
- "integrity": "sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz",
- "integrity": "sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz",
- "integrity": "sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz",
- "integrity": "sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz",
- "integrity": "sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz",
- "integrity": "sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz",
- "integrity": "sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz",
- "integrity": "sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "node_modules/lmdb": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz",
- "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "msgpackr": "^1.5.4",
- "node-addon-api": "^4.3.0",
- "node-gyp-build-optional-packages": "5.0.3",
- "ordered-binary": "^1.2.4",
- "weak-lru-cache": "^1.2.2"
- },
- "optionalDependencies": {
- "@lmdb/lmdb-darwin-arm64": "2.5.2",
- "@lmdb/lmdb-darwin-x64": "2.5.2",
- "@lmdb/lmdb-linux-arm": "2.5.2",
- "@lmdb/lmdb-linux-arm64": "2.5.2",
- "@lmdb/lmdb-linux-x64": "2.5.2",
- "@lmdb/lmdb-win32-x64": "2.5.2"
- }
- },
- "node_modules/lmdb/node_modules/node-addon-api": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
- "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
- "dev": true
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/mdn-data": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
- "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
- "dev": true
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/minimatch": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.3.tgz",
- "integrity": "sha512-tEEvU9TkZgnFDCtpnrEYnPsjT7iUx42aXfs4bzmQ5sMA09/6hZY0jeZcGkXyDagiBOvkUjNo8Viom+Me6+2x7g==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minipass": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz",
- "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/msgpackr": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.5.tgz",
- "integrity": "sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==",
- "dev": true,
- "optionalDependencies": {
- "msgpackr-extract": "^3.0.1"
- }
- },
- "node_modules/msgpackr-extract": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz",
- "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "dependencies": {
- "node-gyp-build-optional-packages": "5.0.7"
- },
- "bin": {
- "download-msgpackr-prebuilds": "bin/download-prebuilds.js"
- },
- "optionalDependencies": {
- "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2",
- "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2",
- "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2",
- "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2",
- "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2",
- "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2"
- }
- },
- "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz",
- "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==",
- "dev": true,
- "optional": true,
- "bin": {
- "node-gyp-build-optional-packages": "bin.js",
- "node-gyp-build-optional-packages-optional": "optional.js",
- "node-gyp-build-optional-packages-test": "build-test.js"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "optional": true,
- "peer": true,
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/node-addon-api": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
- "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
- "dev": true
- },
- "node_modules/node-gyp-build": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
- "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
- "dev": true,
- "bin": {
- "node-gyp-build": "bin.js",
- "node-gyp-build-optional": "optional.js",
- "node-gyp-build-test": "build-test.js"
- }
- },
- "node_modules/node-gyp-build-optional-packages": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz",
- "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==",
- "dev": true,
- "bin": {
- "node-gyp-build-optional-packages": "bin.js",
- "node-gyp-build-optional-packages-optional": "optional.js",
- "node-gyp-build-optional-packages-test": "build-test.js"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
- "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
- "dev": true
- },
- "node_modules/nth-check": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
- "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
- "dev": true,
- "dependencies": {
- "boolbase": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/fb55/nth-check?sponsor=1"
- }
- },
- "node_modules/nullthrows": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
- "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
- "dev": true
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ordered-binary": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz",
- "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==",
- "dev": true
- },
- "node_modules/parcel": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.8.3.tgz",
- "integrity": "sha512-5rMBpbNE72g6jZvkdR5gS2nyhwIXaJy8i65osOqs/+5b7zgf3eMKgjSsDrv6bhz3gzifsba6MBJiZdBckl+vnA==",
- "dev": true,
- "dependencies": {
- "@parcel/config-default": "2.8.3",
- "@parcel/core": "2.8.3",
- "@parcel/diagnostic": "2.8.3",
- "@parcel/events": "2.8.3",
- "@parcel/fs": "2.8.3",
- "@parcel/logger": "2.8.3",
- "@parcel/package-manager": "2.8.3",
- "@parcel/reporter-cli": "2.8.3",
- "@parcel/reporter-dev-server": "2.8.3",
- "@parcel/utils": "2.8.3",
- "chalk": "^4.1.0",
- "commander": "^7.0.0",
- "get-port": "^4.2.0",
- "v8-compile-cache": "^2.0.0"
- },
- "bin": {
- "parcel": "lib/bin.js"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-scurry": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.3.tgz",
- "integrity": "sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^7.14.1",
- "minipass": "^4.0.2"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.21",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
- "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- }
- ],
- "optional": true,
- "peer": true,
- "dependencies": {
- "nanoid": "^3.3.4",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
- "node_modules/posthtml": {
- "version": "0.16.6",
- "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz",
- "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==",
- "dev": true,
- "dependencies": {
- "posthtml-parser": "^0.11.0",
- "posthtml-render": "^3.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/posthtml-parser": {
- "version": "0.10.2",
- "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz",
- "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==",
- "dev": true,
- "dependencies": {
- "htmlparser2": "^7.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/posthtml-render": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz",
- "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==",
- "dev": true,
- "dependencies": {
- "is-json": "^2.0.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/posthtml/node_modules/posthtml-parser": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz",
- "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==",
- "dev": true,
- "dependencies": {
- "htmlparser2": "^7.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "dev": true,
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "node_modules/react": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
- },
- "peerDependencies": {
- "react": "^18.2.0"
- }
- },
- "node_modules/react-error-overlay": {
- "version": "6.0.9",
- "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz",
- "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==",
- "dev": true
- },
- "node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "node_modules/react-refresh": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz",
- "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-router": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz",
- "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==",
- "dependencies": {
- "@remix-run/router": "1.5.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "react": ">=16.8"
- }
- },
- "node_modules/react-router-dom": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz",
- "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==",
- "dependencies": {
- "@remix-run/router": "1.5.0",
- "react-router": "6.10.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "react": ">=16.8",
- "react-dom": ">=16.8"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
- "dev": true
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/rimraf": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
- "integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
- "dev": true,
- "dependencies": {
- "glob": "^9.2.0"
- },
- "bin": {
- "rimraf": "dist/cjs/src/bin.js"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/scheduler": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- }
- },
- "node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/srcset": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz",
- "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
- "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
- "dev": true
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/svgo": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
- "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
- "dev": true,
- "dependencies": {
- "@trysound/sax": "0.2.0",
- "commander": "^7.2.0",
- "css-select": "^4.1.3",
- "css-tree": "^1.1.3",
- "csso": "^4.2.0",
- "picocolors": "^1.0.0",
- "stable": "^0.1.8"
- },
- "bin": {
- "svgo": "bin/svgo"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/term-size": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
- "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/terser": {
- "version": "5.16.8",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz",
- "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==",
- "dev": true,
- "dependencies": {
- "@jridgewell/source-map": "^0.3.2",
- "acorn": "^8.5.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/timsort": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
- "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
- "dev": true
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/tslib": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
- "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
- "dev": true
- },
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
- "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- }
- ],
- "dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "browserslist-lint": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/utility-types": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz",
- "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true
- },
- "node_modules/weak-lru-cache": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz",
- "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==",
- "dev": true
- },
- "node_modules/xxhash-wasm": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz",
- "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==",
- "dev": true
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- }
- }
-}
diff --git a/front/package.json b/front/package.json
deleted file mode 100644
index 7139740..0000000
--- a/front/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "cinema-react-2",
- "version": "0.1.0",
- "source": "./public/index.html",
- "private": true,
- "dependencies": {
- "@fortawesome/fontawesome-free": "^6.2.1",
- "@fortawesome/free-solid-svg-icons": "^6.2.1",
- "@fortawesome/react-fontawesome": "^0.2.0",
- "axios": "^1.2.1",
- "bootstrap": "^5.2.3",
- "font-awesome": "^4.7.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-router-dom": "^6.4.4"
- },
- "scripts": {
- "start": "parcel --port 3000",
- "build": "npm run clean && parcel build",
- "clean": "rimraf dist"
- },
- "devDependencies": {
- "buffer": "^5.7.1",
- "parcel": "2.8.3",
- "process": "^0.11.10",
- "rimraf": "4.4.0"
- },
- "eslintConfig": {
- "extends": [
- "react-app",
- "react-app/jest"
- ]
- },
- "browserslist": {
- "production": [
- ">0.2%",
- "not dead",
- "not op_mini all"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version"
- ]
- }
-}
diff --git a/front/public/index.html b/front/public/index.html
deleted file mode 100644
index aa0f935..0000000
--- a/front/public/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
- Киносайт
-
-
-
-
-
-
diff --git a/front/src/App.js b/front/src/App.js
deleted file mode 100644
index 5c161f9..0000000
--- a/front/src/App.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import {BrowserRouter, Route, Routes} from 'react-router-dom'
-import Films from './pages/Films'
-import FilmPage from './pages/FilmPage'
-import Header from './pages/components/Header'
-import Footer from './pages/components/Footer'
-import SearchSame from './pages/SearchSame'
-import Registration from './pages/Registration'
-import Sessions from './pages/Sessions'
-import Orders from './pages/Orders'
-import Users from "./pages/Users";
-import PrivateRoutes from "./pages/components/PrivateRoutes";
-
-export default function App() {
- const links = [
- {path: 'films', label: 'Главная', userAccess: 'NONE'},
- {path: 'registration', label: 'Регистрация', userAccess: 'NONE'},
- {path: 'entry', label: 'Вход', userAccess: 'NONE'},
- {path: 'users', label: 'Пользователи', userAccess: 'ADMIN'},
- {path: 'sessions', label: 'Сеансы', userAccess: 'NONE'},
- {path: 'orders', label: 'Заказы', userAccess: 'USER'}
- ];
-
- return (
- <>
-
-
-
- } path='/'/>
- } path='/films'/>
- } path='/films:id'/>
- } path='/search-same/:request'/>
- } path="/registration"/>
- } path="/entry"/>
- } path="/sessions"/>
- }>
- } path="/orders"/>
-
- }>
- } path="/users"/>
-
-
-
-
- >
- );
-}
\ No newline at end of file
diff --git a/front/src/images/banner1.jpg b/front/src/images/banner1.jpg
deleted file mode 100644
index 2028802..0000000
Binary files a/front/src/images/banner1.jpg and /dev/null differ
diff --git a/front/src/images/banner2.jpg b/front/src/images/banner2.jpg
deleted file mode 100644
index d1f1e04..0000000
Binary files a/front/src/images/banner2.jpg and /dev/null differ
diff --git a/front/src/images/banner3.jpg b/front/src/images/banner3.jpg
deleted file mode 100644
index 4b2306e..0000000
Binary files a/front/src/images/banner3.jpg and /dev/null differ
diff --git a/front/src/images/forrest-gamp.jpg b/front/src/images/forrest-gamp.jpg
deleted file mode 100644
index 29b08ed..0000000
Binary files a/front/src/images/forrest-gamp.jpg and /dev/null differ
diff --git a/front/src/images/korol-lev.jpg b/front/src/images/korol-lev.jpg
deleted file mode 100644
index 1b412e4..0000000
Binary files a/front/src/images/korol-lev.jpg and /dev/null differ
diff --git a/front/src/images/odindoma2.jpg b/front/src/images/odindoma2.jpg
deleted file mode 100644
index 1531952..0000000
Binary files a/front/src/images/odindoma2.jpg and /dev/null differ
diff --git a/front/src/images/ostrovproklyatih.jpg b/front/src/images/ostrovproklyatih.jpg
deleted file mode 100644
index 04c1187..0000000
Binary files a/front/src/images/ostrovproklyatih.jpg and /dev/null differ
diff --git a/front/src/images/search.jpg b/front/src/images/search.jpg
deleted file mode 100644
index c0d82e3..0000000
Binary files a/front/src/images/search.jpg and /dev/null differ
diff --git a/front/src/images/search.png b/front/src/images/search.png
deleted file mode 100644
index 44d1c55..0000000
Binary files a/front/src/images/search.png and /dev/null differ
diff --git a/front/src/images/spisok-shindlera.jpg b/front/src/images/spisok-shindlera.jpg
deleted file mode 100644
index 389305d..0000000
Binary files a/front/src/images/spisok-shindlera.jpg and /dev/null differ
diff --git a/front/src/images/taina-coco.jpg b/front/src/images/taina-coco.jpg
deleted file mode 100644
index 3730143..0000000
Binary files a/front/src/images/taina-coco.jpg and /dev/null differ
diff --git a/front/src/images/vk.jpg b/front/src/images/vk.jpg
deleted file mode 100644
index d2e40c9..0000000
Binary files a/front/src/images/vk.jpg and /dev/null differ
diff --git a/front/src/images/zelenayamilya.jpg b/front/src/images/zelenayamilya.jpg
deleted file mode 100644
index 5662340..0000000
Binary files a/front/src/images/zelenayamilya.jpg and /dev/null differ
diff --git a/front/src/index.js b/front/src/index.js
deleted file mode 100644
index 1d4fe2c..0000000
--- a/front/src/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-import ReactDOM from 'react-dom/client'
-import App from './App'
-import 'bootstrap/dist/css/bootstrap.css'
-import './styles/index.css'
-
-const root = ReactDOM.createRoot(document.getElementById('root'));
-root.render(
-
-
-
-);
diff --git a/front/src/pages/FilmPage.jsx b/front/src/pages/FilmPage.jsx
deleted file mode 100644
index 01429d3..0000000
--- a/front/src/pages/FilmPage.jsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import { React, useEffect, useState } from 'react'
-import ContentBlock from './components/ContentBlock'
-import { useParams } from 'react-router-dom'
-import axios from 'axios'
-
-export default function FilmPage() {
- const params = useParams()
- const [items, setItems] = useState({});
-
- useEffect(() => {
- fetch("http://localhost:8080/cinema/" + params.id)
- .then(function (response) {
- return response.json();
- })
- .then(function (data) {
- console.info('Get film success');
- setItems(data);
- })
- .catch(function (error) {
- console.error('Error:', error);
- throw "Can't get film";
- });
- }, []);
-
- const content = (
-
-
-
-
-
О фильме
-
-
Год производства
-
1000
-
-
-
-
-
Длительность
-
189 мин. / 03:09
-
-
-
-
Описание
-
- Пол Эджкомб — начальник блока смертников в тюрьме «Холодная гора», каждыйиз узников которого однажды проходит «зеленую милю» по пути к месту казни. Пол повидал много заключённых
- и надзирателей за время работы. Однако гигант Джон Коффи, обвинённый в страшном преступлении,
- стал одним из самых необычных обитателей блока.
-
-
-
-
-
Трейлер
-
- VIDEO
-
-
-
- );
-
- return (
-
-
-
- )
-}
diff --git a/front/src/pages/Films.jsx b/front/src/pages/Films.jsx
deleted file mode 100644
index ddcef40..0000000
--- a/front/src/pages/Films.jsx
+++ /dev/null
@@ -1,224 +0,0 @@
-import {React, useState, useEffect} from 'react'
-import {useNavigate} from 'react-router-dom'
-import FilmItem from './components/FilmItem'
-import ContentBlock from './components/ContentBlock'
-import ModalEdit from './components/ModalEdit'
-import Banner from './components/Banner'
-import '../styles/banner.css'
-import CinemaDto from './models/CinemaDto'
-import Service from './services/Service'
-
-export default function Films() {
- const navigate = useNavigate();
- const fileReader = new FileReader()
- const [items, setItems] = useState([]);
- const [modalTable, setModalTable] = useState(false);
- const [selectedImage, setSelectedImage] = useState();
- // для инпутов
- const [filmName, setFilmName] = useState('');
-
- const [filmNameEdit, setFilmNameEdit] = useState('');
- // хук для запоминания индекса элемента, вызвавшего модальное окно
- const [currEditItem, setCurrEditItem] = useState(0);
- const getTokenForHeader = function () {
- return "Bearer " + localStorage.getItem("token");
- }
- async function getAll(elem) {
- const requestParams = {
- method: "GET"
- };
- const requestUrl = `http://localhost:8080/${elem}`
- const response = await fetch(requestUrl, requestParams)
- return await response.json()
- }
- // фильмы
- useEffect(() => {
- getAll('cinema')
- .then(data => setItems(data));
- }, []);
-
- async function handleDeleteFilm(id) {
- console.info('Try to remove item');
- const requestParams = {
- method: "DELETE",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- const response = await fetch(`http://localhost:8080/cinema/${id}`, requestParams)
- await response.json()
- .then(() => {
- setItems(items.filter(elem => elem.id !== id))
- console.log("Removed")
- });
- }
-
- async function handleEditFilm(id) {
- console.info(`Start edit script`);
- const requestParams = {
- method: "GET",
- headers: {
- "Authorization": getTokenForHeader(),
- }
- };
- const requestUrl = `http://localhost:8080/cinema/${id}`
- const response = await fetch(requestUrl, requestParams)
- return await response.json()
- .then(function (data) {
- setFilmNameEdit(data.name);
- setCurrEditItem(data.id);
- setModalTable(true)
- console.info('End edit script');
- })
- };
-
- // принимаем событие от кнопки "добавить"
- const handleSubmitCreate = async (e) => {
- e.preventDefault(); // страница перестает перезагружаться
- const itemObject = new CinemaDto(selectedImage, filmName);
- console.info('Try to add item');
- const requestParams = {
- method: "POST",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- },
- body: JSON.stringify(itemObject)
- };
- await fetch(`http://localhost:8080/cinema`, requestParams)
- .then((response) => response.json())
- .then((data) => {
- setItems([...items, data]);
-
- setFilmName('');
- console.info('Added');
- })
- .catch(function (error) {
- console.error('Error:', error);
- throw "Can't add item";
- });
- };
- // принимаем событие от кнопки "сохранить изменения"
- const handleSubmitEdit = async (e, id) => {
- console.info('Start synchronize edit');
- e.preventDefault(); // страница перестает перезагружаться
- const itemObject = new CinemaDto(selectedImage, filmNameEdit, id);
-
- const requestParams = {
- method: "PUT",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- },
- body: JSON.stringify(itemObject)
- };
- const requestUrl = `http://localhost:8080/cinema/${id}`
- const response = await fetch(requestUrl, requestParams)
- await response.json()
- .then((data) => {
- setItems(
- items.map(item =>
- item.id === id ? {
- ...item,
- image: data.image,
- name: data.name,
- } : item)
- )
- console.info('End synchronize edit');
- setModalTable(false)
- })
- .catch((error) => {
- console.error('Error:', error);
- });
-
- };
-
- fileReader.onloadend = () => (
- setSelectedImage(fileReader.result)
- )
-
- function changePicture(e) {
- e.preventDefault();
- const file = e.target.files[0]
- fileReader.readAsDataURL(file)
- }
-
- const Content = (
-
- {(localStorage.getItem("role") === 'ADMIN') &&
-
}
-
-
-
- {items.map((item) =>
- navigate(`/films/${index}`)}
- />
- )}
-
-
- {(localStorage.getItem("role") === 'ADMIN') &&
-
- }
-
-
- );
-
- return (
-
-
-
-
- )
-}
diff --git a/front/src/pages/Orders.jsx b/front/src/pages/Orders.jsx
deleted file mode 100644
index 024d198..0000000
--- a/front/src/pages/Orders.jsx
+++ /dev/null
@@ -1,249 +0,0 @@
-import {useEffect, useState} from 'react'
-import ContentBlock from './components/ContentBlock'
-import Service from './services/Service';
-import ModalEdit from './components/ModalEdit';
-import OrderItem from './components/OrderItem';
-import OrderSessionItem from './components/OrderSessionItem';
-
-export default function Orders() {
- const [users, setUsers] = useState([]);
- const [modalTable, setModalTable] = useState(false);
- // хук для запоминания индекса элемента, вызвавшего модальное окно
- const [currEditItem, setCurrEditItem] = useState(0);
- // для выпадающих значений
- const [customerName, setCustomerName] = useState('');
- const [sessionName, setSessionName] = useState('');
- const [count, setCount] = useState(1);
- const [session, setSession] = useState([]);
- const [orderSessions, setOrderSessions] = useState([]);
-
- useEffect(() => {
- const user = localStorage.getItem('user')
- setCustomerName(user)
- getAll('session').then((data) => setSession(data))
- getAll(`customer?login=${user}`).then((data) => setUsers(data.orders))
- }, [])
- const getTokenForHeader = function () {
- return "Bearer " + localStorage.getItem("token");
- }
-
- async function getAll(elem) {
- const requestParams = {
- method: "GET",
- headers: {
- "Authorization": getTokenForHeader(),
- }
- };
- const requestUrl = `http://localhost:8080/${elem}`
- const response = await fetch(requestUrl, requestParams)
- return await response.json()
- }
-
- function handleSubmit(e) {
- e.preventDefault();
- handleSubmitCreate(e)
- console.log('Form submit')
- }
-
- // принимаем событие от кнопки "добавить"
- const handleSubmitCreate = async (e) => {
- e.preventDefault()
- console.info('Try to add item');
-
- const requestParams = {
- method: "POST",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- await fetch(`http://localhost:8080/order/${customerName}`, requestParams)
- .then(() => {
- getAll(`customer?login=${customerName}`).then((data) => setUsers(data.orders))
- })
- .catch(function (error) {
- console.error('Error:', error);
- throw "Can't add order";
- });
- };
-
- function handleEdit(id) {
- console.info(`Start edit script`);
- getAll(`order/${id}`)
- .then(function (data) {
- setCurrEditItem(data.id);
- setOrderSessions(data.sessions)
- setModalTable(true)
- console.info('End edit script');
- })
- }
-
- const handleSubmitAdd = async (e, id) => {
- console.info('Start add session');
- e.preventDefault(); // страница перестает перезагружаться
- const requestParams = {
- method: "PUT",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- const requestUrl = `http://localhost:8080/order/${id}?session=${sessionName}&count=${count}`
- const response = await fetch(requestUrl, requestParams)
- await response.json()
- .then((data) => {
- setOrderSessions(data.sessions)
- console.info('End add session');
- })
- .catch((error) => {
- console.error('Error:', error);
- alert('Не хватает билетов на сеанс')
- });
- };
-
- const handleSubmitDelete = async (e, id) => {
- console.info('Start delete session');
- e.preventDefault(); // страница перестает перезагружаться
- const requestParams = {
- method: "PUT",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- const requestUrl = `http://localhost:8080/order/${id}?session=${sessionName}&count=-${count}`
- const response = await fetch(requestUrl, requestParams)
- await response.json()
- .then((data) => {
- console.info('End delete session')
- setOrderSessions(data.sessions)
- })
- .catch((error) => {
- console.error('Error:', error);
- });
- };
-
- async function handleDelete(id) {
- console.info('Try to remove item');
- const requestParams = {
- method: "DELETE",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- const response = await fetch(`http://localhost:8080/order/${id}`, requestParams)
- await response.json()
- .then(() => {
- setUsers(users.filter(elem => elem.id !== id))
- console.log("Removed")
- });
- }
-
- async function handleDeleteOrderSession(e, id, sessionId) {
- console.info('Start delete session');
- const requestParams = {
- method: "PUT",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- const requestUrl = `http://localhost:8080/order/${id}?session=${sessionId}`
- const response = await fetch(requestUrl, requestParams)
- await response.json()
- .then((data) => {
- console.info('End delete session')
- setOrderSessions(data.sessions)
- })
- .catch((error) => {
- console.error('Error:', error);
- });
- }
-
- const Content = (
- <>
-
-
-
-
- #
- Customer
- DateOfPurchase
-
-
-
-
- {users.map((user) => (
-
- ))}
-
-
-
-
-
- >
- )
-
- return (
-
- )
-}
diff --git a/front/src/pages/Registration.jsx b/front/src/pages/Registration.jsx
deleted file mode 100644
index 60628dc..0000000
--- a/front/src/pages/Registration.jsx
+++ /dev/null
@@ -1,118 +0,0 @@
-import {useState, useEffect} from 'react'
-import ContentBlock from './components/ContentBlock'
-import {useNavigate} from "react-router-dom";
-
-export default function Registration() {
- const hostURL = "http://localhost:8080";
- const navigate = useNavigate();
- const [login, setLogin] = useState('');
- const [password, setPassword] = useState('');
- const [passwordConfirm, setPasswordConfirm] = useState('');
- const [error, setError] = useState(false);
-
- useEffect(() => {
- setError(false)
- }, [])
-
- function handleSubmit(e) {
- e.preventDefault();
- if (login.length <= 0 || password.length <= 0 ||
- window.location.pathname === '/registration' && passwordConfirm.length <= 0) {
- setError(true)
- throw 'Form not submit'
- }
- handleSubmitCreate(e)
- console.log('Form submit')
- setError(false)
- setLogin('')
- setPassword('')
- setPasswordConfirm('')
- }
-
- // принимаем событие от кнопки "добавить"
- const handleSubmitCreate = async (e) => {
- e.preventDefault()
- console.info('Try to signup/login');
- let requestURL = "/jwt/login"
- let requestData = JSON.stringify({login: login, password: password})
- if (window.location.pathname === '/registration') {
- requestURL = "/signup"
- requestData = JSON.stringify({login: login, password: password, passwordConfirm: passwordConfirm})
- }
- const requestParams = {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: requestData,
- };
- const response = await fetch(hostURL + requestURL, requestParams);
- const result = await response.text();
- if (response.status === 200 && window.location.pathname === '/entry') {
- localStorage.setItem("token", result);
- localStorage.setItem("user", login);
- getRole(result);
- } else {
- localStorage.removeItem("token");
- localStorage.removeItem("user");
- localStorage.removeItem("role");
- }
- alert(result);
- };
-
- async function getRole(token) {
- // вызываем поиск пользователя по токену
- const requestParams = {
- method: "GET",
- headers: {
- "Content-Type": "application/json",
- },
- };
- const response = await fetch(hostURL + `/get-role?token=${token}`, requestParams);
- const result = await response.text();
- localStorage.setItem("role", result);
- // вызвали событие
- window.dispatchEvent(new Event("storage"));
- navigate('/orders')
- navigate('/orders')
- }
-
- const Content = (
- <>
-
- >
- )
-
- return (
-
- )
-}
diff --git a/front/src/pages/SearchSame.jsx b/front/src/pages/SearchSame.jsx
deleted file mode 100644
index ee75e1d..0000000
--- a/front/src/pages/SearchSame.jsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { React, useState, useEffect } from 'react'
-import FilmItem from './components/FilmItem'
-import { useParams, useNavigate } from "react-router-dom";
-import ContentBlock from './components/ContentBlock';
-
-export default function SearchSame() {
- const navigate = useNavigate();
- // массив полученных фильмов
- const [searchResult, setSearchResult] = useState([]);
- const params = useParams()
- const [items, setItems] = useState([])
-
- useEffect(() => {
- let temp = JSON.stringify(searchResult);
- temp = JSON.parse(temp);
- setItems(temp);
- }, [searchResult, params]);
-
- useEffect(() => {
- const fetchData = async () => {
- const url = new URL(`http://localhost:8080/cinema/search?request=${params.request}`)
- try {
- const response = await fetch(url.href);
- const json = await response.json();
- setSearchResult(json);
- console.info('Search success');
- } catch (error) {
- return;
- }
- };
- fetchData();
- }, [])
-
- const Content = (
-
-
- {items.map((item) =>
- navigate(`/films/${index}`)}
- />
- )}
-
-
- )
-
- return (
-
-
-
- )
-}
diff --git a/front/src/pages/Sessions.jsx b/front/src/pages/Sessions.jsx
deleted file mode 100644
index e505816..0000000
--- a/front/src/pages/Sessions.jsx
+++ /dev/null
@@ -1,230 +0,0 @@
-import {React, useState, useEffect} from 'react'
-import ContentBlock from './components/ContentBlock'
-import Service from './services/Service';
-import ModalEdit from './components/ModalEdit';
-import SessionItem from './components/SessionItem';
-import CinemaDto from './models/CinemaDto'
-
-export default function Sessions() {
- const [price, setPrice] = useState(1);
- const [timestamp, setTimestamp] = useState(new Date());
- const [maxCount, setMaxCount] = useState(1);
- const [priceEdit, setPriceEdit] = useState('');
- const [users, setUsers] = useState([]);
- const [error, setError] = useState(false);
- const [modalTable, setModalTable] = useState(false);
- // хук для запоминания индекса элемента, вызвавшего модальное окно
- const [currEditItem, setCurrEditItem] = useState(0);
- // для выпадающих значений
- const [cinemaName, setCinemaName] = useState('');
- const [cinema, setCinema] = useState([]);
- const getTokenForHeader = function () {
- return "Bearer " + localStorage.getItem("token");
- }
- useEffect(() => {
- setError(false)
- getAll('cinema').then((data) => setCinema(data))
- getAll('session').then((data) => setUsers(data))
- }, [])
-
- async function getAll(elem) {
- const requestParams = {
- method: "GET"
- };
- const requestUrl = `http://localhost:8080/${elem}`
- const response = await fetch(requestUrl, requestParams)
- return await response.json()
- }
-
- function handleSubmit(e) {
- e.preventDefault();
- if (price.length <= 0 || cinema.length <= 0) {
- setError(true)
- throw 'Form not submit'
- }
- handleSubmitCreate(e)
- console.log('Form submit')
- setError(false)
- setPrice('')
- setCinema('')
- }
-
- // принимаем событие от кнопки "добавить"
- const handleSubmitCreate = async (e) => {
- e.preventDefault()
- console.info('Try to add item');
- const requestParams = {
- method: "POST",
- headers: {
- "Content-Type": "application/json"
- }
- };
- await fetch(`http://localhost:8080/session?price=${price}×tamp=${timestamp}&cinemaid=${cinemaName}&capacity=${maxCount}`, requestParams)
- .then(() => {
- getAll('session').then((data) => setUsers(data))
- getAll('cinema').then((data) => setCinema(data))
- })
- .catch(function (error) {
- console.error('Error:', error);
- throw "Can't add session";
- });
- };
-
- async function handleEdit(id) {
- console.info(`Start edit script`);
- const requestParams = {
- method: "GET",
- headers: {
- "Authorization": getTokenForHeader(),
- }
- };
- const requestUrl = `http://localhost:8080/session/${id}`
- const response = await fetch(requestUrl, requestParams)
- return await response.json()
- .then(function (data) {
- setPriceEdit(data.price);
- setCurrEditItem(data.id);
- setModalTable(true)
- console.info('End edit script');
- })
- }
-
- const handleSubmitEdit = async (e, id) => {
- console.info('Start synchronize edit');
- e.preventDefault(); // страница перестает перезагружаться
- const requestParams = {
- method: "PUT",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- const requestUrl = `http://localhost:8080/session/${id}?price=${priceEdit}`
- const response = await fetch(requestUrl, requestParams)
- await response.json()
- .then((data) => {
- setUsers(
- users.map(item =>
- item.id === id ? {
- ...item,
- price: data.price
- } : item)
- )
- console.info('End synchronize edit');
- setModalTable(false)
- })
- .catch((error) => {
- console.error('Error:', error);
- });
- };
-
- async function handleDelete(id) {
- console.info('Try to remove item');
- const requestParams = {
- method: "DELETE",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- const response = await fetch(`session/${id}`, requestParams)
- await response.json()
- .then(() => {
- setUsers(users.filter(elem => elem.id !== id))
- console.log("Removed")
- })
- .catch((error) => {
- console.error('Error:', error);
- });
- }
-
- const Content = (
- <>
- {(localStorage.getItem("role") === 'ADMIN') &&
- }
-
-
-
- #
- Price
- Cinema
- Timestamp
- Capacity
- MaxCount
-
-
-
-
- {users.map((user) => (
-
- ))}
-
-
- {(localStorage.getItem("role") === 'ADMIN') &&
-
- }
- >
- )
-
- return (
-
- )
-}
diff --git a/front/src/pages/Users.jsx b/front/src/pages/Users.jsx
deleted file mode 100644
index a858b07..0000000
--- a/front/src/pages/Users.jsx
+++ /dev/null
@@ -1,181 +0,0 @@
-import {useState, useEffect} from 'react'
-import ContentBlock from './components/ContentBlock'
-import ModalEdit from './components/ModalEdit';
-import UserItem from './components/UserItem';
-import axios from "axios";
-
-export default function Users() {
- const [loginEdit, setLoginEdit] = useState('');
- const [passwordEdit, setPasswordEdit] = useState('');
- const [users, setUsers] = useState([]);
- const [modalTable, setModalTable] = useState(false);
- // хук для запоминания индекса элемента, вызвавшего модальное окно
- const [currEditItem, setCurrEditItem] = useState(0);
-
- const [pageNumbers, setPageNumbers] = useState([]);
- const [currPage, setCurrPage] = useState(1);
- const url = 'http://localhost:8080/api/1.0/customer'
-
- useEffect(() => {
- axios
- .get(`${url}?page=${currPage}`, {
- headers:{
- "Authorization": "Bearer " + localStorage.getItem("token")
- }
- })
- .then((response) => {
- setUsers(response.data.content)
- setPageNumbers(response.data.totalPages);
- })
- .catch((error) => {
- console.error(error);
- });
- }, [currPage, pageNumbers]);
- const getTokenForHeader = function () {
- return "Bearer " + localStorage.getItem("token");
- }
-
- async function handleEdit(id) {
- console.info(`Start edit script`);
- const requestParams = {
- method: "GET",
- headers: {
- "Authorization": getTokenForHeader(),
- }
- };
- const requestUrl = `customer/${id}`
- const response = await fetch(requestUrl, requestParams)
- return await response.json()
- .then(function (data) {
- setLoginEdit(data.login);
- setPasswordEdit(data.password);
- setCurrEditItem(data.id);
- setModalTable(true)
- console.info('End edit script');
- })
- }
-
- const handleSubmitEdit = async (e, id) => {
- console.info('Start synchronize edit');
- e.preventDefault(); // страница перестает перезагружаться
- const requestParams = {
- method: "PUT",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- },
- body: JSON.stringify({login: loginEdit, password: passwordEdit})
- };
- const requestUrl = `http://localhost:8080/customer/${id}`
- const response = await fetch(requestUrl, requestParams)
- const temp = await response.json()
- .then((data) => {
- setUsers(
- users.map(item =>
- item.id === id ? {
- ...item,
- login: data.login,
- password: data.password
- } : item)
- )
- console.info('End synchronize edit');
- setModalTable(false)
- })
- .catch((error) => {
- console.error('Error:', error);
- });
- };
-
- async function handleDelete(id) {
- console.info('Try to remove item');
- const requestParams = {
- method: "DELETE",
- headers: {
- "Authorization": getTokenForHeader(),
- "Content-Type": "application/json"
- }
- };
- const response = await fetch(`customer/${id}`, requestParams)
- await response.json()
- .then(() => {
- setUsers(users.filter(elem => elem.id !== id))
- console.log("Removed")
- })
- .catch((error) => {
- console.error('Error:', error);
- });
- }
-
- const pageOnClick = function (page) {
- setCurrPage(page);
- }
-
- const renderPageNumbers = () => {
- const pageNumbersRender = [];
- for (let i = 0; i < pageNumbers; i++) {
- pageNumbersRender.push(
- pageOnClick(i+1)}>
- {i+1}
-
- );
- }
- return pageNumbersRender;
- };
-
- const Content = (
- <>
-
-
-
- #
- Login
- Password
-
-
-
-
- {users.map((user) => (
-
- ))}
-
-
-
- Страницы:
- {renderPageNumbers()}
-
-
-
-
- >
- )
-
- return (
-
- )
-}
diff --git a/front/src/pages/components/Banner.jsx b/front/src/pages/components/Banner.jsx
deleted file mode 100644
index 19c2e06..0000000
--- a/front/src/pages/components/Banner.jsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { React, useEffect, useState } from 'react'
-import { useNavigate } from 'react-router-dom'
-import banner1 from '../../images/banner1.jpg'
-import banner2 from '../../images/banner2.jpg'
-import banner3 from '../../images/banner3.jpg'
-
-export default function Banner() {
- const length = 3;
- var old = 0;
- var current = 1;
- const navigate = useNavigate();
- const [bannerState, setBannerState] = useState(['show', 'hide', 'hide']);
-
- useEffect(() => {
- const timer = window.setInterval(() => {
- setBannerState([...bannerState, bannerState[current] = 'show', bannerState[old] = 'hide']);
-
- console.info('Banner changed');
-
- old = current;
- current++;
-
- if (current === length) {
- current = 0;
- }
- }, 5000)
-
- return () => {
- window.clearInterval(timer);
- }
- }, [])
-
- return (
-
- )
-}
\ No newline at end of file
diff --git a/front/src/pages/components/ContentBlock.jsx b/front/src/pages/components/ContentBlock.jsx
deleted file mode 100644
index 63209c2..0000000
--- a/front/src/pages/components/ContentBlock.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import React from 'react'
-import '../../styles/styleBlock.css'
-
-export default function ContentBlock(props) {
-
- return (
-
-
-
{props.title}
-
- {props.valueBlock}
-
- )
-
-}
diff --git a/front/src/pages/components/FilmItem.jsx b/front/src/pages/components/FilmItem.jsx
deleted file mode 100644
index 9d9f685..0000000
--- a/front/src/pages/components/FilmItem.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from "react"
-import '../../styles/styleFilmItem.css'
-import MyButton from './MyButton'
-
-export default function FilmItem(props) {
- return (
-
-
-
-
-
-
-
- )
-}
\ No newline at end of file
diff --git a/front/src/pages/components/Footer.jsx b/front/src/pages/components/Footer.jsx
deleted file mode 100644
index 5c5acbd..0000000
--- a/front/src/pages/components/Footer.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import React from 'react'
-import vk from '../../images/vk.jpg'
-import '../../styles/styleFooter.css'
-
-export default function Footer() {
- return (
- 2022 г.
-
-
- )
-}
diff --git a/front/src/pages/components/Header.jsx b/front/src/pages/components/Header.jsx
deleted file mode 100644
index 842d2f1..0000000
--- a/front/src/pages/components/Header.jsx
+++ /dev/null
@@ -1,132 +0,0 @@
-import {useEffect, useState} from 'react'
-import {useNavigate, Link} from 'react-router-dom'
-import '../../styles/styleHeader.css'
-import searchImage from '../../images/search.jpg'
-
-export default function Header(props) {
- const navigate = useNavigate();
- const [searchName, setSearchName] = useState('');
- const [userRole, setUserRole] = useState('');
-
- useEffect(() => {
- console.log('im here')
- window.addEventListener("storage", () => {
- const token = localStorage.getItem("token");
- const user = localStorage.getItem("user");
- if (token) {
- getRole(token)
- .then((role) => {
- if (localStorage.getItem("role") !== role) {
- localStorage.removeItem("token");
- localStorage.removeItem("user");
- localStorage.removeItem("role");
- // вызвали событие
- window.dispatchEvent(new Event("storage"));
- navigate("/entry");
- }
- });
- }
- if (!token || !user) {
- localStorage.removeItem("token");
- localStorage.removeItem("user");
- localStorage.removeItem("role");
- navigate("/entry");
- }
- getUserRole();
- });
- getUserRole();
- }, [])
-
- async function getRole(token) {
- // вызываем поиск пользователя по токену
- const requestParams = {
- method: "GET",
- headers: {
- "Content-Type": "application/json"
- }
- };
- const response = await fetch(`http://localhost:8080/get-role?token=${token}`, requestParams);
- return await response.text();
- }
-
- const getUserRole = function () {
- const role = localStorage.getItem("role") || "";
- setUserRole(role);
- }
-
- const validate = function (userAccess) {
- if (userAccess === 'NONE')
- return true;
- return userAccess === 'USER' && userRole !== '' || userAccess === userRole;
- }
-
- function handleSubmit(e) {
- console.info('Try to search data');
- e.preventDefault();
- navigate(`/search-same/${searchName}`)
- setSearchName('');
- }
-
- const handleSubmitLogout = function () {
- localStorage.removeItem("token");
- localStorage.removeItem("user");
- localStorage.removeItem("role");
- // вызвали событие
- window.dispatchEvent(new Event("storage"));
- }
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
- {
- props.links.map((route) => (
-
- {
- validate(route.userAccess) &&
-
- {route.label}
-
- }
-
- ))
- }
- {
- (userRole !== '') &&
-
-
- Выход
-
-
- }
-
-
-
-
-
-
-
-
- )
-}
diff --git a/front/src/pages/components/ModalEdit.jsx b/front/src/pages/components/ModalEdit.jsx
deleted file mode 100644
index 1f6f897..0000000
--- a/front/src/pages/components/ModalEdit.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react'
-import * as classes from "../../styles/ModalEdit.module.css"
-
-export default function ModalEdit({children, visible, setVisible}) {
-
- const rootClasses = [classes.myModal]
- if (visible) {
- rootClasses.push(classes.active);
- }
- //onClick={()=>setVisible(false)}
- return (
-
- )
-}
diff --git a/front/src/pages/components/MyButton.jsx b/front/src/pages/components/MyButton.jsx
deleted file mode 100644
index 6b1ffdb..0000000
--- a/front/src/pages/components/MyButton.jsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from "react"
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faEdit } from "@fortawesome/free-solid-svg-icons"
-import { faRemove } from "@fortawesome/free-solid-svg-icons"
-
-export default function MyButton({ value }) {
-
- const delButton = (
- value.removeFunc(value.item.id)} type="button" className="m-1 btn btn-danger">
-
-
- )
-
- const editButton = (
- value.editFunc(value.item.id)} type="button" className="m-1 btn btn-primary">
-
-
- )
-
- return (
-
- {value.editFunc ? editButton : null}
- {value.removeFunc ? delButton : null}
-
- )
-}
\ No newline at end of file
diff --git a/front/src/pages/components/OrderItem.jsx b/front/src/pages/components/OrderItem.jsx
deleted file mode 100644
index 273715a..0000000
--- a/front/src/pages/components/OrderItem.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from "react"
-import MyButton from './MyButton'
-
-export default function OrderItem(props) {
- return (
-
- {props.item.id}
- {props.item.customer}
- {props.item.dateOfPurchase}
-
-
- )
-}
\ No newline at end of file
diff --git a/front/src/pages/components/OrderSessionItem.jsx b/front/src/pages/components/OrderSessionItem.jsx
deleted file mode 100644
index a283d93..0000000
--- a/front/src/pages/components/OrderSessionItem.jsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import React from "react"
-import MyButton from "./MyButton";
-
-export default function OrderSessionItem(props) {
- return (
- <>
-
- {props.item.session.id}
- {props.item.session.price}
- {props.item.session.cinema.name}
- {new Date(props.item.session.timestamp).toLocaleString('RU-ru')}
- {props.item.count}
-
-
- >
- )
-}
\ No newline at end of file
diff --git a/front/src/pages/components/PrivateRoutes.jsx b/front/src/pages/components/PrivateRoutes.jsx
deleted file mode 100644
index bace9f3..0000000
--- a/front/src/pages/components/PrivateRoutes.jsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import {Navigate, Outlet} from 'react-router-dom';
-
-const PrivateRoutes = (props) => {
- const userRole = localStorage.getItem("role");
-
- function validate() {
- if ((props.userAccess === "USER" && userRole) || (props.userAccess === userRole)) {
- return true;
- }
- return false;
- }
-
- return validate() ? : ;
-}
-
-export default PrivateRoutes;
diff --git a/front/src/pages/components/SessionItem.jsx b/front/src/pages/components/SessionItem.jsx
deleted file mode 100644
index 4d865da..0000000
--- a/front/src/pages/components/SessionItem.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useEffect, useState } from "react"
-import MyButton from './MyButton'
-
-export default function SessionItem(props) {
- const date = new Date(props.item.timestamp).toLocaleString('RU-ru')
-
- return (
-
- {props.item.id}
- {props.item.price}
- {props.item.cinema.name}
- {date}
- {props.item.maxCount - props.item.capacity}
- {props.item.maxCount}
-
-
- )
-}
\ No newline at end of file
diff --git a/front/src/pages/components/UserItem.jsx b/front/src/pages/components/UserItem.jsx
deleted file mode 100644
index effcd70..0000000
--- a/front/src/pages/components/UserItem.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from "react"
-import MyButton from './MyButton'
-
-export default function UserItem(props) {
- return (
-
- {props.item.id}
- {props.item.login}
- {props.item.password}
-
-
- )
-}
\ No newline at end of file
diff --git a/front/src/pages/models/CinemaDto.js b/front/src/pages/models/CinemaDto.js
deleted file mode 100644
index e9aafe9..0000000
--- a/front/src/pages/models/CinemaDto.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export default class CinemaDto {
- constructor(image, name, id) {
- this.image = image;
- this.name = name;
- this.id = parseInt(id);
- }
- static createFrom(item) {
- return new CinemaDto(item.image, item.name, item.id);
- }
-}
\ No newline at end of file
diff --git a/front/src/pages/models/CustomerDto.js b/front/src/pages/models/CustomerDto.js
deleted file mode 100644
index 61ff30e..0000000
--- a/front/src/pages/models/CustomerDto.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export default class CustomerDto {
- constructor(login, password, id) {
- this.login = login;
- this.password = password;
- this.id = parseInt(id);
- }
- static createFrom(item) {
- return new CustomerDto(item.login, item.password, item.id);
- }
-}
\ No newline at end of file
diff --git a/front/src/pages/services/Service.jsx b/front/src/pages/services/Service.jsx
deleted file mode 100644
index 43fd77d..0000000
--- a/front/src/pages/services/Service.jsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import axios from 'axios'
-
-function toJSON(data) {
- const jsonObj = {};
- const fields = Object.getOwnPropertyNames(data);
- for (const field of fields) {
- if (data[field] === undefined) {
- continue;
- }
- jsonObj[field] = data[field];
- }
- return jsonObj;
-}
-
-export default class Service {
- static dataUrlPrefix = 'http://localhost:8080/';
-
- static async readAll(url) {
- const response = await axios.get(this.dataUrlPrefix + url);
- return response.data;
- }
-
- static async read(url) {
- const response = await axios.get(this.dataUrlPrefix + url);
- return response.data;
- }
-
- static async create(url, data) {
- const response = await axios.post(this.dataUrlPrefix + url, toJSON(data));
- return response.data;
- }
-
- static async update(url, data) {
- const response = await axios.put(this.dataUrlPrefix + url, toJSON(data));
- return response.data;
- }
-
- static async delete(url) {
- const response = await axios.delete(this.dataUrlPrefix + url);
- return response.data.id ? response.data.id : response.error;
- }
-}
\ No newline at end of file
diff --git a/front/src/styles/ModalEdit.module.css b/front/src/styles/ModalEdit.module.css
deleted file mode 100644
index 40b00b4..0000000
--- a/front/src/styles/ModalEdit.module.css
+++ /dev/null
@@ -1,22 +0,0 @@
-.myModal {
- position: fixed;
- top: 0;
- bottom: 0;
- right: 0;
- left: 0;
- display: none;
- background: rgba(0,0,0, 0.5);
-}
-
-.myModalContent {
- padding: 25px;
- background: white;
- border-radius: 16px;
- max-width: 600px;
-}
-
-.myModal.active {
- display: flex;
- justify-content: center;
- align-items: center;
-}
\ No newline at end of file
diff --git a/front/src/styles/banner.css b/front/src/styles/banner.css
deleted file mode 100644
index 081c540..0000000
--- a/front/src/styles/banner.css
+++ /dev/null
@@ -1,23 +0,0 @@
-#banner {
- margin: 15px;
-}
-
-@keyframes newAnim {
- from { opacity: 0; }
- to { opacity: 1; }
-}
-
-#banner img {
- max-width: 90%;
- border-radius: 5px;
- animation: newAnim 1s forwards;
-}
-
-#banner a.show {
- text-align: center;
- display: block;
-}
-
-#banner a.hide {
- display: none;
-}
\ No newline at end of file
diff --git a/front/src/styles/index.css b/front/src/styles/index.css
deleted file mode 100644
index 9c8f04b..0000000
--- a/front/src/styles/index.css
+++ /dev/null
@@ -1,83 +0,0 @@
-html,
-body {
- background: #2b2d33;
-}
-.green-mark {
- background-color: #38a65d;
-}
-.willSee {
- background-color: #38a65d;
-}
-.delete {
- background-color: #e94049;
-}
-.icon {
- width: 50px;
- height: 50px;
-}
-hr {
- height: 2px; /* Толщина линии */
-}
-.description {
- color: #8f9398;
-}
-.editIcon {
- height: 2.5vh;
-}
-.posterChoiceToTaste {
- width: 290px;
- height: 437px;
-}
-.posterFilmPage{
- width: 290px;
- height: 437px;
-}
-a {
- text-decoration: none;
-}
-a:hover {
- text-decoration: underline;
-}
-/* for film-page */
-.table {
- color: #8f9398;
-}
-/* main */
-@media screen and (max-width: 290px) {
- .posterItem {
- display: none !important;
- }
- .fs-1 {
- margin-left: 1em !important;
- }
-}
-/* willsee */
-@media screen and (max-width: 290px) {
- .posterItem {
- display: none !important;
- }
- .fs-1 {
- font-size: medium !important;
- margin-left: 1em !important;
- }
-}
-/* choicetotaste */
-@media screen and (max-width: 250px) {
- .fs-2 {
- font-size: medium !important;
- }
- .fs-1 {
- font-size: large !important;
- }
-}
-.pagination li {
- color: white;
- float: left;
- padding: 5px 5px;
- text-decoration: none;
-}
-.pagination li.active {
- background-color: gray;
- color: white;
- border-radius: 2px;
-}
\ No newline at end of file
diff --git a/front/src/styles/styleBlock.css b/front/src/styles/styleBlock.css
deleted file mode 100644
index 749ae5c..0000000
--- a/front/src/styles/styleBlock.css
+++ /dev/null
@@ -1,14 +0,0 @@
-html,
-body {
- background: #2b2d33;
-}
-
-.content {
- min-height: calc(100vh - 25.1vh);
- background: #40444d;
-}
-
-.content_header {
- margin: -1.5em -1.5em 0em -1.5em;
- background-color: #8f9297;
-}
\ No newline at end of file
diff --git a/front/src/styles/styleFilmItem.css b/front/src/styles/styleFilmItem.css
deleted file mode 100644
index 435eef3..0000000
--- a/front/src/styles/styleFilmItem.css
+++ /dev/null
@@ -1,13 +0,0 @@
-.posterItem {
- width: 90px;
- height: 90px;
- margin-top: -10px;
-}
-
-form input {
- max-width: 300px;
-}
-
-table tbody tr td {
- border: 0px !important;
-}
\ No newline at end of file
diff --git a/front/src/styles/styleFooter.css b/front/src/styles/styleFooter.css
deleted file mode 100644
index 9c164c3..0000000
--- a/front/src/styles/styleFooter.css
+++ /dev/null
@@ -1,9 +0,0 @@
-footer {
- flex: 0 0 auto !important;
- background: #1a1c20;
- color: #c2c2c2;
-}
-
-footer nav {
- color: #c2c2c2;
-}
\ No newline at end of file
diff --git a/front/src/styles/styleHeader.css b/front/src/styles/styleHeader.css
deleted file mode 100644
index 0b37854..0000000
--- a/front/src/styles/styleHeader.css
+++ /dev/null
@@ -1,15 +0,0 @@
-header {
- background: #1a1c20;
-}
-
-header a {
- color: #c2c2c2;
-}
-
-header a:hover {
- color: #ffffff;
-}
-
-.mainInput {
- max-width: 200px;
-}
\ No newline at end of file
diff --git a/src/main/java/com/labwork1/app/configuration/SecurityConfiguration.java b/src/main/java/com/labwork1/app/configuration/SecurityConfiguration.java
index da8aff3..4bb1482 100644
--- a/src/main/java/com/labwork1/app/configuration/SecurityConfiguration.java
+++ b/src/main/java/com/labwork1/app/configuration/SecurityConfiguration.java
@@ -1,9 +1,9 @@
package com.labwork1.app.configuration;
import com.labwork1.app.configuration.jwt.JwtFilter;
-import com.labwork1.app.student.controller.CustomerController;
+import com.labwork1.app.student.controller.UserController;
import com.labwork1.app.student.model.UserRole;
-import com.labwork1.app.student.service.CustomerService;
+import com.labwork1.app.student.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
@@ -22,10 +22,10 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
public class SecurityConfiguration {
private final Logger log = LoggerFactory.getLogger(SecurityConfiguration.class);
public static final String SPA_URL_MASK = "/{path:[^\\.]*}";
- private final CustomerService userService;
+ private final UserService userService;
private final JwtFilter jwtFilter;
- public SecurityConfiguration(CustomerService userService) {
+ public SecurityConfiguration(UserService userService) {
this.userService = userService;
this.jwtFilter = new JwtFilter(userService);
createAdminOnStartup();
@@ -49,9 +49,9 @@ public class SecurityConfiguration {
.and()
.authorizeHttpRequests()
.requestMatchers("/", SPA_URL_MASK).permitAll()
- .requestMatchers(HttpMethod.POST, CustomerController.URL_LOGIN).permitAll()
- .requestMatchers(HttpMethod.POST, CustomerController.URL_SIGNUP).permitAll()
- .requestMatchers(HttpMethod.POST, CustomerController.URL_GET_ROLE).permitAll()
+ .requestMatchers(HttpMethod.POST, UserController.URL_LOGIN).permitAll()
+ .requestMatchers(HttpMethod.POST, UserController.URL_SIGNUP).permitAll()
+ .requestMatchers(HttpMethod.POST, UserController.URL_GET_ROLE).permitAll()
.anyRequest()
.authenticated()
.and()
@@ -82,6 +82,6 @@ public class SecurityConfiguration {
.requestMatchers("/webjars/**")
.requestMatchers("/swagger-resources/**")
.requestMatchers("/v3/api-docs/**")
- .requestMatchers("/h2-console");
+ .requestMatchers("/h2-console/**");
}
}
diff --git a/src/main/java/com/labwork1/app/configuration/jwt/JwtFilter.java b/src/main/java/com/labwork1/app/configuration/jwt/JwtFilter.java
index 26c94ce..c18bdbf 100644
--- a/src/main/java/com/labwork1/app/configuration/jwt/JwtFilter.java
+++ b/src/main/java/com/labwork1/app/configuration/jwt/JwtFilter.java
@@ -1,7 +1,7 @@
package com.labwork1.app.configuration.jwt;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.labwork1.app.student.service.CustomerService;
+import com.labwork1.app.student.service.UserService;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
@@ -20,9 +20,9 @@ public class JwtFilter extends GenericFilterBean {
private static final String AUTHORIZATION = "Authorization";
public static final String TOKEN_BEGIN_STR = "Bearer ";
- private final CustomerService userService;
+ private final UserService userService;
- public JwtFilter(CustomerService userService) {
+ public JwtFilter(UserService userService) {
this.userService = userService;
}
diff --git a/src/main/java/com/labwork1/app/student/controller/CinemaDto.java b/src/main/java/com/labwork1/app/student/controller/CinemaDto.java
index 115bdf7..d4f8061 100644
--- a/src/main/java/com/labwork1/app/student/controller/CinemaDto.java
+++ b/src/main/java/com/labwork1/app/student/controller/CinemaDto.java
@@ -1,13 +1,21 @@
package com.labwork1.app.student.controller;
import com.labwork1.app.student.model.Cinema;
+import jakarta.persistence.Column;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
import java.nio.charset.StandardCharsets;
public class CinemaDto {
private long id;
+ @NotBlank
private String name;
private String image;
+ @NotBlank
+ private String description;
+ @NotNull
+ private Long year;
public CinemaDto() {
}
@@ -15,9 +23,19 @@ public class CinemaDto {
public CinemaDto(Cinema cinema) {
this.id = cinema.getId();
this.name = cinema.getName();
+ this.description = cinema.getDescription();
+ this.year = cinema.getYear();
this.image = new String(cinema.getImage(), StandardCharsets.UTF_8);
}
+ public String getDescription() {
+ return description;
+ }
+
+ public Long getYear() {
+ return year;
+ }
+
public String getImage() {
return image;
}
diff --git a/src/main/java/com/labwork1/app/student/controller/CustomerController.java b/src/main/java/com/labwork1/app/student/controller/CustomerController.java
deleted file mode 100644
index a5b5bb5..0000000
--- a/src/main/java/com/labwork1/app/student/controller/CustomerController.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.labwork1.app.student.controller;
-
-import com.labwork1.app.configuration.OpenAPI30Configuration;
-import com.labwork1.app.student.model.Customer;
-import com.labwork1.app.student.model.UserRole;
-import com.labwork1.app.student.service.CustomerService;
-import com.labwork1.app.util.validation.ValidationException;
-import jakarta.validation.Valid;
-import org.apache.commons.lang3.tuple.Pair;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.security.access.annotation.Secured;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.stream.IntStream;
-
-@RestController
-public class CustomerController {
- private final CustomerService customerService;
- public static final String URL_LOGIN = "/jwt/login";
- public static final String URL_SIGNUP = "/signup";
- public static final String URL_MAIN = "/customer";
- public static final String URL_GET_ROLE = "/get-role";
- public CustomerController(CustomerService customerService) {
- this.customerService = customerService;
- }
-
- @PostMapping(URL_LOGIN)
- public String login(@RequestBody @Valid CustomerDto userDto) {
- return customerService.loginAndGetToken(userDto);
- }
-
- @PostMapping(URL_SIGNUP)
- public String signup(@RequestBody @Valid UserSignupDto userSignupDto){
- try {
- Customer user = customerService.addCustomer(userSignupDto.getLogin(), userSignupDto.getPassword(), userSignupDto.getPasswordConfirm());
- return user.getLogin() + " was created";
- }
- catch(ValidationException e){
- return e.getMessage();
- }
- }
-
- @GetMapping(URL_MAIN + "/{id}")
- public CustomerDto getCustomer(@PathVariable Long id) {
- return new CustomerDto(customerService.findCustomer(id));
- }
-
- @GetMapping(URL_MAIN)
- public CustomerDto getCustomerByLogin(@RequestParam("login") String login) {
- return new CustomerDto(customerService.findByLogin(login));
- }
-
- @GetMapping(URL_GET_ROLE)
- public String getRole(@RequestParam("token") String token) {
- UserDetails userDetails = customerService.loadUserByToken(token);
- Customer user = customerService.findByLogin(userDetails.getUsername());
- return user.getRole().toString();
- }
-
- @GetMapping(OpenAPI30Configuration.API_PREFIX + URL_MAIN)
- @Secured({UserRole.AsString.ADMIN})
- public Page getCustomers(@RequestParam(defaultValue = "1") int page,
- @RequestParam(defaultValue = "5") int size) {
- /*final Page users = customerService.findAllPages(page, size)
- .map(CustomerDto::new);
- final int totalPages = users.getTotalPages();
- final List pageNumbers = IntStream.rangeClosed(1, totalPages)
- .boxed()
- .toList();
- return Pair.of(users, pageNumbers);*/
- final Page users = customerService.findAllPages(page, size)
- .map(CustomerDto::new);
- return users;
- }
-
- @PutMapping(URL_MAIN + "/{id}")
- @Secured({UserRole.AsString.ADMIN})
- public CustomerDto updateCustomer(@PathVariable Long id,
- @RequestBody @Valid CustomerDto userDto) {
- return new CustomerDto(customerService.updateCustomer(id, userDto.getLogin(), userDto.getPassword()));
- }
-
- @DeleteMapping(URL_MAIN + "/{id}")
- public CustomerDto deleteCustomer(@PathVariable Long id) {
- return new CustomerDto(customerService.deleteCustomer(id));
- }
-}
diff --git a/src/main/java/com/labwork1/app/student/controller/CustomerDto.java b/src/main/java/com/labwork1/app/student/controller/CustomerDto.java
deleted file mode 100644
index 388d81b..0000000
--- a/src/main/java/com/labwork1/app/student/controller/CustomerDto.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.labwork1.app.student.controller;
-
-import com.labwork1.app.student.model.Customer;
-import com.labwork1.app.student.model.Order;
-import com.labwork1.app.student.model.OrderSession;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class CustomerDto {
- private long id;
- private String login;
- private String password;
- private List orders;
-
- public CustomerDto() {
- }
-
- public CustomerDto(Customer customer) {
- this.id = customer.getId();
- this.login = customer.getLogin();
- this.password = customer.getPassword();
- this.orders = new ArrayList<>();
- if (customer.getOrders() != null) {
- orders = customer.getOrders().stream()
- .map(OrderDto::new).toList();
- }
- }
-
- public long getId() {
- return id;
- }
-
- public String getLogin() {
- return login;
- }
-
- public String getPassword() {
- return password;
- }
-
- public List getOrders() {
- return orders;
- }
-}
diff --git a/src/main/java/com/labwork1/app/student/controller/OrderController.java b/src/main/java/com/labwork1/app/student/controller/OrderController.java
index fe7282f..a0ac3dd 100644
--- a/src/main/java/com/labwork1/app/student/controller/OrderController.java
+++ b/src/main/java/com/labwork1/app/student/controller/OrderController.java
@@ -26,9 +26,9 @@ public class OrderController {
.toList();
}
- @PostMapping("/{customer}")
- public OrderDto createOrder(@PathVariable String customer) {
- return new OrderDto(orderService.addOrder(customer));
+ @PostMapping("/{user}")
+ public OrderDto createOrder(@PathVariable String user) {
+ return new OrderDto(orderService.addOrder(user));
}
@PutMapping("/{id}")
diff --git a/src/main/java/com/labwork1/app/student/controller/OrderDto.java b/src/main/java/com/labwork1/app/student/controller/OrderDto.java
index 775fae0..388cfad 100644
--- a/src/main/java/com/labwork1/app/student/controller/OrderDto.java
+++ b/src/main/java/com/labwork1/app/student/controller/OrderDto.java
@@ -1,6 +1,6 @@
package com.labwork1.app.student.controller;
-import com.labwork1.app.student.model.Customer;
+import com.labwork1.app.student.model.User;
import com.labwork1.app.student.model.Order;
import com.labwork1.app.student.model.OrderSession;
@@ -9,8 +9,7 @@ import java.util.List;
public class OrderDto {
private long id;
- private Date dateOfPurchase;
- private String customer;
+ private String user;
private List sessions;
public OrderDto() {
@@ -18,8 +17,7 @@ public class OrderDto {
public OrderDto(Order order) {
this.id = order.getId();
- this.dateOfPurchase = order.getDateOfPurchase();
- this.customer = order.getCustomer().getLogin();
+ this.user = order.getUser().getLogin();
if (order.getSessions() != null && order.getSessions().size() > 0)
this.sessions = order.getSessions()
.stream()
@@ -31,12 +29,8 @@ public class OrderDto {
return id;
}
- public Date getDateOfPurchase() {
- return dateOfPurchase;
- }
-
- public String getCustomer() {
- return customer;
+ public String getUser() {
+ return user;
}
public List getSessions() {
diff --git a/src/main/java/com/labwork1/app/student/controller/SessionController.java b/src/main/java/com/labwork1/app/student/controller/SessionController.java
index 19aba8f..f556d54 100644
--- a/src/main/java/com/labwork1/app/student/controller/SessionController.java
+++ b/src/main/java/com/labwork1/app/student/controller/SessionController.java
@@ -1,7 +1,5 @@
package com.labwork1.app.student.controller;
-import com.labwork1.app.student.model.Session;
-import com.labwork1.app.student.model.SessionExtension;
import com.labwork1.app.student.model.UserRole;
import com.labwork1.app.student.service.SessionService;
import org.springframework.security.access.annotation.Secured;
@@ -37,15 +35,15 @@ public class SessionController {
@PostMapping
@Secured({UserRole.AsString.ADMIN})
public SessionDto createSession(@RequestParam("price") String price,
- @RequestParam("timestamp") String timestamp,
+ @RequestParam("dateTime") String dateTime,
@RequestParam("cinemaid") Long cinemaId,
@RequestParam("capacity") Integer capacity) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat();
format.applyPattern("yyyy-MM-dd-HH:ss");
- Date docDate = format.parse(timestamp.replace('T', '-'));
+ Date docDate = format.parse(dateTime.replace('T', '-'));
return new SessionDto(sessionService.findSession(
sessionService.addSession(Double.parseDouble(price),
- new Timestamp(docDate.getTime()), cinemaId, capacity).getId()));
+ new Timestamp(docDate.getTime()), cinemaId, capacity).getId()));
}
@PutMapping("/{id}")
diff --git a/src/main/java/com/labwork1/app/student/controller/SessionDto.java b/src/main/java/com/labwork1/app/student/controller/SessionDto.java
index 3a12805..bad2e41 100644
--- a/src/main/java/com/labwork1/app/student/controller/SessionDto.java
+++ b/src/main/java/com/labwork1/app/student/controller/SessionDto.java
@@ -8,7 +8,7 @@ import java.sql.Timestamp;
public class SessionDto {
private long id;
private Double price;
- private Timestamp timestamp;
+ private Timestamp dateTime;
private CinemaDto cinema;
private Long capacity;
@@ -20,7 +20,7 @@ public class SessionDto {
public SessionDto(SessionExtension session) {
this.id = session.getId();
this.price = session.getPrice();
- this.timestamp = session.getTimestamp();
+ this.dateTime = session.getTimestamp();
this.capacity = session.getCapacity();
this.maxCount = session.getMaxCount();
if (session.getCinema() != null) {
@@ -31,7 +31,7 @@ public class SessionDto {
public SessionDto(Session session) {
this.id = session.getId();
this.price = session.getPrice();
- this.timestamp = session.getTimestamp();
+ this.dateTime = session.getTimestamp();
this.maxCount = session.getMaxCount();
if (session.getCinema() != null) {
this.cinema = new CinemaDto(session.getCinema());
@@ -51,7 +51,7 @@ public class SessionDto {
}
public Timestamp getTimestamp() {
- return timestamp;
+ return dateTime;
}
public Long getCapacity() {
diff --git a/src/main/java/com/labwork1/app/student/controller/UserController.java b/src/main/java/com/labwork1/app/student/controller/UserController.java
new file mode 100644
index 0000000..52c8fbd
--- /dev/null
+++ b/src/main/java/com/labwork1/app/student/controller/UserController.java
@@ -0,0 +1,88 @@
+package com.labwork1.app.student.controller;
+
+import com.labwork1.app.configuration.OpenAPI30Configuration;
+import com.labwork1.app.student.model.User;
+import com.labwork1.app.student.model.UserRole;
+import com.labwork1.app.student.service.UserService;
+import com.labwork1.app.util.validation.ValidationException;
+import jakarta.validation.Valid;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.annotation.Secured;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+public class UserController {
+ private final UserService userService;
+ public static final String URL_LOGIN = "/jwt/login";
+ public static final String URL_SIGNUP = "/signup";
+ public static final String URL_MAIN = "/user";
+ public static final String URL_GET_ROLE = "/get-role";
+ public UserController(UserService userService) {
+ this.userService = userService;
+ }
+
+ @PostMapping(URL_LOGIN)
+ public String login(@RequestBody @Valid UserDto userDto) {
+ return userService.loginAndGetToken(userDto);
+ }
+
+ @PostMapping(URL_SIGNUP)
+ public String signup(@RequestBody @Valid UserSignupDto userSignupDto){
+ try {
+ User user = userService.addUser(userSignupDto.getLogin(), userSignupDto.getPassword(), userSignupDto.getPasswordConfirm());
+ return user.getLogin() + " was created";
+ }
+ catch(ValidationException e){
+ return e.getMessage();
+ }
+ }
+
+ @GetMapping(URL_MAIN + "/{id}")
+ public UserDto getUser(@PathVariable Long id) {
+ return new UserDto(userService.findUser(id));
+ }
+
+ @GetMapping(URL_MAIN)
+ public UserDto getUserByLogin(@RequestParam("login") String login) {
+ return new UserDto(userService.findByLogin(login));
+ }
+
+ @GetMapping(URL_GET_ROLE)
+ public String getRole(@RequestParam("token") String token) {
+ UserDetails userDetails = userService.loadUserByToken(token);
+ User user = userService.findByLogin(userDetails.getUsername());
+ return user.getRole().toString();
+ }
+
+ @GetMapping(OpenAPI30Configuration.API_PREFIX + URL_MAIN)
+ @Secured({UserRole.AsString.ADMIN})
+ public Page getUsers(@RequestParam(defaultValue = "1") int page,
+ @RequestParam(defaultValue = "5") int size) {
+ return userService.findAllPages(page, size)
+ .map(UserDto::new);
+ }
+
+ @PutMapping(URL_MAIN + "/{id}")
+ @Secured({UserRole.AsString.ADMIN})
+ public UserDto updateUser(@PathVariable Long id,
+ @RequestBody @Valid UserDto userDto) {
+ return new UserDto(userService.updateUser(id, userDto.getLogin(), userDto.getPassword()));
+ }
+
+ @PutMapping("/{id}")
+ public UserDto updateUserCart(@PathVariable Long id,
+ @RequestParam("session") Long session,
+ @RequestParam(value = "count", required = false) Integer count) {
+ if (count == null)
+ return new UserDto(userService.deleteSessionInCart(id, session, Integer.MAX_VALUE));
+ if (count > 0)
+ return new UserDto(userService.addSession(id, session, count));
+ return new UserDto(userService.deleteSessionInCart(id, session, -count));
+ }
+
+ @DeleteMapping(URL_MAIN + "/{id}")
+ public UserDto deleteUser(@PathVariable Long id) {
+ return new UserDto(userService.deleteUser(id));
+ }
+}
diff --git a/src/main/java/com/labwork1/app/student/controller/UserDto.java b/src/main/java/com/labwork1/app/student/controller/UserDto.java
new file mode 100644
index 0000000..fdbd7a6
--- /dev/null
+++ b/src/main/java/com/labwork1/app/student/controller/UserDto.java
@@ -0,0 +1,53 @@
+package com.labwork1.app.student.controller;
+
+import com.labwork1.app.student.model.User;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class UserDto {
+ private long id;
+ private String login;
+ private String password;
+ private List orders;
+ private List sessions;
+
+ public UserDto() {
+ }
+
+ public UserDto(User user) {
+ this.id = user.getId();
+ this.login = user.getLogin();
+ this.password = user.getPassword();
+ this.orders = new ArrayList<>();
+ if (user.getOrders() != null) {
+ orders = user.getOrders().stream()
+ .map(OrderDto::new).toList();
+ }
+ if (user.getSessions() != null && user.getSessions().size() > 0)
+ this.sessions = user.getSessions()
+ .stream()
+ .map(x -> new UserSessionDto(new SessionDto(x.getSession()),
+ x.getId().getUserId(), x.getCount())).toList();
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getLogin() {
+ return login;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public List getOrders() {
+ return orders;
+ }
+
+ public List getSessions() {
+ return sessions;
+ }
+}
diff --git a/src/main/java/com/labwork1/app/student/controller/UserSessionDto.java b/src/main/java/com/labwork1/app/student/controller/UserSessionDto.java
new file mode 100644
index 0000000..96d51af
--- /dev/null
+++ b/src/main/java/com/labwork1/app/student/controller/UserSessionDto.java
@@ -0,0 +1,28 @@
+package com.labwork1.app.student.controller;
+
+public class UserSessionDto {
+ private SessionDto session;
+ private Long userId;
+ private Integer count;
+
+ public UserSessionDto() {
+ }
+
+ public UserSessionDto(SessionDto session, Long userId, Integer count) {
+ this.session = session;
+ this.userId = userId;
+ this.count = count;
+ }
+
+ public SessionDto getSession() {
+ return session;
+ }
+
+ public Long getUserId() {
+ return userId;
+ }
+
+ public Integer getCount() {
+ return count;
+ }
+}
diff --git a/src/main/java/com/labwork1/app/student/model/Cinema.java b/src/main/java/com/labwork1/app/student/model/Cinema.java
index a6e3ae0..33bee2f 100644
--- a/src/main/java/com/labwork1/app/student/model/Cinema.java
+++ b/src/main/java/com/labwork1/app/student/model/Cinema.java
@@ -3,6 +3,7 @@ package com.labwork1.app.student.model;
import com.labwork1.app.student.controller.CinemaDto;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
@@ -15,6 +16,12 @@ public class Cinema {
@NotBlank(message = "name can't be null or empty")
@Column
private String name;
+ @NotBlank(message = "description can't be null or empty")
+ @Column
+ private String description;
+ @NotNull(message = "year can't be null or empty")
+ @Column(name = "col_year")
+ private Long year;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "cinema", cascade = CascadeType.REMOVE)
private List sessions;
@Lob
@@ -23,13 +30,10 @@ public class Cinema {
public Cinema() {
}
- public Cinema(String name) {
- this.name = name;
- this.sessions = new ArrayList<>();
- }
-
public Cinema(CinemaDto cinemaDto) {
this.name = cinemaDto.getName();
+ this.description = cinemaDto.getDescription();
+ this.year = cinemaDto.getYear();
this.image = cinemaDto.getImage().getBytes();
this.sessions = new ArrayList<>();
}
@@ -52,6 +56,22 @@ public class Cinema {
}
}
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Long getYear() {
+ return year;
+ }
+
+ public void setYear(Long year) {
+ this.year = year;
+ }
+
public Long getId() {
return id;
}
diff --git a/src/main/java/com/labwork1/app/student/model/Order.java b/src/main/java/com/labwork1/app/student/model/Order.java
index 3ed3ab4..1532b8d 100644
--- a/src/main/java/com/labwork1/app/student/model/Order.java
+++ b/src/main/java/com/labwork1/app/student/model/Order.java
@@ -14,12 +14,9 @@ public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
- @NotNull(message = "dateOfPurchase can't be null or empty")
- @Temporal(TemporalType.DATE)
- private Date dateOfPurchase;
@ManyToOne(fetch = FetchType.EAGER)
- @JoinColumn(name = "customer_fk")
- private Customer customer;
+ @JoinColumn(name = "user_fk")
+ private User user;
@OneToMany(mappedBy = "order", fetch = FetchType.EAGER, cascade =
{
CascadeType.REMOVE,
@@ -31,10 +28,6 @@ public class Order {
public Order() {
}
- public Order(Date dateOfPurchase) {
- this.dateOfPurchase = dateOfPurchase;
- }
-
public void addSession(OrderSession orderSession) {
if (sessions == null) {
sessions = new ArrayList<>();
@@ -65,30 +58,21 @@ public class Order {
public String toString() {
return "Order {" +
"id=" + id +
- ", date='" + dateOfPurchase.toString() + '\'' +
- ", customer='" + customer.toString() + '\'';
+ ", user='" + user.toString() + '\'';
}
public Long getId() {
return id;
}
- public Date getDateOfPurchase() {
- return dateOfPurchase;
+ public User getUser() {
+ return user;
}
- public void setDateOfPurchase(Date dateOfPurchase) {
- this.dateOfPurchase = dateOfPurchase;
- }
-
- public Customer getCustomer() {
- return customer;
- }
-
- public void setCustomer(Customer customer) {
- this.customer = customer;
- if (!customer.getOrders().contains(this)) {
- customer.setOrder(this);
+ public void setUser(User user) {
+ this.user = user;
+ if (!user.getOrders().contains(this)) {
+ user.setOrder(this);
}
}
diff --git a/src/main/java/com/labwork1/app/student/model/Session.java b/src/main/java/com/labwork1/app/student/model/Session.java
index 0e2df8c..89f21b2 100644
--- a/src/main/java/com/labwork1/app/student/model/Session.java
+++ b/src/main/java/com/labwork1/app/student/model/Session.java
@@ -15,17 +15,19 @@ public class Session {
protected Long id;
@NotNull(message = "price can't be null or empty")
protected Double price;
- @NotNull(message = "timestamp can't be null or empty")
- @Column
+ @NotNull(message = "dateTime can't be null or empty")
+ @Column(name = "date_time")
@Temporal(TemporalType.TIMESTAMP)
- protected Timestamp timestamp;
+ protected Timestamp dateTime;
@OneToMany(mappedBy = "session", fetch = FetchType.EAGER)
private List orders;
+ @OneToMany(mappedBy = "session", fetch = FetchType.EAGER)
+ private List users;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "cinema_fk")
protected Cinema cinema;
@NotNull(message = "maxCount can't be null or empty")
- @Column
+ @Column(name = "max_count")
protected Integer maxCount;
public Session() {
@@ -35,17 +37,18 @@ public class Session {
return maxCount;
}
- public Session(Double price, Timestamp timestamp, Integer maxCount) {
+ public Session(Double price, Timestamp dateTime, Integer maxCount) {
this.price = price;
- this.timestamp = timestamp;
+ this.dateTime = dateTime;
this.maxCount = maxCount;
}
public Session(Session session) {
this.id = session.getId();
this.price = session.getPrice();
- this.timestamp = session.getTimestamp();
+ this.dateTime = session.getTimestamp();
this.orders = session.getOrders();
+ this.users = session.getUsers();
this.cinema = session.getCinema();
this.maxCount = session.getMaxCount();
}
@@ -73,6 +76,20 @@ public class Session {
this.orders.remove(orderSession);
}
+ public void addUser(UserSession userSession){
+ if (users == null){
+ users = new ArrayList<>();
+ }
+ if (!users.contains(userSession)) {
+ this.users.add(userSession);
+ }
+ }
+
+ public void removeUser(UserSession userSession){
+ if (users.contains(userSession))
+ this.users.remove(userSession);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -91,7 +108,7 @@ public class Session {
return "Session {" +
"id=" + id +
", price='" + price + '\'' +
- ", timestamp='" + timestamp.toString() + '\'' +
+ ", dateTime='" + dateTime.toString() + '\'' +
", maxCount='" + maxCount.toString() + '\'' +
", cinema='" + cinema.toString() + '\'' +
'}';
@@ -122,14 +139,22 @@ public class Session {
}
public Timestamp getTimestamp() {
- return timestamp;
+ return dateTime;
}
- public void setTimestamp(Timestamp timestamp) {
- this.timestamp = timestamp;
+ public void setTimestamp(Timestamp dateTime) {
+ this.dateTime = dateTime;
}
public List getOrders() {
return orders;
}
+
+ public void setUsers(List users) {
+ this.users = users;
+ }
+
+ public List getUsers() {
+ return users;
+ }
}
diff --git a/src/main/java/com/labwork1/app/student/model/Customer.java b/src/main/java/com/labwork1/app/student/model/User.java
similarity index 61%
rename from src/main/java/com/labwork1/app/student/model/Customer.java
rename to src/main/java/com/labwork1/app/student/model/User.java
index 1fc2015..e6044d8 100644
--- a/src/main/java/com/labwork1/app/student/model/Customer.java
+++ b/src/main/java/com/labwork1/app/student/model/User.java
@@ -9,7 +9,8 @@ import java.util.List;
import java.util.Objects;
@Entity
-public class Customer {
+@Table(name = "tab_user")
+public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@@ -21,33 +22,55 @@ public class Customer {
@NotBlank(message = "password can't be null or empty")
@Size(min = 6, max = 64)
private String password;
- @OneToMany(fetch = FetchType.EAGER, mappedBy = "customer", cascade = {CascadeType.MERGE,CascadeType.REMOVE})
+ @OneToMany(fetch = FetchType.EAGER, mappedBy = "user", cascade = {CascadeType.MERGE,CascadeType.REMOVE})
private List orders;
+ @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade =
+ {
+ CascadeType.REMOVE,
+ CascadeType.MERGE,
+ CascadeType.PERSIST
+ }, orphanRemoval = true)
+ private List sessions;
private UserRole role;
- public Customer() {
+ public User() {
}
- public Customer(String login, String password) {
+ public User(String login, String password) {
this.login = login;
this.password = password;
this.orders = new ArrayList<>();
+ this.sessions = new ArrayList<>();
this.role = UserRole.USER;
}
- public Customer(String login, String password, UserRole role) {
+ public User(String login, String password, UserRole role) {
this.login = login;
this.password = password;
this.orders = new ArrayList<>();
+ this.sessions = new ArrayList<>();
this.role = role;
}
+ public void addSession(UserSession userSession) {
+ if (sessions == null) {
+ sessions = new ArrayList<>();
+ }
+ if (!sessions.contains(userSession))
+ this.sessions.add(userSession);
+ }
+
+ public void removeSession(UserSession userSession){
+ if (sessions.contains(userSession))
+ this.sessions.remove(userSession);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
- Customer customer = (Customer) o;
- return Objects.equals(id, customer.id);
+ User user = (User) o;
+ return Objects.equals(id, user.id);
}
@Override
@@ -57,7 +80,7 @@ public class Customer {
@Override
public String toString() {
- return "Customer {" +
+ return "User {" +
"id=" + id +
", login='" + login + '\'' +
", password='" + password + '\'' +
@@ -93,8 +116,12 @@ public class Customer {
}
public void setOrder(Order order) {
- if (order.getCustomer().equals(this)) {
+ if (order.getUser().equals(this)) {
this.orders.add(order);
}
}
+
+ public List getSessions() {
+ return sessions;
+ }
}
diff --git a/src/main/java/com/labwork1/app/student/model/UserSession.java b/src/main/java/com/labwork1/app/student/model/UserSession.java
new file mode 100644
index 0000000..b2ba588
--- /dev/null
+++ b/src/main/java/com/labwork1/app/student/model/UserSession.java
@@ -0,0 +1,62 @@
+package com.labwork1.app.student.model;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "user_session")
+public class UserSession {
+ @EmbeddedId
+ private UserSessionKey id;
+ @ManyToOne
+ @MapsId("sessionId")
+ @JoinColumn(name = "session_id")
+ private Session session;
+ @ManyToOne
+ @MapsId("userId")
+ @JoinColumn(name = "user_id")
+ private User user;
+ @Column(name = "count")
+ private Integer count;
+
+ public UserSession() {
+ }
+
+ public UserSession(User user, Session session, Integer count) {
+ this.user = user;
+ this.session = session;
+ this.count = count;
+ this.id = new UserSessionKey(session.getId(), user.getId());
+ }
+
+ public UserSessionKey getId() {
+ return id;
+ }
+
+ public void setId(UserSessionKey id) {
+ this.id = id;
+ }
+
+ public User getUser() {
+ return user;
+ }
+
+ public void setUser(User user) {
+ this.user = user;
+ }
+
+ public Session getSession() {
+ return session;
+ }
+
+ public void setSession(Session session) {
+ this.session = session;
+ }
+
+ public Integer getCount() {
+ return count;
+ }
+
+ public void setCount(Integer count) {
+ this.count = count;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/labwork1/app/student/model/UserSessionKey.java b/src/main/java/com/labwork1/app/student/model/UserSessionKey.java
new file mode 100644
index 0000000..12f56e0
--- /dev/null
+++ b/src/main/java/com/labwork1/app/student/model/UserSessionKey.java
@@ -0,0 +1,49 @@
+package com.labwork1.app.student.model;
+
+import jakarta.persistence.Embeddable;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+@Embeddable
+public class UserSessionKey implements Serializable {
+ private Long sessionId;
+ private Long userId;
+
+ public UserSessionKey() {
+ }
+
+ public UserSessionKey(Long sessionId, Long userId) {
+ this.sessionId = sessionId;
+ this.userId = userId;
+ }
+
+ public Long getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(Long sessionId) {
+ this.sessionId = sessionId;
+ }
+
+ public Long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Long userId) {
+ this.userId = userId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof UserSessionKey that)) return false;
+ return Objects.equals(getSessionId(), that.getSessionId()) && Objects.equals(getUserId(), that.getUserId());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getSessionId(), getUserId());
+ }
+}
+
diff --git a/src/main/java/com/labwork1/app/student/repository/CustomerRepository.java b/src/main/java/com/labwork1/app/student/repository/CustomerRepository.java
deleted file mode 100644
index 40ce715..0000000
--- a/src/main/java/com/labwork1/app/student/repository/CustomerRepository.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.labwork1.app.student.repository;
-
-import com.labwork1.app.student.model.Customer;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-import java.util.Optional;
-
-public interface CustomerRepository extends JpaRepository {
- Customer findOneByLoginIgnoreCase(String login);
-}
diff --git a/src/main/java/com/labwork1/app/student/repository/UserRepository.java b/src/main/java/com/labwork1/app/student/repository/UserRepository.java
new file mode 100644
index 0000000..ad8a3b8
--- /dev/null
+++ b/src/main/java/com/labwork1/app/student/repository/UserRepository.java
@@ -0,0 +1,14 @@
+package com.labwork1.app.student.repository;
+
+import com.labwork1.app.student.model.OrderSession;
+import com.labwork1.app.student.model.User;
+import com.labwork1.app.student.model.UserSession;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+public interface UserRepository extends JpaRepository {
+ User findOneByLoginIgnoreCase(String login);
+ @Query("Select us from UserSession us where us.user.id = :userId and us.session.id = :sessionId")
+ UserSession getUserSession(@Param("userId") Long userId, @Param("sessionId") Long sessionId);
+}
diff --git a/src/main/java/com/labwork1/app/student/service/CinemaService.java b/src/main/java/com/labwork1/app/student/service/CinemaService.java
index 6b4c936..ba9c819 100644
--- a/src/main/java/com/labwork1/app/student/service/CinemaService.java
+++ b/src/main/java/com/labwork1/app/student/service/CinemaService.java
@@ -27,13 +27,6 @@ public class CinemaService {
return cinemaRepository.save(cinema);
}
- @Transactional
- public Cinema addCinema(String name) {
- final Cinema cinema = new Cinema(name);
- validatorUtil.validate(cinema);
- return cinemaRepository.save(cinema);
- }
-
@Transactional
public Cinema findCinema(Long id) {
final Optional cinema = cinemaRepository.findById(id);
diff --git a/src/main/java/com/labwork1/app/student/service/CustomerNotFoundException.java b/src/main/java/com/labwork1/app/student/service/CustomerNotFoundException.java
deleted file mode 100644
index cedec3e..0000000
--- a/src/main/java/com/labwork1/app/student/service/CustomerNotFoundException.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.labwork1.app.student.service;
-
-public class CustomerNotFoundException extends RuntimeException {
- public CustomerNotFoundException(Long id) {
- super(String.format("Customer with id [%s] is not found", id));
- }
- public CustomerNotFoundException(String login) {
- super(String.format("Customer with login [%s] is not found", login));
- }
-}
diff --git a/src/main/java/com/labwork1/app/student/service/CustomerService.java b/src/main/java/com/labwork1/app/student/service/CustomerService.java
deleted file mode 100644
index f41705a..0000000
--- a/src/main/java/com/labwork1/app/student/service/CustomerService.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.labwork1.app.student.service;
-
-import com.labwork1.app.configuration.jwt.JwtProvider;
-import com.labwork1.app.student.controller.CustomerDto;
-import com.labwork1.app.student.model.Customer;
-import com.labwork1.app.student.model.UserRole;
-import com.labwork1.app.student.repository.CustomerRepository;
-import com.labwork1.app.util.validation.ValidationException;
-import com.labwork1.app.util.validation.ValidatorUtil;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import com.labwork1.app.configuration.jwt.JwtException;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-
-@Service
-public class CustomerService implements UserDetailsService {
- private final CustomerRepository customerRepository;
- private final PasswordEncoder passwordEncoder;
- private final ValidatorUtil validatorUtil;
- private final JwtProvider jwtProvider;
-
- public CustomerService(CustomerRepository customerRepository, PasswordEncoder passwordEncoder, ValidatorUtil validatorUtil, JwtProvider jwtProvider) {
- this.customerRepository = customerRepository;
- this.passwordEncoder = passwordEncoder;
- this.validatorUtil = validatorUtil;
- this.jwtProvider = jwtProvider;
- }
-
- public Page findAllPages(int page, int size) {
- return customerRepository.findAll(PageRequest.of(page - 1, size, Sort.by("id").ascending()));
- }
-
- public Customer findByLogin(String login) {
- return customerRepository.findOneByLoginIgnoreCase(login);
- }
-
- @Transactional
- public Customer addCustomer(String login, String password, String passwordConfirm) {
- return createUser(login, password, passwordConfirm, UserRole.USER);
- }
-
- public Customer createUser(String login, String password, String passwordConfirm, UserRole role) {
- if (findByLogin(login) != null) {
- throw new UserExistsException(login);
- }
- final Customer user = new Customer(login, passwordEncoder.encode(password), role);
- validatorUtil.validate(user);
- if (!Objects.equals(password, passwordConfirm)) {
- throw new ValidationException("Passwords not equals");
- }
- return customerRepository.save(user);
- }
- public String loginAndGetToken(CustomerDto userDto) {
- final Customer user = findByLogin(userDto.getLogin());
- if (user == null) {
- throw new CustomerNotFoundException(userDto.getLogin());
- }
- if (!passwordEncoder.matches(userDto.getPassword(), user.getPassword())) {
- throw new CustomerNotFoundException(user.getLogin());
- }
- return jwtProvider.generateToken(user.getLogin());
- }
-
- public UserDetails loadUserByToken(String token) throws UsernameNotFoundException {
- if (!jwtProvider.isTokenValid(token)) {
- throw new JwtException("Bad token");
- }
- final String userLogin = jwtProvider.getLoginFromToken(token)
- .orElseThrow(() -> new JwtException("Token is not contain Login"));
- return loadUserByUsername(userLogin);
- }
-
- @Override
- public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
- final Customer userEntity = findByLogin(username);
- if (userEntity == null) {
- throw new UsernameNotFoundException(username);
- }
- return new org.springframework.security.core.userdetails.User(
- userEntity.getLogin(), userEntity.getPassword(), Collections.singleton(userEntity.getRole()));
- }
-
- @Transactional(readOnly = true)
- public Customer findCustomer(Long id) {
- final Optional customer = customerRepository.findById(id);
- return customer.orElseThrow(() -> new CustomerNotFoundException(id));
- }
-
- @Transactional(readOnly = true)
- public List findAllCustomers() {
- return customerRepository.findAll();
- }
-
- @Transactional
- public Customer updateCustomer(Long id, String login, String password) {
- final Customer currentCustomer = findCustomer(id);
- currentCustomer.setLogin(login);
- currentCustomer.setPassword(passwordEncoder.encode(password));
- validatorUtil.validate(currentCustomer);
- return customerRepository.save(currentCustomer);
- }
-
- @Transactional
- public Customer deleteCustomer(Long id) {
- final Customer customer = findCustomer(id);
- customerRepository.deleteById(id);
- return customer;
- }
-
- @Transactional
- public void deleteAllCustomers() {
- customerRepository.deleteAll();
- }
-}
diff --git a/src/main/java/com/labwork1/app/student/service/OrderService.java b/src/main/java/com/labwork1/app/student/service/OrderService.java
index 6d2dad6..8410378 100644
--- a/src/main/java/com/labwork1/app/student/service/OrderService.java
+++ b/src/main/java/com/labwork1/app/student/service/OrderService.java
@@ -14,31 +14,31 @@ import java.util.Optional;
@Service
public class OrderService {
private final OrderRepository orderRepository;
- private final CustomerService customerService;
+ private final UserService userService;
private final SessionService sessionService;
private final ValidatorUtil validatorUtil;
- public OrderService(OrderRepository orderRepository, CustomerService customerService, SessionService sessionService, ValidatorUtil validatorUtil) {
+ public OrderService(OrderRepository orderRepository, UserService userService, SessionService sessionService, ValidatorUtil validatorUtil) {
this.orderRepository = orderRepository;
- this.customerService = customerService;
+ this.userService = userService;
this.sessionService = sessionService;
this.validatorUtil = validatorUtil;
}
@Transactional
- public Order addOrder(Long customerId) {
- final Order order = new Order(new Date(System.currentTimeMillis()));
- final Customer customer = customerService.findCustomer(customerId);
- order.setCustomer(customer);
+ public Order addOrder(Long userId) {
+ final Order order = new Order();
+ final User user = userService.findUser(userId);
+ order.setUser(user);
validatorUtil.validate(order);
return orderRepository.save(order);
}
@Transactional
- public Order addOrder(String customerName) {
- final Order order = new Order(new Date(System.currentTimeMillis()));
- final Customer customer = customerService.findByLogin(customerName);
- order.setCustomer(customer);
+ public Order addOrder(String userName) {
+ final Order order = new Order();
+ final User user = userService.findByLogin(userName);
+ order.setUser(user);
validatorUtil.validate(order);
return orderRepository.save(order);
}
diff --git a/src/main/java/com/labwork1/app/student/service/UserNotFoundException.java b/src/main/java/com/labwork1/app/student/service/UserNotFoundException.java
new file mode 100644
index 0000000..cd35a0d
--- /dev/null
+++ b/src/main/java/com/labwork1/app/student/service/UserNotFoundException.java
@@ -0,0 +1,10 @@
+package com.labwork1.app.student.service;
+
+public class UserNotFoundException extends RuntimeException {
+ public UserNotFoundException(Long id) {
+ super(String.format("User with id [%s] is not found", id));
+ }
+ public UserNotFoundException(String login) {
+ super(String.format("User with login [%s] is not found", login));
+ }
+}
diff --git a/src/main/java/com/labwork1/app/student/service/UserService.java b/src/main/java/com/labwork1/app/student/service/UserService.java
new file mode 100644
index 0000000..dbd42a6
--- /dev/null
+++ b/src/main/java/com/labwork1/app/student/service/UserService.java
@@ -0,0 +1,171 @@
+package com.labwork1.app.student.service;
+
+import com.labwork1.app.configuration.jwt.JwtProvider;
+import com.labwork1.app.student.controller.UserDto;
+import com.labwork1.app.student.model.*;
+import com.labwork1.app.student.repository.UserRepository;
+import com.labwork1.app.util.validation.ValidationException;
+import com.labwork1.app.util.validation.ValidatorUtil;
+import jakarta.persistence.EntityNotFoundException;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.labwork1.app.configuration.jwt.JwtException;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+@Service
+public class UserService implements UserDetailsService {
+ private final UserRepository userRepository;
+ private final SessionService sessionService;
+ private final PasswordEncoder passwordEncoder;
+ private final ValidatorUtil validatorUtil;
+ private final JwtProvider jwtProvider;
+
+ public UserService(UserRepository userRepository, SessionService sessionService, PasswordEncoder passwordEncoder, ValidatorUtil validatorUtil, JwtProvider jwtProvider) {
+ this.userRepository = userRepository;
+ this.sessionService = sessionService;
+ this.passwordEncoder = passwordEncoder;
+ this.validatorUtil = validatorUtil;
+ this.jwtProvider = jwtProvider;
+ }
+
+ public Page findAllPages(int page, int size) {
+ return userRepository.findAll(PageRequest.of(page - 1, size, Sort.by("id").ascending()));
+ }
+
+ public User findByLogin(String login) {
+ return userRepository.findOneByLoginIgnoreCase(login);
+ }
+
+ @Transactional
+ public User addUser(String login, String password, String passwordConfirm) {
+ return createUser(login, password, passwordConfirm, UserRole.USER);
+ }
+
+ public User createUser(String login, String password, String passwordConfirm, UserRole role) {
+ if (findByLogin(login) != null) {
+ throw new UserExistsException(login);
+ }
+ final User user = new User(login, passwordEncoder.encode(password), role);
+ validatorUtil.validate(user);
+ if (!Objects.equals(password, passwordConfirm)) {
+ throw new ValidationException("Passwords not equals");
+ }
+ return userRepository.save(user);
+ }
+ public String loginAndGetToken(UserDto userDto) {
+ final User user = findByLogin(userDto.getLogin());
+ if (user == null) {
+ throw new UserNotFoundException(userDto.getLogin());
+ }
+ if (!passwordEncoder.matches(userDto.getPassword(), user.getPassword())) {
+ throw new UserNotFoundException(user.getLogin());
+ }
+ return jwtProvider.generateToken(user.getLogin());
+ }
+
+ public UserDetails loadUserByToken(String token) throws UsernameNotFoundException {
+ if (!jwtProvider.isTokenValid(token)) {
+ throw new JwtException("Bad token");
+ }
+ final String userLogin = jwtProvider.getLoginFromToken(token)
+ .orElseThrow(() -> new JwtException("Token is not contain Login"));
+ return loadUserByUsername(userLogin);
+ }
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ final User userEntity = findByLogin(username);
+ if (userEntity == null) {
+ throw new UsernameNotFoundException(username);
+ }
+ return new org.springframework.security.core.userdetails.User(
+ userEntity.getLogin(), userEntity.getPassword(), Collections.singleton(userEntity.getRole()));
+ }
+
+ @Transactional(readOnly = true)
+ public User findUser(Long id) {
+ final Optional user = userRepository.findById(id);
+ return user.orElseThrow(() -> new UserNotFoundException(id));
+ }
+
+ @Transactional(readOnly = true)
+ public List findAllUsers() {
+ return userRepository.findAll();
+ }
+
+ @Transactional
+ public User updateUser(Long id, String login, String password) {
+ final User currentUser = findUser(id);
+ currentUser.setLogin(login);
+ currentUser.setPassword(passwordEncoder.encode(password));
+ validatorUtil.validate(currentUser);
+ return userRepository.save(currentUser);
+ }
+
+ @Transactional
+ public User addSession(Long id, Long sessionId, Integer count) {
+ final Session currentSession = sessionService.findSession(sessionId);
+ final User currentUser = findUser(id);
+ final UserSession currentUserSession = userRepository.getUserSession(id, sessionId);
+
+ final Integer currentSessionCapacity = currentSession.getMaxCount() - sessionService.getCapacity(sessionId);
+ if (currentSessionCapacity < count ||
+ (currentUserSession != null && currentUserSession.getCount() + count > currentSession.getMaxCount())) {
+ throw new IllegalArgumentException(String.format("No more tickets in session. Capacity: %1$s. Count: %2$s",
+ currentSessionCapacity, count));
+ }
+
+ if (currentUserSession == null) {
+ currentUser.addSession(new UserSession(currentUser, currentSession, count));
+ }
+ else if (currentUserSession.getCount() + count <= currentSession.getMaxCount()) {
+ currentUser.removeSession(currentUserSession);
+ currentUser.addSession(new UserSession(currentUser, currentSession,
+ currentUserSession.getCount() + count));
+ }
+
+ return userRepository.save(currentUser);
+ }
+
+ @Transactional
+ public User deleteSessionInCart(Long id, Long session, Integer count) {
+ final User currentUser = findUser(id);
+ final Session currentSession = sessionService.findSession(session);
+ final UserSession currentUserSession = userRepository.getUserSession(id, session);
+ if (currentUserSession == null)
+ throw new EntityNotFoundException();
+
+ if (count >= currentUserSession.getCount()) {
+ currentUser.removeSession(currentUserSession);
+ }
+ else {
+ currentUser.removeSession(currentUserSession);
+ currentUser.addSession(new UserSession(currentUser, currentSession,
+ currentUserSession.getCount() - count));
+ }
+ return userRepository.save(currentUser);
+ }
+
+ @Transactional
+ public User deleteUser(Long id) {
+ final User user = findUser(id);
+ userRepository.deleteById(id);
+ return user;
+ }
+
+ @Transactional
+ public void deleteAllUsers() {
+ userRepository.deleteAll();
+ }
+}
diff --git a/src/main/java/com/labwork1/app/util/error/AdviceController.java b/src/main/java/com/labwork1/app/util/error/AdviceController.java
index 278aac6..5d7bf7b 100644
--- a/src/main/java/com/labwork1/app/util/error/AdviceController.java
+++ b/src/main/java/com/labwork1/app/util/error/AdviceController.java
@@ -1,7 +1,7 @@
package com.labwork1.app.util.error;
import com.labwork1.app.student.service.CinemaNotFoundException;
-import com.labwork1.app.student.service.CustomerNotFoundException;
+import com.labwork1.app.student.service.UserNotFoundException;
import com.labwork1.app.student.service.OrderNotFoundException;
import com.labwork1.app.student.service.SessionNotFoundException;
import com.labwork1.app.util.validation.ValidationException;
@@ -17,7 +17,7 @@ import java.util.stream.Collectors;
@ControllerAdvice
public class AdviceController {
@ExceptionHandler({
- CustomerNotFoundException.class,
+ UserNotFoundException.class,
OrderNotFoundException.class,
SessionNotFoundException.class,
CinemaNotFoundException.class,
diff --git a/src/test/java/com/labwork1/app/JpaCustomerTests.java b/src/test/java/com/labwork1/app/JpaCustomerTests.java
index 27454bf..9953a9f 100644
--- a/src/test/java/com/labwork1/app/JpaCustomerTests.java
+++ b/src/test/java/com/labwork1/app/JpaCustomerTests.java
@@ -13,10 +13,10 @@
//import java.util.List;
//
//@SpringBootTest
-//public class JpaCustomerTests {
-// private static final Logger log = LoggerFactory.getLogger(JpaCustomerTests.class);
+//public class JpaUserTests {
+// private static final Logger log = LoggerFactory.getLogger(JpaUserTests.class);
// @Autowired
-// private CustomerService customerService;
+// private UserService userService;
// @Autowired
// private SessionService sessionService;
// @Autowired
@@ -29,7 +29,7 @@
// sessionService.deleteAllSessions();
// cinemaService.deleteAllCinemas();
// orderService.deleteAllOrders();
-// customerService.deleteAllCustomers();
+// userService.deleteAllUsers();
// // 2 кино
// final Cinema cinema1 = cinemaService.addCinema("Меню");
// final Cinema cinema2 = cinemaService.addCinema("Аватар");
@@ -44,26 +44,26 @@
// Assertions.assertEquals(cinemaService
// .findCinema(cinema1.getId()).getSessions().size(), 2);
// // 1 покупатель
-// final Customer customer1 = customerService.addCustomer("Родион", "Иванов");
-// customerService.updateCustomer(customer1.getId(), "Пчел", "Пчелов");
-// Assertions.assertEquals(customerService.findCustomer(customer1.getId()).getLogin(), "Пчел");
+// final User user1 = userService.addUser("Родион", "Иванов");
+// userService.updateUser(user1.getId(), "Пчел", "Пчелов");
+// Assertions.assertEquals(userService.findUser(user1.getId()).getLogin(), "Пчел");
// // 1 заказ, 1 копия заказа
-// final Order order0 = orderService.addOrder(customerService.findCustomer(customer1.getId()).getId());
+// final Order order0 = orderService.addOrder(userService.findUser(user1.getId()).getId());
// final Order order1 = orderService.findOrder(order0.getId());
// Assertions.assertEquals(order0, order1);
//
// // у клиента точно есть заказ?
-// Assertions.assertEquals(customerService
-// .findCustomer(customer1.getId()).getOrders().size(), 1);
+// Assertions.assertEquals(userService
+// .findUser(user1.getId()).getOrders().size(), 1);
// // 0 заказов
// orderService.deleteAllOrders();
// Assertions.assertThrows(OrderNotFoundException.class, () -> orderService.findOrder(-1L));
// // 2 покупателя
-// final Customer customer2 = customerService.addCustomer("Иннокентий", "Иванов");
+// final User user2 = userService.addUser("Иннокентий", "Иванов");
//
// // 1 заказ
// final Order order2 = orderService
-// .addOrder(customerService.findCustomer(customer2.getId()).getId());
+// .addOrder(userService.findUser(user2.getId()).getId());
// // у заказа 2 сеанса
// orderService.addSession(order2.getId(), session1.getId(), 2);
//
@@ -104,16 +104,16 @@
//
// // создали 3 заказ у 2 покупателя
// final Order order3 = orderService
-// .addOrder(customerService.findCustomer(customer2.getId()).getId());
+// .addOrder(userService.findUser(user2.getId()).getId());
// orderService.addSession(order3.getId(), session2.getId(), 2);
// orderService.addSession(order3.getId(), session3.getId(), 8);
// orderService.addSession(order3.getId(), session1.getId(), 8);
// // 2-ой покупатель удален
// // 0 заказов после его удаления
// Assertions.assertEquals(sessionService.getCapacity(session2.getId()), 2);
-// customerService.deleteCustomer(customer2.getId());
+// userService.deleteUser(user2.getId());
//
-// Assertions.assertThrows(CustomerNotFoundException.class, () -> customerService.findCustomer(customer2.getId()));
+// Assertions.assertThrows(UserNotFoundException.class, () -> userService.findUser(user2.getId()));
// Assertions.assertThrows(OrderNotFoundException.class, () -> orderService.findOrder(order3.getId()));
// Assertions.assertEquals(orderService.findAllOrders().size(), 0);
// Assertions.assertEquals(sessionService.getCapacity(session2.getId()), 0);