feat: Dockerfile multistage
This commit is contained in:
		
							parent
							
								
									0fd3efe332
								
							
						
					
					
						commit
						1703be6a0e
					
				
					 8 changed files with 662 additions and 9 deletions
				
			
		
							
								
								
									
										8
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | ||||||
|  | node_modules | ||||||
|  | npm-debug.log | ||||||
|  | Dockerfile | ||||||
|  | .dockerignore | ||||||
|  | .git | ||||||
|  | .gitignore | ||||||
|  | build | ||||||
|  | assets | ||||||
|  | @ -21,6 +21,6 @@ steps: | ||||||
|       - /var/run/docker.sock:/var/run/docker.sock |       - /var/run/docker.sock:/var/run/docker.sock | ||||||
|     commands: |     commands: | ||||||
|       - docker login forgejo.transprot.eu -u $DOCKER_USERNAME -p $DOCKER_PASSWORD |       - docker login forgejo.transprot.eu -u $DOCKER_USERNAME -p $DOCKER_PASSWORD | ||||||
|       - docker build -t 'forgejo.transprot.eu/public/react-simple:${CI_PIPELINE_NUMBER}' -t 'forgejo.transprot.eu/public/react-simple:latest' . |       - docker build -t 'forgejo.transprot.eu/public/react-multistage:${CI_PIPELINE_NUMBER}' -t 'forgejo.transprot.eu/public/react-multistage:latest' . | ||||||
|       - docker push forgejo.transprot.eu/public/react-simple:${CI_PIPELINE_NUMBER} |       - docker push forgejo.transprot.eu/public/react-multistage:${CI_PIPELINE_NUMBER} | ||||||
|       - docker push forgejo.transprot.eu/public/react-simple:latest |       - docker push forgejo.transprot.eu/public/react-multistage:latest | ||||||
							
								
								
									
										15
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								Dockerfile
									
									
									
									
									
								
							|  | @ -1,5 +1,14 @@ | ||||||
| FROM node:18 | # Build stage of the application | ||||||
| COPY . . | FROM node:18 AS build | ||||||
|  | WORKDIR /app | ||||||
|  | COPY package*.json ./ | ||||||
| RUN npm install | RUN npm install | ||||||
|  | COPY . . | ||||||
|  | RUN npm run build | ||||||
|  | 
 | ||||||
|  | # Production stage to run the application | ||||||
|  | FROM node:18 AS production | ||||||
|  | COPY --from=build /app/build /prod | ||||||
|  | RUN npm install --global serve | ||||||
| EXPOSE 3000 | EXPOSE 3000 | ||||||
| CMD ["npm", "start"] | CMD ["serve", "prod/"] | ||||||
							
								
								
									
										108
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								README.md
									
									
									
									
									
								
							|  | @ -36,6 +36,59 @@ docker image ls | from ssv | where repository starts-with 'react' | ||||||
| Here's the result of running this command that shows how shamefully big the image is: | Here's the result of running this command that shows how shamefully big the image is: | ||||||
|  |  | ||||||
| 
 | 
 | ||||||
|  | ### First optimisation: using a .dockerignore file and multi-stage build | ||||||
|  | 
 | ||||||
|  | The first optimization that we can do is using a `.dockerignore` file. Just like a `.gitignore` file, a `.dockerignore` file allows us to exclude file and folders that we don't want to include in the docker image that we are building. | ||||||
|  | 
 | ||||||
|  | Here's the `.dockerignore` file that I added to this simple project to mainly exclude the dark hole that node_modules are `node_modules`: | ||||||
|  | ``` | ||||||
|  | node_modules | ||||||
|  | npm-debug.log | ||||||
|  | Dockerfile | ||||||
|  | .dockerignore | ||||||
|  | .git | ||||||
|  | .gitignore | ||||||
|  | build | ||||||
|  | assets | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | In our context, this command only optimizes the build time and not the build size, as the `309 MB` that the node_modules folder occupies are not needed to build the docker imagen but as we run the `npm install` command in any case inside the Dockerfile, this folder is generated and included from inside the Dockerfile. | ||||||
|  | 
 | ||||||
|  | A better optimisation of the image is to use multi-stage build. Multi-stage builds allows us to include only what is necessary to run the image, and to not include the build files or node_modules for example. | ||||||
|  | 
 | ||||||
|  | Here's the new version of the `Dockerfile` using multi-stage build: | ||||||
|  | ```Dockerfile | ||||||
|  | # Build stage of the application | ||||||
|  | FROM node:18 AS build | ||||||
|  | WORKDIR /app | ||||||
|  | COPY package*.json ./ | ||||||
|  | RUN npm install | ||||||
|  | COPY . . | ||||||
|  | RUN npm run build | ||||||
|  | 
 | ||||||
|  | # Production stage to run the application | ||||||
|  | FROM node:18 AS production | ||||||
|  | COPY --from=build /app/build /prod | ||||||
|  | RUN npm install --global serve | ||||||
|  | EXPOSE 3000 | ||||||
|  | CMD ["serve", "prod/"] | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You can run the following command to build the image: | ||||||
|  | ```shell | ||||||
|  | docker build -t 'react-multistage' . | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | You can run the following command to verify that the new image size is smaller than the previous one: | ||||||
|  | ```shell | ||||||
|  | docker image ls | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | I am still usig Nushell on my end to have a pretty print and filter on the images that I want which gives me the following output: | ||||||
|  |  | ||||||
|  | 
 | ||||||
|  | The image now weighs `44 MB` less, which is 1.27 times smaller, and a whopping 21.67% reduction in size! | ||||||
|  | 
 | ||||||
| # Français | # Français | ||||||
| 
 | 
 | ||||||
| ## Comment réduire la taille de vos images 💿 docker 🐳 ? | ## Comment réduire la taille de vos images 💿 docker 🐳 ? | ||||||
|  | @ -72,4 +125,57 @@ docker image ls | from ssv | where repository starts-with 'react' | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Voici un aperçu de ce que cette commande m'affiche avec le poids de l'image assez désastreux: | Voici un aperçu de ce que cette commande m'affiche avec le poids de l'image assez désastreux: | ||||||
|  |  | ||||||
|  | 
 | ||||||
|  | ### Première optimisation: utilisation de .dockerignore et multi-stage | ||||||
|  | 
 | ||||||
|  | Une des première optimisation que l'on peut faire est d'utiliser un fichier `.dockerignore`. Tout comme un fichier `.gitignore`, le fichier `.dockerignore` permet de ne pas include certains dossiers ou fichier qui ne sont pas nécessaire pour l'image que l'on construit. | ||||||
|  | 
 | ||||||
|  | Voici le `.dockerignore` que j'ai rajouté à ce simple projet pour notamment éviter d'inclure le trou noir qu'est le dossier `node_modules`: | ||||||
|  | ``` | ||||||
|  | node_modules | ||||||
|  | npm-debug.log | ||||||
|  | Dockerfile | ||||||
|  | .dockerignore | ||||||
|  | .git | ||||||
|  | .gitignore | ||||||
|  | build | ||||||
|  | assets | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Cependant, ce que cette commande optimise est le temps du build de l'image, car les `309 MB` qu'occupe actuellement ce dossier ne sont pas nécessaire à inclure dans l'image lors du build de celle-ci, mais comme nous lançons la commande `npm install` dans tous les cas dans le Dockerfile, ils sont réinstallé et ré-inclut dans l'image. | ||||||
|  | 
 | ||||||
|  | Une meilleure optimisation de l'image est d'utiliser le multi-stage build. Le multi-stage build permet de n'inclure que ce qui est nécessaire pour exécuter votre programme et de ne pas inclure les fichier de build ou les node_modules par exemple. | ||||||
|  | 
 | ||||||
|  | Voici la nouvelle version du `Dockerfile` découpé en multi-stage: | ||||||
|  | ```Dockerfile | ||||||
|  | # Build stage of the application | ||||||
|  | FROM node:18 AS build | ||||||
|  | WORKDIR /app | ||||||
|  | COPY package*.json ./ | ||||||
|  | RUN npm install | ||||||
|  | COPY . . | ||||||
|  | RUN npm run build | ||||||
|  | 
 | ||||||
|  | # Production stage to run the application | ||||||
|  | FROM node:18 AS production | ||||||
|  | COPY --from=build /app/build /prod | ||||||
|  | RUN npm install --global serve | ||||||
|  | EXPOSE 3000 | ||||||
|  | CMD ["serve", "prod/"] | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Vous pouvez lancer la commande suivante pour construire l'image: | ||||||
|  | ```shell | ||||||
|  | docker build -t 'react-multistage' . | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Vous pouvez relancer la comande suivante pour vérifier que la taille a bien diminué cette fois-ci: | ||||||
|  | ```shell | ||||||
|  | docker image ls | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Pour ma part j'utilise toujours Nushell pour avoir cette belle présentation des résultats filtré: | ||||||
|  |  | ||||||
|  | 
 | ||||||
|  | L'image pèse maintenant `44 MB` de moins, on a une image 1.27 fois plus petite, soit une diminution de la taille de 21.67% ! | ||||||
							
								
								
									
										
											BIN
										
									
								
								assets/react-multistage-size.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/react-multistage-size.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 13 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/react-simple-size.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/react-simple-size.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 9.9 KiB | 
							
								
								
									
										531
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										531
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							|  | @ -11,7 +11,8 @@ | ||||||
|         "cra-template": "1.2.0", |         "cra-template": "1.2.0", | ||||||
|         "react": "^19.0.0", |         "react": "^19.0.0", | ||||||
|         "react-dom": "^19.0.0", |         "react-dom": "^19.0.0", | ||||||
|         "react-scripts": "5.0.1" |         "react-scripts": "5.0.1", | ||||||
|  |         "serve": "^14.2.4" | ||||||
|       }, |       }, | ||||||
|       "devDependencies": { |       "devDependencies": { | ||||||
|         "web-vitals": "^4.2.4" |         "web-vitals": "^4.2.4" | ||||||
|  | @ -4199,6 +4200,12 @@ | ||||||
|       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", |       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", | ||||||
|       "license": "Apache-2.0" |       "license": "Apache-2.0" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@zeit/schemas": { | ||||||
|  |       "version": "2.36.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", | ||||||
|  |       "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==", | ||||||
|  |       "license": "MIT" | ||||||
|  |     }, | ||||||
|     "node_modules/abab": { |     "node_modules/abab": { | ||||||
|       "version": "2.0.6", |       "version": "2.0.6", | ||||||
|       "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", |       "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", | ||||||
|  | @ -4378,6 +4385,15 @@ | ||||||
|         "ajv": "^6.9.1" |         "ajv": "^6.9.1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/ansi-align": { | ||||||
|  |       "version": "3.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", | ||||||
|  |       "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", | ||||||
|  |       "license": "ISC", | ||||||
|  |       "dependencies": { | ||||||
|  |         "string-width": "^4.1.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/ansi-escapes": { |     "node_modules/ansi-escapes": { | ||||||
|       "version": "4.3.2", |       "version": "4.3.2", | ||||||
|       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", |       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", | ||||||
|  | @ -4460,6 +4476,26 @@ | ||||||
|         "node": ">= 8" |         "node": ">= 8" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/arch": { | ||||||
|  |       "version": "2.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", | ||||||
|  |       "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", | ||||||
|  |       "funding": [ | ||||||
|  |         { | ||||||
|  |           "type": "github", | ||||||
|  |           "url": "https://github.com/sponsors/feross" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "patreon", | ||||||
|  |           "url": "https://www.patreon.com/feross" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "consulting", | ||||||
|  |           "url": "https://feross.org/support" | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|  |       "license": "MIT" | ||||||
|  |     }, | ||||||
|     "node_modules/arg": { |     "node_modules/arg": { | ||||||
|       "version": "5.0.2", |       "version": "5.0.2", | ||||||
|       "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", |       "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", | ||||||
|  | @ -5128,6 +5164,137 @@ | ||||||
|       "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", |       "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", | ||||||
|       "license": "ISC" |       "license": "ISC" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/boxen": { | ||||||
|  |       "version": "7.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", | ||||||
|  |       "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "ansi-align": "^3.0.1", | ||||||
|  |         "camelcase": "^7.0.0", | ||||||
|  |         "chalk": "^5.0.1", | ||||||
|  |         "cli-boxes": "^3.0.0", | ||||||
|  |         "string-width": "^5.1.2", | ||||||
|  |         "type-fest": "^2.13.0", | ||||||
|  |         "widest-line": "^4.0.1", | ||||||
|  |         "wrap-ansi": "^8.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=14.16" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/boxen/node_modules/ansi-regex": { | ||||||
|  |       "version": "6.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", | ||||||
|  |       "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/ansi-regex?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/boxen/node_modules/ansi-styles": { | ||||||
|  |       "version": "6.2.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", | ||||||
|  |       "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/ansi-styles?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/boxen/node_modules/camelcase": { | ||||||
|  |       "version": "7.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", | ||||||
|  |       "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=14.16" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/boxen/node_modules/chalk": { | ||||||
|  |       "version": "5.4.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", | ||||||
|  |       "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": "^12.17.0 || ^14.13 || >=16.0.0" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/chalk?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/boxen/node_modules/string-width": { | ||||||
|  |       "version": "5.1.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", | ||||||
|  |       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "eastasianwidth": "^0.2.0", | ||||||
|  |         "emoji-regex": "^9.2.2", | ||||||
|  |         "strip-ansi": "^7.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/boxen/node_modules/strip-ansi": { | ||||||
|  |       "version": "7.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", | ||||||
|  |       "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "ansi-regex": "^6.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/strip-ansi?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/boxen/node_modules/type-fest": { | ||||||
|  |       "version": "2.19.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", | ||||||
|  |       "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", | ||||||
|  |       "license": "(MIT OR CC0-1.0)", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12.20" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/boxen/node_modules/wrap-ansi": { | ||||||
|  |       "version": "8.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", | ||||||
|  |       "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "ansi-styles": "^6.1.0", | ||||||
|  |         "string-width": "^5.0.1", | ||||||
|  |         "strip-ansi": "^7.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/wrap-ansi?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/brace-expansion": { |     "node_modules/brace-expansion": { | ||||||
|       "version": "1.1.11", |       "version": "1.1.11", | ||||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||||
|  | @ -5368,6 +5535,21 @@ | ||||||
|         "url": "https://github.com/chalk/chalk?sponsor=1" |         "url": "https://github.com/chalk/chalk?sponsor=1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/chalk-template": { | ||||||
|  |       "version": "0.4.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", | ||||||
|  |       "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "chalk": "^4.1.2" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/chalk-template?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/char-regex": { |     "node_modules/char-regex": { | ||||||
|       "version": "1.0.2", |       "version": "1.0.2", | ||||||
|       "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", |       "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", | ||||||
|  | @ -5470,6 +5652,35 @@ | ||||||
|         "node": ">=0.10.0" |         "node": ">=0.10.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/cli-boxes": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=10" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/clipboardy": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "arch": "^2.2.0", | ||||||
|  |         "execa": "^5.1.1", | ||||||
|  |         "is-wsl": "^2.2.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": "^12.20.0 || ^14.13.1 || >=16.0.0" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/cliui": { |     "node_modules/cliui": { | ||||||
|       "version": "7.0.4", |       "version": "7.0.4", | ||||||
|       "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", |       "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", | ||||||
|  | @ -6314,6 +6525,15 @@ | ||||||
|       "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", |       "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", | ||||||
|       "license": "MIT" |       "license": "MIT" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/deep-extend": { | ||||||
|  |       "version": "0.6.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", | ||||||
|  |       "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=4.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/deep-is": { |     "node_modules/deep-is": { | ||||||
|       "version": "0.1.4", |       "version": "0.1.4", | ||||||
|       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", |       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", | ||||||
|  | @ -9387,6 +9607,18 @@ | ||||||
|         "url": "https://github.com/sponsors/sindresorhus" |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/is-port-reachable": { | ||||||
|  |       "version": "4.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", | ||||||
|  |       "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": "^12.20.0 || ^14.13.1 || >=16.0.0" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/is-potential-custom-element-name": { |     "node_modules/is-potential-custom-element-name": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", | ||||||
|  | @ -11808,6 +12040,12 @@ | ||||||
|         "node": ">=0.10.0" |         "node": ">=0.10.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/path-is-inside": { | ||||||
|  |       "version": "1.0.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", | ||||||
|  |       "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", | ||||||
|  |       "license": "(WTFPL OR MIT)" | ||||||
|  |     }, | ||||||
|     "node_modules/path-key": { |     "node_modules/path-key": { | ||||||
|       "version": "3.1.1", |       "version": "3.1.1", | ||||||
|       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", |       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", | ||||||
|  | @ -13541,6 +13779,30 @@ | ||||||
|         "node": ">=0.10.0" |         "node": ">=0.10.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/rc": { | ||||||
|  |       "version": "1.2.8", | ||||||
|  |       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", | ||||||
|  |       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", | ||||||
|  |       "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", | ||||||
|  |       "dependencies": { | ||||||
|  |         "deep-extend": "^0.6.0", | ||||||
|  |         "ini": "~1.3.0", | ||||||
|  |         "minimist": "^1.2.0", | ||||||
|  |         "strip-json-comments": "~2.0.1" | ||||||
|  |       }, | ||||||
|  |       "bin": { | ||||||
|  |         "rc": "cli.js" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/rc/node_modules/strip-json-comments": { | ||||||
|  |       "version": "2.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", | ||||||
|  |       "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=0.10.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/react": { |     "node_modules/react": { | ||||||
|       "version": "19.0.0", |       "version": "19.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", |       "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", | ||||||
|  | @ -13929,6 +14191,28 @@ | ||||||
|         "node": ">=4" |         "node": ">=4" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/registry-auth-token": { | ||||||
|  |       "version": "3.3.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", | ||||||
|  |       "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "rc": "^1.1.6", | ||||||
|  |         "safe-buffer": "^5.0.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/registry-url": { | ||||||
|  |       "version": "3.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", | ||||||
|  |       "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "rc": "^1.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=0.10.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/regjsgen": { |     "node_modules/regjsgen": { | ||||||
|       "version": "0.8.0", |       "version": "0.8.0", | ||||||
|       "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", |       "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", | ||||||
|  | @ -14520,6 +14804,100 @@ | ||||||
|         "randombytes": "^2.1.0" |         "randombytes": "^2.1.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/serve": { | ||||||
|  |       "version": "14.2.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz", | ||||||
|  |       "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@zeit/schemas": "2.36.0", | ||||||
|  |         "ajv": "8.12.0", | ||||||
|  |         "arg": "5.0.2", | ||||||
|  |         "boxen": "7.0.0", | ||||||
|  |         "chalk": "5.0.1", | ||||||
|  |         "chalk-template": "0.4.0", | ||||||
|  |         "clipboardy": "3.0.0", | ||||||
|  |         "compression": "1.7.4", | ||||||
|  |         "is-port-reachable": "4.0.0", | ||||||
|  |         "serve-handler": "6.1.6", | ||||||
|  |         "update-check": "1.5.4" | ||||||
|  |       }, | ||||||
|  |       "bin": { | ||||||
|  |         "serve": "build/main.js" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 14" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve-handler": { | ||||||
|  |       "version": "6.1.6", | ||||||
|  |       "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", | ||||||
|  |       "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "bytes": "3.0.0", | ||||||
|  |         "content-disposition": "0.5.2", | ||||||
|  |         "mime-types": "2.1.18", | ||||||
|  |         "minimatch": "3.1.2", | ||||||
|  |         "path-is-inside": "1.0.2", | ||||||
|  |         "path-to-regexp": "3.3.0", | ||||||
|  |         "range-parser": "1.2.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve-handler/node_modules/bytes": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.8" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve-handler/node_modules/content-disposition": { | ||||||
|  |       "version": "0.5.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", | ||||||
|  |       "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.6" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve-handler/node_modules/mime-db": { | ||||||
|  |       "version": "1.33.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", | ||||||
|  |       "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.6" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve-handler/node_modules/mime-types": { | ||||||
|  |       "version": "2.1.18", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", | ||||||
|  |       "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "mime-db": "~1.33.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.6" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve-handler/node_modules/path-to-regexp": { | ||||||
|  |       "version": "3.3.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", | ||||||
|  |       "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", | ||||||
|  |       "license": "MIT" | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve-handler/node_modules/range-parser": { | ||||||
|  |       "version": "1.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", | ||||||
|  |       "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.6" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/serve-index": { |     "node_modules/serve-index": { | ||||||
|       "version": "1.9.1", |       "version": "1.9.1", | ||||||
|       "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", |       "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", | ||||||
|  | @ -14613,6 +14991,88 @@ | ||||||
|         "node": ">= 0.8.0" |         "node": ">= 0.8.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/serve/node_modules/ajv": { | ||||||
|  |       "version": "8.12.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", | ||||||
|  |       "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "fast-deep-equal": "^3.1.1", | ||||||
|  |         "json-schema-traverse": "^1.0.0", | ||||||
|  |         "require-from-string": "^2.0.2", | ||||||
|  |         "uri-js": "^4.2.2" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "type": "github", | ||||||
|  |         "url": "https://github.com/sponsors/epoberezkin" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve/node_modules/bytes": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.8" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve/node_modules/chalk": { | ||||||
|  |       "version": "5.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", | ||||||
|  |       "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": "^12.17.0 || ^14.13 || >=16.0.0" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/chalk?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve/node_modules/compression": { | ||||||
|  |       "version": "1.7.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", | ||||||
|  |       "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "accepts": "~1.3.5", | ||||||
|  |         "bytes": "3.0.0", | ||||||
|  |         "compressible": "~2.0.16", | ||||||
|  |         "debug": "2.6.9", | ||||||
|  |         "on-headers": "~1.0.2", | ||||||
|  |         "safe-buffer": "5.1.2", | ||||||
|  |         "vary": "~1.1.2" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.8.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve/node_modules/debug": { | ||||||
|  |       "version": "2.6.9", | ||||||
|  |       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", | ||||||
|  |       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "ms": "2.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve/node_modules/json-schema-traverse": { | ||||||
|  |       "version": "1.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", | ||||||
|  |       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", | ||||||
|  |       "license": "MIT" | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve/node_modules/ms": { | ||||||
|  |       "version": "2.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||||||
|  |       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", | ||||||
|  |       "license": "MIT" | ||||||
|  |     }, | ||||||
|  |     "node_modules/serve/node_modules/safe-buffer": { | ||||||
|  |       "version": "5.1.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||||||
|  |       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", | ||||||
|  |       "license": "MIT" | ||||||
|  |     }, | ||||||
|     "node_modules/set-function-length": { |     "node_modules/set-function-length": { | ||||||
|       "version": "1.2.2", |       "version": "1.2.2", | ||||||
|       "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", |       "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", | ||||||
|  | @ -16268,6 +16728,16 @@ | ||||||
|         "browserslist": ">= 4.21.0" |         "browserslist": ">= 4.21.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/update-check": { | ||||||
|  |       "version": "1.5.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", | ||||||
|  |       "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "registry-auth-token": "3.3.2", | ||||||
|  |         "registry-url": "3.1.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/uri-js": { |     "node_modules/uri-js": { | ||||||
|       "version": "4.4.1", |       "version": "4.4.1", | ||||||
|       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", |       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", | ||||||
|  | @ -16835,6 +17305,65 @@ | ||||||
|         "url": "https://github.com/sponsors/ljharb" |         "url": "https://github.com/sponsors/ljharb" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/widest-line": { | ||||||
|  |       "version": "4.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", | ||||||
|  |       "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "string-width": "^5.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/widest-line/node_modules/ansi-regex": { | ||||||
|  |       "version": "6.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", | ||||||
|  |       "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/ansi-regex?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/widest-line/node_modules/string-width": { | ||||||
|  |       "version": "5.1.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", | ||||||
|  |       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "eastasianwidth": "^0.2.0", | ||||||
|  |         "emoji-regex": "^9.2.2", | ||||||
|  |         "strip-ansi": "^7.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/widest-line/node_modules/strip-ansi": { | ||||||
|  |       "version": "7.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", | ||||||
|  |       "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", | ||||||
|  |       "license": "MIT", | ||||||
|  |       "dependencies": { | ||||||
|  |         "ansi-regex": "^6.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=12" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/chalk/strip-ansi?sponsor=1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/word-wrap": { |     "node_modules/word-wrap": { | ||||||
|       "version": "1.2.5", |       "version": "1.2.5", | ||||||
|       "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", |       "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", | ||||||
|  |  | ||||||
|  | @ -6,7 +6,8 @@ | ||||||
|     "cra-template": "1.2.0", |     "cra-template": "1.2.0", | ||||||
|     "react": "^19.0.0", |     "react": "^19.0.0", | ||||||
|     "react-dom": "^19.0.0", |     "react-dom": "^19.0.0", | ||||||
|     "react-scripts": "5.0.1" |     "react-scripts": "5.0.1", | ||||||
|  |     "serve": "^14.2.4" | ||||||
|   }, |   }, | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "start": "react-scripts start", |     "start": "react-scripts start", | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 hadestructhor
						hadestructhor