├── .gitignore
├── 1-without-microservices
├── backend
│ ├── .gitignore
│ ├── middleware
│ │ └── auth.js
│ ├── package.json
│ ├── db.js
│ ├── index.js
│ └── package-lock.json
└── frontend
│ ├── jsconfig.json
│ ├── postcss.config.mjs
│ ├── src
│ ├── app
│ │ ├── globals.css
│ │ ├── favicon.ico
│ │ ├── layout.jsx
│ │ └── page.jsx
│ ├── favicon.ico
│ └── components
│ │ └── Pay.jsx
│ ├── next.config.mjs
│ ├── public
│ ├── logo.png
│ ├── visa.png
│ ├── avatar.png
│ ├── product1.png
│ ├── product2.png
│ └── product3.png
│ ├── .gitignore
│ ├── package.json
│ ├── README.md
│ └── eslint.config.mjs
├── 3-microservices-kafka-cluster
└── services
│ ├── payment-service
│ ├── .gitignore
│ ├── package.json
│ ├── index.js
│ └── package-lock.json
│ ├── client
│ ├── src
│ │ ├── app
│ │ │ ├── globals.css
│ │ │ ├── favicon.ico
│ │ │ ├── layout.jsx
│ │ │ └── page.jsx
│ │ ├── favicon.ico
│ │ └── components
│ │ │ └── Pay.jsx
│ ├── jsconfig.json
│ ├── postcss.config.mjs
│ ├── next.config.mjs
│ ├── public
│ │ ├── logo.png
│ │ ├── visa.png
│ │ ├── avatar.png
│ │ ├── product1.png
│ │ ├── product2.png
│ │ └── product3.png
│ ├── .gitignore
│ ├── package.json
│ ├── README.md
│ └── eslint.config.mjs
│ ├── kafka
│ ├── package.json
│ ├── admin.js
│ └── docker-compose.yml
│ ├── email-service
│ ├── package.json
│ └── index.js
│ ├── order-service
│ ├── package.json
│ └── index.js
│ └── analytic-service
│ ├── package.json
│ └── index.js
└── 2-microservices-single-kafka-server
└── services
├── payment-service
├── .gitignore
├── package.json
├── index.js
└── package-lock.json
├── client
├── jsconfig.json
├── postcss.config.mjs
├── src
│ ├── app
│ │ ├── globals.css
│ │ ├── favicon.ico
│ │ ├── layout.jsx
│ │ └── page.jsx
│ ├── favicon.ico
│ └── components
│ │ └── Pay.jsx
├── next.config.mjs
├── public
│ ├── logo.png
│ ├── visa.png
│ ├── avatar.png
│ ├── product1.png
│ ├── product2.png
│ └── product3.png
├── .gitignore
├── package.json
├── README.md
└── eslint.config.mjs
├── kafka
├── package.json
├── admin.js
└── docker-compose.yml
├── email-service
├── package.json
└── index.js
├── order-service
├── package.json
└── index.js
└── analytic-service
├── package.json
└── index.js
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 |
3 | .DS_Store
4 |
5 | .env*
--------------------------------------------------------------------------------
/1-without-microservices/backend/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | .DS_Store
3 | .env
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/payment-service/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .env
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/payment-service/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .env
--------------------------------------------------------------------------------
/1-without-microservices/frontend/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "paths": {
4 | "@/*": ["./src/*"]
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 |
3 | body {
4 | font-family: Arial, Helvetica, sans-serif;
5 | }
6 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {};
3 |
4 | export default nextConfig;
5 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/1-without-microservices/frontend/public/logo.png
--------------------------------------------------------------------------------
/1-without-microservices/frontend/public/visa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/1-without-microservices/frontend/public/visa.png
--------------------------------------------------------------------------------
/1-without-microservices/frontend/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/1-without-microservices/frontend/src/favicon.ico
--------------------------------------------------------------------------------
/1-without-microservices/frontend/public/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/1-without-microservices/frontend/public/avatar.png
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 |
3 | body {
4 | font-family: Arial, Helvetica, sans-serif;
5 | }
6 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/public/product1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/1-without-microservices/frontend/public/product1.png
--------------------------------------------------------------------------------
/1-without-microservices/frontend/public/product2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/1-without-microservices/frontend/public/product2.png
--------------------------------------------------------------------------------
/1-without-microservices/frontend/public/product3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/1-without-microservices/frontend/public/product3.png
--------------------------------------------------------------------------------
/1-without-microservices/frontend/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/1-without-microservices/frontend/src/app/favicon.ico
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "paths": {
4 | "@/*": ["./src/*"]
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "paths": {
4 | "@/*": ["./src/*"]
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 |
3 | body {
4 | font-family: Arial, Helvetica, sans-serif;
5 | }
6 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {};
3 |
4 | export default nextConfig;
5 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {};
3 |
4 | export default nextConfig;
5 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/3-microservices-kafka-cluster/services/client/public/logo.png
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/public/visa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/3-microservices-kafka-cluster/services/client/public/visa.png
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/3-microservices-kafka-cluster/services/client/src/favicon.ico
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/public/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/3-microservices-kafka-cluster/services/client/public/avatar.png
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/public/product1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/3-microservices-kafka-cluster/services/client/public/product1.png
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/public/product2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/3-microservices-kafka-cluster/services/client/public/product2.png
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/public/product3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/3-microservices-kafka-cluster/services/client/public/product3.png
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/3-microservices-kafka-cluster/services/client/src/app/favicon.ico
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/2-microservices-single-kafka-server/services/client/public/logo.png
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/public/visa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/2-microservices-single-kafka-server/services/client/public/visa.png
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/2-microservices-single-kafka-server/services/client/src/favicon.ico
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/public/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/2-microservices-single-kafka-server/services/client/public/avatar.png
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/public/product1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/2-microservices-single-kafka-server/services/client/public/product1.png
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/public/product2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/2-microservices-single-kafka-server/services/client/public/product2.png
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/public/product3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/2-microservices-single-kafka-server/services/client/public/product3.png
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/safak/microservices-kafka/HEAD/2-microservices-single-kafka-server/services/client/src/app/favicon.ico
--------------------------------------------------------------------------------
/1-without-microservices/backend/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const dummyIsAuthorized = true;
2 | const dummyUserId = "123456";
3 |
4 | export const authMiddleware = (req, res, next) => {
5 | if (!dummyIsAuthorized) {
6 | return res.status(403).send("Unauthorized");
7 | }
8 | req.userId = dummyUserId;
9 | next();
10 | };
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/kafka/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "kafka-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "kafkajs": "^2.2.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/kafka/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "kafka-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "kafkajs": "^2.2.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/email-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "email-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "kafkajs": "^2.2.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/order-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "order-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "kafkajs": "^2.2.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/email-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "email-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "kafkajs": "^2.2.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/order-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "order-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "kafkajs": "^2.2.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/analytic-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "analytic-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "kafkajs": "^2.2.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/analytic-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "analytic-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "kafkajs": "^2.2.4"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/1-without-microservices/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "cors": "^2.8.5",
15 | "express": "^5.1.0",
16 | "uuid": "^11.1.0"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/payment-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "payment-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "cors": "^2.8.5",
15 | "express": "^5.1.0",
16 | "kafkajs": "^2.2.4"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/payment-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "payment-service",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "type": "module",
13 | "dependencies": {
14 | "cors": "^2.8.5",
15 | "express": "^5.1.0",
16 | "kafkajs": "^2.2.4"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/kafka/admin.js:
--------------------------------------------------------------------------------
1 | import { Kafka } from "kafkajs";
2 |
3 | const kafka = new Kafka({
4 | clientId: "kafka-service",
5 | brokers: ["localhost:9094"],
6 | });
7 |
8 | const admin = kafka.admin();
9 |
10 | const run = async () => {
11 | await admin.connect();
12 | await admin.createTopics({
13 | topics: [
14 | { topic: "payment-successful" },
15 | { topic: "order-successful" },
16 | { topic: "email-successful" },
17 | ],
18 | });
19 | };
20 |
21 | run();
22 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/kafka/admin.js:
--------------------------------------------------------------------------------
1 | import { Kafka } from "kafkajs";
2 |
3 | const kafka = new Kafka({
4 | clientId: "kafka-service",
5 | brokers: ["localhost:9094"],
6 | });
7 |
8 | const admin = kafka.admin();
9 |
10 | const run = async () => {
11 | await admin.connect();
12 | await admin.createTopics({
13 | topics: [
14 | { topic: "payment-successful" },
15 | { topic: "order-successful" },
16 | { topic: "email-successful" },
17 | ],
18 | });
19 | };
20 |
21 | run();
22 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 |
20 | # production
21 | /build
22 |
23 | # misc
24 | .DS_Store
25 | *.pem
26 |
27 | # debug
28 | npm-debug.log*
29 | yarn-debug.log*
30 | yarn-error.log*
31 | .pnpm-debug.log*
32 |
33 | # env files (can opt-in for committing if needed)
34 | .env*
35 |
36 | # vercel
37 | .vercel
38 |
39 | # typescript
40 | *.tsbuildinfo
41 | next-env.d.ts
42 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 |
20 | # production
21 | /build
22 |
23 | # misc
24 | .DS_Store
25 | *.pem
26 |
27 | # debug
28 | npm-debug.log*
29 | yarn-debug.log*
30 | yarn-error.log*
31 | .pnpm-debug.log*
32 |
33 | # env files (can opt-in for committing if needed)
34 | .env*
35 |
36 | # vercel
37 | .vercel
38 |
39 | # typescript
40 | *.tsbuildinfo
41 | next-env.d.ts
42 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 |
20 | # production
21 | /build
22 |
23 | # misc
24 | .DS_Store
25 | *.pem
26 |
27 | # debug
28 | npm-debug.log*
29 | yarn-debug.log*
30 | yarn-error.log*
31 | .pnpm-debug.log*
32 |
33 | # env files (can opt-in for committing if needed)
34 | .env*
35 |
36 | # vercel
37 | .vercel
38 |
39 | # typescript
40 | *.tsbuildinfo
41 | next-env.d.ts
42 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@tanstack/react-query": "^5.80.7",
13 | "axios": "^1.9.0",
14 | "lucide-react": "^0.514.0",
15 | "next": "15.3.3",
16 | "react": "^19.0.0",
17 | "react-dom": "^19.0.0"
18 | },
19 | "devDependencies": {
20 | "@eslint/eslintrc": "^3",
21 | "@tailwindcss/postcss": "^4",
22 | "@typescript-eslint/eslint-plugin": "^8.34.0",
23 | "@typescript-eslint/parser": "^8.34.0",
24 | "eslint": "^9",
25 | "eslint-config-next": "15.3.3",
26 | "eslint-import-resolver-typescript": "^4.4.3",
27 | "eslint-plugin-import": "^2.31.0",
28 | "eslint-plugin-jsx-a11y": "^6.10.2",
29 | "eslint-plugin-react": "^7.37.5",
30 | "eslint-plugin-react-hooks": "^5.2.0",
31 | "tailwindcss": "^4"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@tanstack/react-query": "^5.80.7",
13 | "axios": "^1.9.0",
14 | "lucide-react": "^0.514.0",
15 | "next": "15.3.3",
16 | "react": "^19.0.0",
17 | "react-dom": "^19.0.0"
18 | },
19 | "devDependencies": {
20 | "@eslint/eslintrc": "^3",
21 | "@tailwindcss/postcss": "^4",
22 | "@typescript-eslint/eslint-plugin": "^8.34.0",
23 | "@typescript-eslint/parser": "^8.34.0",
24 | "eslint": "^9",
25 | "eslint-config-next": "15.3.3",
26 | "eslint-import-resolver-typescript": "^4.4.3",
27 | "eslint-plugin-import": "^2.31.0",
28 | "eslint-plugin-jsx-a11y": "^6.10.2",
29 | "eslint-plugin-react": "^7.37.5",
30 | "eslint-plugin-react-hooks": "^5.2.0",
31 | "tailwindcss": "^4"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@tanstack/react-query": "^5.80.7",
13 | "axios": "^1.9.0",
14 | "lucide-react": "^0.514.0",
15 | "next": "15.3.3",
16 | "react": "^19.0.0",
17 | "react-dom": "^19.0.0"
18 | },
19 | "devDependencies": {
20 | "@eslint/eslintrc": "^3",
21 | "@tailwindcss/postcss": "^4",
22 | "@typescript-eslint/eslint-plugin": "^8.34.0",
23 | "@typescript-eslint/parser": "^8.34.0",
24 | "eslint": "^9",
25 | "eslint-config-next": "15.3.3",
26 | "eslint-import-resolver-typescript": "^4.4.3",
27 | "eslint-plugin-import": "^2.31.0",
28 | "eslint-plugin-jsx-a11y": "^6.10.2",
29 | "eslint-plugin-react": "^7.37.5",
30 | "eslint-plugin-react-hooks": "^5.2.0",
31 | "tailwindcss": "^4"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/1-without-microservices/backend/db.js:
--------------------------------------------------------------------------------
1 | import { v4 as uuidv4 } from "uuid";
2 |
3 | export const pay = async (cart, userId) => {
4 | const promise = new Promise((resolve, reject) => {
5 | setTimeout(() => {
6 | resolve("success");
7 | }, 3000);
8 | });
9 |
10 | return promise;
11 | };
12 |
13 | export const createOrder = async (cart, userId) => {
14 | const id = uuidv4();
15 |
16 | const promise = new Promise((resolve, reject) => {
17 | setTimeout(() => {
18 | resolve(id);
19 | }, 3000);
20 | });
21 |
22 | return promise;
23 | };
24 |
25 | export const sendEmail = async (orderId, userId, emailResult) => {
26 | const promise = new Promise((resolve, reject) => {
27 | setTimeout(() => {
28 | resolve("success");
29 | // reject(new Error("Email failed"))
30 | }, 3000);
31 | });
32 |
33 | return promise;
34 | };
35 |
36 | export const logAnalytics = async (data,message) => {
37 | const promise = new Promise((resolve, reject) => {
38 | setTimeout(() => {
39 | console.log("Analytics log created: ", message);
40 | resolve("success");
41 | }, 1000);
42 | });
43 |
44 | return promise;
45 | };
--------------------------------------------------------------------------------
/1-without-microservices/backend/index.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import cors from "cors";
3 | import { createOrder, pay, sendEmail, logAnalytics } from "./db.js";
4 | import { authMiddleware } from "./middleware/auth.js";
5 |
6 | const app = express();
7 |
8 | app.use(
9 | cors({
10 | origin: "http://localhost:3000",
11 | })
12 | );
13 | app.use(express.json());
14 |
15 | app.post("/order", authMiddleware, async (req, res) => {
16 | const { cart } = req.body;
17 | const userId = req.userId;
18 |
19 | const paymentResult = await pay(cart, userId);
20 | await logAnalytics({ cart, userId }, "Payment successful");
21 | const orderId = await createOrder(cart, userId);
22 | await logAnalytics({ orderId, userId }, "Order created");
23 | const emailResult = await sendEmail(orderId, userId);
24 | await logAnalytics({ orderId, userId, emailResult }, "Email sent");
25 |
26 | return res.json({ orderId, paymentResult, emailResult });
27 | });
28 |
29 | app.use((err, req, res, next) => {
30 | return res.status(err.status || 500).json(err.message);
31 | });
32 |
33 | app.listen(8000, () => {
34 | console.log(`Server is running on port 8000`);
35 | });
36 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/order-service/index.js:
--------------------------------------------------------------------------------
1 | import { Kafka } from "kafkajs";
2 |
3 | const kafka = new Kafka({
4 | clientId: "order-service",
5 | brokers: ["localhost:9094"],
6 | });
7 |
8 | const producer = kafka.producer();
9 | const consumer = kafka.consumer({ groupId: "order-service" });
10 |
11 | const run = async () => {
12 | try {
13 | await producer.connect();
14 | await consumer.connect();
15 | await consumer.subscribe({
16 | topic: "payment-successful",
17 | fromBeginning: true,
18 | });
19 |
20 | await consumer.run({
21 | eachMessage: async ({ topic, partition, message }) => {
22 | const value = message.value.toString();
23 | const { userId, cart } = JSON.parse(value);
24 |
25 | // TODO: Create order on DB
26 | const dummyOrderId = "123456789";
27 | console.log(`Order consumer: Order created for user id: ${userId}`);
28 |
29 | await producer.send({
30 | topic: "order-successful",
31 | messages: [
32 | { value: JSON.stringify({ userId, orderId: dummyOrderId }) },
33 | ],
34 | });
35 | },
36 | });
37 | } catch (err) {
38 | console.log(err);
39 | }
40 | };
41 |
42 | run();
43 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/email-service/index.js:
--------------------------------------------------------------------------------
1 | import { Kafka } from "kafkajs";
2 |
3 | const kafka = new Kafka({
4 | clientId: "email-service",
5 | brokers: ["localhost:9094"],
6 | });
7 |
8 | const producer = kafka.producer();
9 | const consumer = kafka.consumer({ groupId: "email-service" });
10 |
11 | const run = async () => {
12 | try {
13 | await producer.connect();
14 | await consumer.connect();
15 | await consumer.subscribe({
16 | topic: "order-successful",
17 | fromBeginning: true,
18 | });
19 |
20 | await consumer.run({
21 | eachMessage: async ({ topic, partition, message }) => {
22 | const value = message.value.toString();
23 | const { userId, orderId } = JSON.parse(value);
24 |
25 | // TODO: Send email to the user
26 | const dummyEmailId = "091584203985";
27 | console.log(`Email consumer: Email sent to user id ${userId}`);
28 |
29 | await producer.send({
30 | topic: "email-successful",
31 | messages: [
32 | { value: JSON.stringify({ userId, emailId: dummyEmailId }) },
33 | ],
34 | });
35 | },
36 | });
37 | } catch (err) {
38 | console.log(err);
39 | }
40 | };
41 |
42 | run();
43 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/order-service/index.js:
--------------------------------------------------------------------------------
1 | import { Kafka } from "kafkajs";
2 |
3 | const kafka = new Kafka({
4 | clientId: "order-service",
5 | brokers: ["localhost:9094", "localhost:9095", "localhost:9096"],
6 | });
7 |
8 | const producer = kafka.producer();
9 | const consumer = kafka.consumer({ groupId: "order-service" });
10 |
11 | const run = async () => {
12 | try {
13 | await producer.connect();
14 | await consumer.connect();
15 | await consumer.subscribe({
16 | topic: "payment-successful",
17 | fromBeginning: true,
18 | });
19 |
20 | await consumer.run({
21 | eachMessage: async ({ topic, partition, message }) => {
22 | const value = message.value.toString();
23 | const { userId, cart } = JSON.parse(value);
24 |
25 | // TODO: Create order on DB
26 | const dummyOrderId = "123456789";
27 | console.log(`Order consumer: Order created for user id: ${userId}`);
28 |
29 | await producer.send({
30 | topic: "order-successful",
31 | messages: [
32 | { value: JSON.stringify({ userId, orderId: dummyOrderId }) },
33 | ],
34 | });
35 | },
36 | });
37 | } catch (err) {
38 | console.log(err);
39 | }
40 | };
41 |
42 | run();
43 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/email-service/index.js:
--------------------------------------------------------------------------------
1 | import { Kafka } from "kafkajs";
2 |
3 | const kafka = new Kafka({
4 | clientId: "email-service",
5 | brokers: ["localhost:9094", "localhost:9095", "localhost:9096"],
6 | });
7 |
8 | const producer = kafka.producer();
9 | const consumer = kafka.consumer({ groupId: "email-service" });
10 |
11 | const run = async () => {
12 | try {
13 | await producer.connect();
14 | await consumer.connect();
15 | await consumer.subscribe({
16 | topic: "order-successful",
17 | fromBeginning: true,
18 | });
19 |
20 | await consumer.run({
21 | eachMessage: async ({ topic, partition, message }) => {
22 | const value = message.value.toString();
23 | const { userId, orderId } = JSON.parse(value);
24 |
25 | // TODO: Send email to the user
26 | const dummyEmailId = "091584203985";
27 | console.log(`Email consumer: Email sent to user id ${userId}`);
28 |
29 | await producer.send({
30 | topic: "email-successful",
31 | messages: [
32 | { value: JSON.stringify({ userId, emailId: dummyEmailId }) },
33 | ],
34 | });
35 | },
36 | });
37 | } catch (err) {
38 | console.log(err);
39 | }
40 | };
41 |
42 | run();
43 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/kafka/docker-compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 | kafka:
3 | image: bitnami/kafka:latest
4 | container_name: kafka
5 | environment:
6 | - KAFKA_CFG_NODE_ID=1
7 | - KAFKA_CFG_PROCESS_ROLES=broker,controller
8 | - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094
9 | - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094
10 | - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
11 | - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
12 | - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
13 | - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
14 | - ALLOW_PLAINTEXT_LISTENER=yes
15 | ports:
16 | - "9094:9094"
17 | networks:
18 | - kafka-network
19 |
20 | kafka-ui:
21 | image: provectuslabs/kafka-ui:latest
22 | container_name: kafka-ui
23 | depends_on:
24 | - kafka
25 | ports:
26 | - '8080:8080'
27 | environment:
28 | - KAFKA_CLUSTERS_0_NAME=local-cluster
29 | - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092
30 | - KAFKA_CLUSTERS_0_READONLY=false
31 | - KAFKA_CLUSTERS_0_TOPIC_AUTO_CREATE=true
32 | networks:
33 | - kafka-network
34 |
35 | networks:
36 | kafka-network:
37 | driver: bridge
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/payment-service/index.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import cors from "cors";
3 | import { Kafka } from "kafkajs";
4 |
5 | const app = express();
6 |
7 | app.use(
8 | cors({
9 | origin: "http://localhost:3000",
10 | })
11 | );
12 | app.use(express.json());
13 |
14 | const kafka = new Kafka({
15 | clientId: "payment-service",
16 | brokers: ["localhost:9094"],
17 | });
18 |
19 | const producer = kafka.producer();
20 |
21 | const connectToKafka = async () => {
22 | try {
23 | await producer.connect();
24 | console.log("Producer connected!");
25 | } catch (err) {
26 | console.log("Error connecting to Kafka", err);
27 | }
28 | };
29 |
30 | app.post("/payment-service", async (req, res) => {
31 | const { cart } = req.body;
32 | // ASSUME THAT WE GET THE COOKIE AND DECRYPT THE USER ID
33 | const userId = "123";
34 |
35 | // TODO:PAYMENT
36 |
37 | // KAFKA
38 | await producer.send({
39 | topic: "payment-successful",
40 | messages: [{ value: JSON.stringify({ userId, cart }) }],
41 | });
42 |
43 | setTimeout(() => {
44 | return res.status(200).send("Payment successful");
45 | }, 3000);
46 | });
47 |
48 | app.use((err, req, res, next) => {
49 | res.status(err.status || 500).send(err.message);
50 | });
51 |
52 | app.listen(8000, () => {
53 | connectToKafka();
54 | console.log("Payment service is running on port 8000");
55 | });
56 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/payment-service/index.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import cors from "cors";
3 | import { Kafka } from "kafkajs";
4 |
5 | const app = express();
6 |
7 | app.use(
8 | cors({
9 | origin: "http://localhost:3000",
10 | })
11 | );
12 | app.use(express.json());
13 |
14 | const kafka = new Kafka({
15 | clientId: "payment-service",
16 | brokers: ["localhost:9094", "localhost:9095", "localhost:9096"],
17 | });
18 |
19 | const producer = kafka.producer();
20 |
21 | const connectToKafka = async () => {
22 | try {
23 | await producer.connect();
24 | console.log("Producer connected!");
25 | } catch (err) {
26 | console.log("Error connecting to Kafka", err);
27 | }
28 | };
29 |
30 | app.post("/payment-service", async (req, res) => {
31 | const { cart } = req.body;
32 | // ASSUME THAT WE GET THE COOKIE AND DECRYPT THE USER ID
33 | const userId = "123";
34 |
35 | // TODO:PAYMENT
36 |
37 | // KAFKA
38 | await producer.send({
39 | topic: "payment-successful",
40 | messages: [{ value: JSON.stringify({ userId, cart }) }],
41 | });
42 |
43 | setTimeout(() => {
44 | return res.status(200).send("Payment successful");
45 | }, 3000);
46 | });
47 |
48 | app.use((err, req, res, next) => {
49 | res.status(err.status || 500).send(err.message);
50 | });
51 |
52 | app.listen(8000, () => {
53 | connectToKafka();
54 | console.log("Payment service is running on port 8000");
55 | });
56 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/README.md:
--------------------------------------------------------------------------------
1 | This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | npm run dev
9 | # or
10 | yarn dev
11 | # or
12 | pnpm dev
13 | # or
14 | bun dev
15 | ```
16 |
17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18 |
19 | You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
20 |
21 | This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22 |
23 | ## Learn More
24 |
25 | To learn more about Next.js, take a look at the following resources:
26 |
27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29 |
30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31 |
32 | ## Deploy on Vercel
33 |
34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35 |
36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
37 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/README.md:
--------------------------------------------------------------------------------
1 | This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | npm run dev
9 | # or
10 | yarn dev
11 | # or
12 | pnpm dev
13 | # or
14 | bun dev
15 | ```
16 |
17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18 |
19 | You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
20 |
21 | This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22 |
23 | ## Learn More
24 |
25 | To learn more about Next.js, take a look at the following resources:
26 |
27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29 |
30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31 |
32 | ## Deploy on Vercel
33 |
34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35 |
36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
37 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/README.md:
--------------------------------------------------------------------------------
1 | This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | npm run dev
9 | # or
10 | yarn dev
11 | # or
12 | pnpm dev
13 | # or
14 | bun dev
15 | ```
16 |
17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18 |
19 | You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
20 |
21 | This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22 |
23 | ## Learn More
24 |
25 | To learn more about Next.js, take a look at the following resources:
26 |
27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29 |
30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31 |
32 | ## Deploy on Vercel
33 |
34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35 |
36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
37 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { dirname } from "path";
2 | import { fileURLToPath } from "url";
3 | import { FlatCompat } from "@eslint/eslintrc";
4 |
5 | const __filename = fileURLToPath(import.meta.url);
6 | const __dirname = dirname(__filename);
7 |
8 | const compat = new FlatCompat({
9 | baseDirectory: __dirname,
10 | });
11 |
12 | const eslintConfig = [
13 | ...compat.extends(
14 | "next/core-web-vitals",
15 | "plugin:react/recommended",
16 | "plugin:react-hooks/recommended",
17 | "plugin:@typescript-eslint/recommended",
18 | "plugin:jsx-a11y/recommended",
19 | "plugin:import/recommended",
20 | "plugin:import/typescript"
21 | ),
22 | {
23 | files: ["**/*.{js,jsx,ts,tsx}"],
24 | rules: {
25 | "react/react-in-jsx-scope": "off", // Not needed in Next.js
26 | "react/prop-types": "off", // Not needed when using TypeScript
27 | "react/display-name": "off",
28 | "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }],
29 | "@typescript-eslint/no-explicit-any": "warn",
30 | "import/order": [
31 | "error",
32 | {
33 | groups: ["builtin", "external", "internal", "parent", "sibling", "index"],
34 | "newlines-between": "always",
35 | alphabetize: { order: "asc" }
36 | }
37 | ],
38 | "no-console": ["warn", { allow: ["warn", "error"] }],
39 | "jsx-a11y/anchor-is-valid": "warn"
40 | },
41 | settings: {
42 | react: {
43 | version: "detect"
44 | },
45 | "import/resolver": {
46 | typescript: {},
47 | node: {
48 | extensions: [".js", ".jsx", ".ts", ".tsx"]
49 | }
50 | }
51 | }
52 | }
53 | ];
54 |
55 | export default eslintConfig;
56 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { dirname } from "path";
2 | import { fileURLToPath } from "url";
3 | import { FlatCompat } from "@eslint/eslintrc";
4 |
5 | const __filename = fileURLToPath(import.meta.url);
6 | const __dirname = dirname(__filename);
7 |
8 | const compat = new FlatCompat({
9 | baseDirectory: __dirname,
10 | });
11 |
12 | const eslintConfig = [
13 | ...compat.extends(
14 | "next/core-web-vitals",
15 | "plugin:react/recommended",
16 | "plugin:react-hooks/recommended",
17 | "plugin:@typescript-eslint/recommended",
18 | "plugin:jsx-a11y/recommended",
19 | "plugin:import/recommended",
20 | "plugin:import/typescript"
21 | ),
22 | {
23 | files: ["**/*.{js,jsx,ts,tsx}"],
24 | rules: {
25 | "react/react-in-jsx-scope": "off", // Not needed in Next.js
26 | "react/prop-types": "off", // Not needed when using TypeScript
27 | "react/display-name": "off",
28 | "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }],
29 | "@typescript-eslint/no-explicit-any": "warn",
30 | "import/order": [
31 | "error",
32 | {
33 | groups: ["builtin", "external", "internal", "parent", "sibling", "index"],
34 | "newlines-between": "always",
35 | alphabetize: { order: "asc" }
36 | }
37 | ],
38 | "no-console": ["warn", { allow: ["warn", "error"] }],
39 | "jsx-a11y/anchor-is-valid": "warn"
40 | },
41 | settings: {
42 | react: {
43 | version: "detect"
44 | },
45 | "import/resolver": {
46 | typescript: {},
47 | node: {
48 | extensions: [".js", ".jsx", ".ts", ".tsx"]
49 | }
50 | }
51 | }
52 | }
53 | ];
54 |
55 | export default eslintConfig;
56 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { dirname } from "path";
2 | import { fileURLToPath } from "url";
3 | import { FlatCompat } from "@eslint/eslintrc";
4 |
5 | const __filename = fileURLToPath(import.meta.url);
6 | const __dirname = dirname(__filename);
7 |
8 | const compat = new FlatCompat({
9 | baseDirectory: __dirname,
10 | });
11 |
12 | const eslintConfig = [
13 | ...compat.extends(
14 | "next/core-web-vitals",
15 | "plugin:react/recommended",
16 | "plugin:react-hooks/recommended",
17 | "plugin:@typescript-eslint/recommended",
18 | "plugin:jsx-a11y/recommended",
19 | "plugin:import/recommended",
20 | "plugin:import/typescript"
21 | ),
22 | {
23 | files: ["**/*.{js,jsx,ts,tsx}"],
24 | rules: {
25 | "react/react-in-jsx-scope": "off", // Not needed in Next.js
26 | "react/prop-types": "off", // Not needed when using TypeScript
27 | "react/display-name": "off",
28 | "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }],
29 | "@typescript-eslint/no-explicit-any": "warn",
30 | "import/order": [
31 | "error",
32 | {
33 | groups: ["builtin", "external", "internal", "parent", "sibling", "index"],
34 | "newlines-between": "always",
35 | alphabetize: { order: "asc" }
36 | }
37 | ],
38 | "no-console": ["warn", { allow: ["warn", "error"] }],
39 | "jsx-a11y/anchor-is-valid": "warn"
40 | },
41 | settings: {
42 | react: {
43 | version: "detect"
44 | },
45 | "import/resolver": {
46 | typescript: {},
47 | node: {
48 | extensions: [".js", ".jsx", ".ts", ".tsx"]
49 | }
50 | }
51 | }
52 | }
53 | ];
54 |
55 | export default eslintConfig;
56 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/src/app/layout.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Geist, Geist_Mono } from "next/font/google";
3 | import "./globals.css";
4 | import Image from "next/image";
5 | import Link from "next/link";
6 | import { Bell, House, ShoppingCart } from "lucide-react";
7 | import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
8 |
9 | const geistSans = Geist({
10 | variable: "--font-geist-sans",
11 | subsets: ["latin"],
12 | });
13 |
14 | const geistMono = Geist_Mono({
15 | variable: "--font-geist-mono",
16 | subsets: ["latin"],
17 | });
18 |
19 |
20 | export default function RootLayout({ children }) {
21 | const queryClient = new QueryClient();
22 | return (
23 |
24 |
25 |
28 |
48 | {children}
49 |
50 |
51 |
52 | );
53 | }
54 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/src/app/layout.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Geist, Geist_Mono } from "next/font/google";
3 | import "./globals.css";
4 | import Image from "next/image";
5 | import Link from "next/link";
6 | import { Bell, House, ShoppingCart } from "lucide-react";
7 | import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
8 |
9 | const geistSans = Geist({
10 | variable: "--font-geist-sans",
11 | subsets: ["latin"],
12 | });
13 |
14 | const geistMono = Geist_Mono({
15 | variable: "--font-geist-mono",
16 | subsets: ["latin"],
17 | });
18 |
19 |
20 | export default function RootLayout({ children }) {
21 | const queryClient = new QueryClient();
22 | return (
23 |
24 |
25 |
28 |
48 | {children}
49 |
50 |
51 |
52 | );
53 | }
54 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/src/app/layout.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { Geist, Geist_Mono } from "next/font/google";
3 | import "./globals.css";
4 | import Image from "next/image";
5 | import Link from "next/link";
6 | import { Bell, House, ShoppingCart } from "lucide-react";
7 | import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
8 |
9 | const geistSans = Geist({
10 | variable: "--font-geist-sans",
11 | subsets: ["latin"],
12 | });
13 |
14 | const geistMono = Geist_Mono({
15 | variable: "--font-geist-mono",
16 | subsets: ["latin"],
17 | });
18 |
19 |
20 | export default function RootLayout({ children }) {
21 | const queryClient = new QueryClient();
22 | return (
23 |
24 |
25 |
28 |
48 | {children}
49 |
50 |
51 |
52 | );
53 | }
54 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/analytic-service/index.js:
--------------------------------------------------------------------------------
1 | import { Kafka } from "kafkajs";
2 |
3 | const kafka = new Kafka({
4 | clientId: "analytic-service",
5 | brokers: ["localhost:9094"],
6 | });
7 |
8 | const consumer = kafka.consumer({ groupId: "analytic-service" });
9 |
10 | const run = async () => {
11 | try {
12 | await consumer.connect();
13 | await consumer.subscribe({
14 | topics: ["payment-successful", "order-successful", "email-successful"],
15 | fromBeginning: true,
16 | });
17 |
18 | await consumer.run({
19 | eachMessage: async ({ topic, partition, message }) => {
20 | switch (topic) {
21 | case "payment-successful":
22 | {
23 | const value = message.value.toString();
24 | const { userId, cart } = JSON.parse(value);
25 |
26 | const total = cart
27 | .reduce((acc, item) => acc + item.price, 0)
28 | .toFixed(2);
29 |
30 | console.log(`Analytic consumer: User ${userId} paid ${total}`);
31 | }
32 | break;
33 | case "order-successful":
34 | {
35 | const value = message.value.toString();
36 | const { userId, orderId } = JSON.parse(value);
37 |
38 | console.log(`Analytic consumer: Order id ${orderId} created for user id ${userId}`);
39 | }
40 | break;
41 | case "email-successful":
42 | {
43 | const value = message.value.toString();
44 | const { userId, emailId } = JSON.parse(value);
45 |
46 | console.log(`Analytic consumer: Email id ${emailId} sent to user id ${userId}`);
47 | }
48 | break;
49 |
50 | default:
51 | break;
52 | }
53 | },
54 | });
55 | } catch (err) {
56 | console.log(err);
57 | }
58 | };
59 |
60 | run();
61 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/analytic-service/index.js:
--------------------------------------------------------------------------------
1 | import { Kafka } from "kafkajs";
2 |
3 | const kafka = new Kafka({
4 | clientId: "analytic-service",
5 | brokers: ["localhost:9094", "localhost:9095", "localhost:9096"],
6 | });
7 |
8 | const consumer = kafka.consumer({ groupId: "analytic-service" });
9 |
10 | const run = async () => {
11 | try {
12 | await consumer.connect();
13 | await consumer.subscribe({
14 | topics: ["payment-successful", "order-successful", "email-successful"],
15 | fromBeginning: true,
16 | });
17 |
18 | await consumer.run({
19 | eachMessage: async ({ topic, partition, message }) => {
20 | switch (topic) {
21 | case "payment-successful":
22 | {
23 | const value = message.value.toString();
24 | const { userId, cart } = JSON.parse(value);
25 |
26 | const total = cart
27 | .reduce((acc, item) => acc + item.price, 0)
28 | .toFixed(2);
29 |
30 | console.log(`Analytic consumer: User ${userId} paid ${total}`);
31 | }
32 | break;
33 | case "order-successful":
34 | {
35 | const value = message.value.toString();
36 | const { userId, orderId } = JSON.parse(value);
37 |
38 | console.log(`Analytic consumer: Order id ${orderId} created for user id ${userId}`);
39 | }
40 | break;
41 | case "email-successful":
42 | {
43 | const value = message.value.toString();
44 | const { userId, emailId } = JSON.parse(value);
45 |
46 | console.log(`Analytic consumer: Email id ${emailId} sent to user id ${userId}`);
47 | }
48 | break;
49 |
50 | default:
51 | break;
52 | }
53 | },
54 | });
55 | } catch (err) {
56 | console.log(err);
57 | }
58 | };
59 |
60 | run();
61 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/src/app/page.jsx:
--------------------------------------------------------------------------------
1 | import Pay from "@/components/Pay";
2 | import { Minus } from "lucide-react";
3 | import Image from "next/image";
4 |
5 | const Page = () => {
6 | const cart = [
7 | {
8 | id: 1,
9 | name: "Nike Air Max",
10 | price: 129.9,
11 | image: "/product1.png",
12 | description:
13 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
14 | },
15 | {
16 | id: 2,
17 | name: "Adidas Superstar Cap",
18 | price: 29.9,
19 | image: "/product2.png",
20 | description:
21 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
22 | },
23 | {
24 | id: 3,
25 | name: "Puma Yellow T-Shirt",
26 | price: 49.9,
27 | image: "/product3.png",
28 | description:
29 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
30 | },
31 | ];
32 | return (
33 |
34 |
Cart Products
35 |
36 |
37 | {cart.map((item) => (
38 |
39 |
47 |
48 |
{item.name}
49 |
{item.description}
50 |
51 |
52 | ${item.price.toFixed(2)}
53 |
54 |
55 |
56 | Remove
57 |
58 |
59 |
60 |
61 | ))}
62 |
63 |
66 |
67 |
68 | );
69 | };
70 |
71 | export default Page;
72 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/src/app/page.jsx:
--------------------------------------------------------------------------------
1 | import Pay from "@/components/Pay";
2 | import { Minus } from "lucide-react";
3 | import Image from "next/image";
4 |
5 | const Page = () => {
6 | const cart = [
7 | {
8 | id: 1,
9 | name: "Nike Air Max",
10 | price: 129.9,
11 | image: "/product1.png",
12 | description:
13 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
14 | },
15 | {
16 | id: 2,
17 | name: "Adidas Superstar Cap",
18 | price: 29.9,
19 | image: "/product2.png",
20 | description:
21 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
22 | },
23 | {
24 | id: 3,
25 | name: "Puma Yellow T-Shirt",
26 | price: 49.9,
27 | image: "/product3.png",
28 | description:
29 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
30 | },
31 | ];
32 | return (
33 |
34 |
Cart Products
35 |
36 |
37 | {cart.map((item) => (
38 |
39 |
47 |
48 |
{item.name}
49 |
{item.description}
50 |
51 |
52 | ${item.price.toFixed(2)}
53 |
54 |
55 |
56 | Remove
57 |
58 |
59 |
60 |
61 | ))}
62 |
63 |
66 |
67 |
68 | );
69 | };
70 |
71 | export default Page;
72 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/src/app/page.jsx:
--------------------------------------------------------------------------------
1 | import Pay from "@/components/Pay";
2 | import { Minus } from "lucide-react";
3 | import Image from "next/image";
4 |
5 | const Page = () => {
6 | const cart = [
7 | {
8 | id: 1,
9 | name: "Nike Air Max",
10 | price: 129.9,
11 | image: "/product1.png",
12 | description:
13 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
14 | },
15 | {
16 | id: 2,
17 | name: "Adidas Superstar Cap",
18 | price: 29.9,
19 | image: "/product2.png",
20 | description:
21 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
22 | },
23 | {
24 | id: 3,
25 | name: "Puma Yellow T-Shirt",
26 | price: 49.9,
27 | image: "/product3.png",
28 | description:
29 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos. Lorem ipsum dolor sit amet consectetur adipisicing elit.",
30 | },
31 | ];
32 | return (
33 |
34 |
Cart Products
35 |
36 |
37 | {cart.map((item) => (
38 |
39 |
47 |
48 |
{item.name}
49 |
{item.description}
50 |
51 |
52 | ${item.price.toFixed(2)}
53 |
54 |
55 |
56 | Remove
57 |
58 |
59 |
60 |
61 | ))}
62 |
63 |
66 |
67 |
68 | );
69 | };
70 |
71 | export default Page;
72 |
--------------------------------------------------------------------------------
/1-without-microservices/frontend/src/components/Pay.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useMutation } from "@tanstack/react-query";
4 | import axios from "axios";
5 | import { LaptopMinimalCheck, Loader2, ShoppingCart } from "lucide-react";
6 | import Image from "next/image";
7 |
8 | const Pay = ({ cart }) => {
9 | const total = cart.reduce((acc, item) => acc + item.price, 0).toFixed(2);
10 |
11 | const { isPending, isError, mutate, data } = useMutation({
12 | mutationFn: async (cart) => {
13 | const startTime = Date.now();
14 | const response = await axios.post("http://localhost:8000/order", {
15 | cart,
16 | });
17 | const endTime = Date.now();
18 | const duration = (endTime - startTime) / 1000;
19 | return { ...response, duration };
20 | },
21 | });
22 |
23 | return (
24 |
25 |
26 |
27 |
28 |
CART TOTAL
29 | ${total}
30 |
31 |
32 | Shipping & taxes calculated at checkout
33 |
34 |
35 |
36 |
42 |
46 |
47 |
48 | Saved Card:
49 |
50 | **** 3567
51 | (change)
52 |
53 |
65 | {data && (
66 |
67 |
68 |
69 | Successful in{" "}
70 | 5 ? "text-red-500" : "text-green-500"
73 | }`}
74 | >
75 | {data?.duration}
76 | {" "}
77 | seconds
78 |
79 |
80 | )}
81 | {isError &&
Something went wrong!}
82 |
83 |
84 | );
85 | };
86 |
87 | export default Pay;
88 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/client/src/components/Pay.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useMutation } from "@tanstack/react-query";
4 | import axios from "axios";
5 | import { LaptopMinimalCheck, Loader2, ShoppingCart } from "lucide-react";
6 | import Image from "next/image";
7 |
8 | const Pay = ({ cart }) => {
9 | const total = cart.reduce((acc, item) => acc + item.price, 0).toFixed(2);
10 |
11 | const { isPending, isError, mutate, data } = useMutation({
12 | mutationFn: async (cart) => {
13 | const startTime = Date.now();
14 | const response = await axios.post("http://localhost:8000/payment-service", {
15 | cart,
16 | });
17 | const endTime = Date.now();
18 | const duration = (endTime - startTime) / 1000;
19 | return { ...response, duration };
20 | },
21 | });
22 |
23 | return (
24 |
25 |
26 |
27 |
28 |
CART TOTAL
29 | ${total}
30 |
31 |
32 | Shipping & taxes calculated at checkout
33 |
34 |
35 |
36 |
42 |
46 |
47 |
48 | Saved Card:
49 |
50 | **** 3567
51 | (change)
52 |
53 |
65 | {data && (
66 |
67 |
68 |
69 | Successful in{" "}
70 | 5 ? "text-red-500" : "text-green-500"
73 | }`}
74 | >
75 | {data?.duration}
76 | {" "}
77 | seconds
78 |
79 |
80 | )}
81 | {isError &&
Something went wrong!}
82 |
83 |
84 | );
85 | };
86 |
87 | export default Pay;
88 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/kafka/docker-compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 | kafka-broker-1:
3 | image: bitnami/kafka:latest
4 | container_name: kafka-broker-1
5 | environment:
6 | KAFKA_ENABLE_KRAFT: "yes"
7 | KAFKA_CFG_NODE_ID: 1
8 | KAFKA_CFG_PROCESS_ROLES: broker,controller
9 | KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9094
10 | KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka-broker-1:9092,EXTERNAL://localhost:9094
11 | KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka-broker-1:9093,2@kafka-broker-2:9093,3@kafka-broker-3:9093
12 | KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
13 | KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
14 | KAFKA_CFG_INTER_BROKER_LISTENER_NAME: PLAINTEXT
15 | KAFKA_KRAFT_CLUSTER_ID: 7Dvn0OLMQo-bg4qmCmflVg
16 | ALLOW_PLAINTEXT_LISTENER: "yes"
17 | ports:
18 | - "9094:9094"
19 | networks:
20 | - kafka-network
21 | kafka-broker-2:
22 | image: bitnami/kafka:latest
23 | container_name: kafka-broker-2
24 | environment:
25 | KAFKA_ENABLE_KRAFT: "yes"
26 | KAFKA_CFG_NODE_ID: 2
27 | KAFKA_CFG_PROCESS_ROLES: broker,controller
28 | KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9095
29 | KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka-broker-2:9092,EXTERNAL://localhost:9095
30 | KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka-broker-1:9093,2@kafka-broker-2:9093,3@kafka-broker-3:9093
31 | KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
32 | KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
33 | KAFKA_CFG_INTER_BROKER_LISTENER_NAME: PLAINTEXT
34 | KAFKA_KRAFT_CLUSTER_ID: 7Dvn0OLMQo-bg4qmCmflVg
35 | ALLOW_PLAINTEXT_LISTENER: "yes"
36 | ports:
37 | - "9095:9095"
38 | networks:
39 | - kafka-network
40 | kafka-broker-3:
41 | image: bitnami/kafka:latest
42 | container_name: kafka-broker-3
43 | environment:
44 | KAFKA_ENABLE_KRAFT: "yes"
45 | KAFKA_CFG_NODE_ID: 3
46 | KAFKA_CFG_PROCESS_ROLES: broker,controller
47 | KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://0.0.0.0:9096
48 | KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka-broker-3:9092,EXTERNAL://localhost:9096
49 | KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 1@kafka-broker-1:9093,2@kafka-broker-2:9093,3@kafka-broker-3:9093
50 | KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
51 | KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
52 | KAFKA_CFG_INTER_BROKER_LISTENER_NAME: PLAINTEXT
53 | KAFKA_KRAFT_CLUSTER_ID: 7Dvn0OLMQo-bg4qmCmflVg
54 | ALLOW_PLAINTEXT_LISTENER: "yes"
55 | ports:
56 | - "9096:9096"
57 | networks:
58 | - kafka-network
59 | kafka-ui:
60 | image: provectuslabs/kafka-ui:latest
61 | container_name: kafka-ui
62 | environment:
63 | KAFKA_CLUSTERS_0_NAME: local-cluster
64 | KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka-broker-1:9092,kafka-broker-2:9092,kafka-broker-3:9092
65 | KAFKA_CLUSTERS_0_READONLY: false
66 | KAFKA_CLUSTERS_0_TOPIC_AUTO_CREATE: true
67 | ports:
68 | - "8080:8080"
69 | depends_on:
70 | - kafka-broker-1
71 | - kafka-broker-2
72 | - kafka-broker-3
73 | networks:
74 | - kafka-network
75 |
76 | networks:
77 | kafka-network:
78 | driver: bridge
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/client/src/components/Pay.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useMutation } from "@tanstack/react-query";
4 | import axios from "axios";
5 | import { LaptopMinimalCheck, Loader2, ShoppingCart } from "lucide-react";
6 | import Image from "next/image";
7 |
8 | const Pay = ({ cart }) => {
9 | const total = cart.reduce((acc, item) => acc + item.price, 0).toFixed(2);
10 |
11 | const { isPending, isError, mutate, data } = useMutation({
12 | mutationFn: async (cart) => {
13 | const startTime = Date.now();
14 | const response = await axios.post("http://localhost:8000/payment-service", {
15 | cart,
16 | });
17 | const endTime = Date.now();
18 | const duration = (endTime - startTime) / 1000;
19 | return { ...response, duration };
20 | },
21 | });
22 |
23 | return (
24 |
25 |
26 |
27 |
28 |
CART TOTAL
29 | ${total}
30 |
31 |
32 | Shipping & taxes calculated at checkout
33 |
34 |
35 |
36 |
42 |
46 |
47 |
48 | Saved Card:
49 |
50 | **** 3567
51 | (change)
52 |
53 |
65 | {data && (
66 |
67 |
68 |
69 | Successful in{" "}
70 | 5 ? "text-red-500" : "text-green-500"
73 | }`}
74 | >
75 | {data?.duration}
76 | {" "}
77 | seconds
78 |
79 |
80 | )}
81 | {isError &&
Something went wrong!}
82 |
83 |
84 | );
85 | };
86 |
87 | export default Pay;
88 |
--------------------------------------------------------------------------------
/3-microservices-kafka-cluster/services/payment-service/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "payment-service",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "payment-service",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "cors": "^2.8.5",
13 | "express": "^5.1.0",
14 | "kafkajs": "^2.2.4"
15 | }
16 | },
17 | "node_modules/accepts": {
18 | "version": "2.0.0",
19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
20 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
21 | "license": "MIT",
22 | "dependencies": {
23 | "mime-types": "^3.0.0",
24 | "negotiator": "^1.0.0"
25 | },
26 | "engines": {
27 | "node": ">= 0.6"
28 | }
29 | },
30 | "node_modules/body-parser": {
31 | "version": "2.2.0",
32 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
33 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
34 | "license": "MIT",
35 | "dependencies": {
36 | "bytes": "^3.1.2",
37 | "content-type": "^1.0.5",
38 | "debug": "^4.4.0",
39 | "http-errors": "^2.0.0",
40 | "iconv-lite": "^0.6.3",
41 | "on-finished": "^2.4.1",
42 | "qs": "^6.14.0",
43 | "raw-body": "^3.0.0",
44 | "type-is": "^2.0.0"
45 | },
46 | "engines": {
47 | "node": ">=18"
48 | }
49 | },
50 | "node_modules/bytes": {
51 | "version": "3.1.2",
52 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
53 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
54 | "license": "MIT",
55 | "engines": {
56 | "node": ">= 0.8"
57 | }
58 | },
59 | "node_modules/call-bind-apply-helpers": {
60 | "version": "1.0.2",
61 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
62 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
63 | "license": "MIT",
64 | "dependencies": {
65 | "es-errors": "^1.3.0",
66 | "function-bind": "^1.1.2"
67 | },
68 | "engines": {
69 | "node": ">= 0.4"
70 | }
71 | },
72 | "node_modules/call-bound": {
73 | "version": "1.0.4",
74 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
75 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
76 | "license": "MIT",
77 | "dependencies": {
78 | "call-bind-apply-helpers": "^1.0.2",
79 | "get-intrinsic": "^1.3.0"
80 | },
81 | "engines": {
82 | "node": ">= 0.4"
83 | },
84 | "funding": {
85 | "url": "https://github.com/sponsors/ljharb"
86 | }
87 | },
88 | "node_modules/content-disposition": {
89 | "version": "1.0.0",
90 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
91 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
92 | "license": "MIT",
93 | "dependencies": {
94 | "safe-buffer": "5.2.1"
95 | },
96 | "engines": {
97 | "node": ">= 0.6"
98 | }
99 | },
100 | "node_modules/content-type": {
101 | "version": "1.0.5",
102 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
103 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
104 | "license": "MIT",
105 | "engines": {
106 | "node": ">= 0.6"
107 | }
108 | },
109 | "node_modules/cookie": {
110 | "version": "0.7.2",
111 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
112 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
113 | "license": "MIT",
114 | "engines": {
115 | "node": ">= 0.6"
116 | }
117 | },
118 | "node_modules/cookie-signature": {
119 | "version": "1.2.2",
120 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
121 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
122 | "license": "MIT",
123 | "engines": {
124 | "node": ">=6.6.0"
125 | }
126 | },
127 | "node_modules/cors": {
128 | "version": "2.8.5",
129 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
130 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
131 | "license": "MIT",
132 | "dependencies": {
133 | "object-assign": "^4",
134 | "vary": "^1"
135 | },
136 | "engines": {
137 | "node": ">= 0.10"
138 | }
139 | },
140 | "node_modules/debug": {
141 | "version": "4.4.1",
142 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
143 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
144 | "license": "MIT",
145 | "dependencies": {
146 | "ms": "^2.1.3"
147 | },
148 | "engines": {
149 | "node": ">=6.0"
150 | },
151 | "peerDependenciesMeta": {
152 | "supports-color": {
153 | "optional": true
154 | }
155 | }
156 | },
157 | "node_modules/depd": {
158 | "version": "2.0.0",
159 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
160 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
161 | "license": "MIT",
162 | "engines": {
163 | "node": ">= 0.8"
164 | }
165 | },
166 | "node_modules/dunder-proto": {
167 | "version": "1.0.1",
168 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
169 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
170 | "license": "MIT",
171 | "dependencies": {
172 | "call-bind-apply-helpers": "^1.0.1",
173 | "es-errors": "^1.3.0",
174 | "gopd": "^1.2.0"
175 | },
176 | "engines": {
177 | "node": ">= 0.4"
178 | }
179 | },
180 | "node_modules/ee-first": {
181 | "version": "1.1.1",
182 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
183 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
184 | "license": "MIT"
185 | },
186 | "node_modules/encodeurl": {
187 | "version": "2.0.0",
188 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
189 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
190 | "license": "MIT",
191 | "engines": {
192 | "node": ">= 0.8"
193 | }
194 | },
195 | "node_modules/es-define-property": {
196 | "version": "1.0.1",
197 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
198 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
199 | "license": "MIT",
200 | "engines": {
201 | "node": ">= 0.4"
202 | }
203 | },
204 | "node_modules/es-errors": {
205 | "version": "1.3.0",
206 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
207 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
208 | "license": "MIT",
209 | "engines": {
210 | "node": ">= 0.4"
211 | }
212 | },
213 | "node_modules/es-object-atoms": {
214 | "version": "1.1.1",
215 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
216 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
217 | "license": "MIT",
218 | "dependencies": {
219 | "es-errors": "^1.3.0"
220 | },
221 | "engines": {
222 | "node": ">= 0.4"
223 | }
224 | },
225 | "node_modules/escape-html": {
226 | "version": "1.0.3",
227 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
228 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
229 | "license": "MIT"
230 | },
231 | "node_modules/etag": {
232 | "version": "1.8.1",
233 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
234 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
235 | "license": "MIT",
236 | "engines": {
237 | "node": ">= 0.6"
238 | }
239 | },
240 | "node_modules/express": {
241 | "version": "5.1.0",
242 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
243 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
244 | "license": "MIT",
245 | "dependencies": {
246 | "accepts": "^2.0.0",
247 | "body-parser": "^2.2.0",
248 | "content-disposition": "^1.0.0",
249 | "content-type": "^1.0.5",
250 | "cookie": "^0.7.1",
251 | "cookie-signature": "^1.2.1",
252 | "debug": "^4.4.0",
253 | "encodeurl": "^2.0.0",
254 | "escape-html": "^1.0.3",
255 | "etag": "^1.8.1",
256 | "finalhandler": "^2.1.0",
257 | "fresh": "^2.0.0",
258 | "http-errors": "^2.0.0",
259 | "merge-descriptors": "^2.0.0",
260 | "mime-types": "^3.0.0",
261 | "on-finished": "^2.4.1",
262 | "once": "^1.4.0",
263 | "parseurl": "^1.3.3",
264 | "proxy-addr": "^2.0.7",
265 | "qs": "^6.14.0",
266 | "range-parser": "^1.2.1",
267 | "router": "^2.2.0",
268 | "send": "^1.1.0",
269 | "serve-static": "^2.2.0",
270 | "statuses": "^2.0.1",
271 | "type-is": "^2.0.1",
272 | "vary": "^1.1.2"
273 | },
274 | "engines": {
275 | "node": ">= 18"
276 | },
277 | "funding": {
278 | "type": "opencollective",
279 | "url": "https://opencollective.com/express"
280 | }
281 | },
282 | "node_modules/finalhandler": {
283 | "version": "2.1.0",
284 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
285 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
286 | "license": "MIT",
287 | "dependencies": {
288 | "debug": "^4.4.0",
289 | "encodeurl": "^2.0.0",
290 | "escape-html": "^1.0.3",
291 | "on-finished": "^2.4.1",
292 | "parseurl": "^1.3.3",
293 | "statuses": "^2.0.1"
294 | },
295 | "engines": {
296 | "node": ">= 0.8"
297 | }
298 | },
299 | "node_modules/forwarded": {
300 | "version": "0.2.0",
301 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
302 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
303 | "license": "MIT",
304 | "engines": {
305 | "node": ">= 0.6"
306 | }
307 | },
308 | "node_modules/fresh": {
309 | "version": "2.0.0",
310 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
311 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
312 | "license": "MIT",
313 | "engines": {
314 | "node": ">= 0.8"
315 | }
316 | },
317 | "node_modules/function-bind": {
318 | "version": "1.1.2",
319 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
320 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
321 | "license": "MIT",
322 | "funding": {
323 | "url": "https://github.com/sponsors/ljharb"
324 | }
325 | },
326 | "node_modules/get-intrinsic": {
327 | "version": "1.3.0",
328 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
329 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
330 | "license": "MIT",
331 | "dependencies": {
332 | "call-bind-apply-helpers": "^1.0.2",
333 | "es-define-property": "^1.0.1",
334 | "es-errors": "^1.3.0",
335 | "es-object-atoms": "^1.1.1",
336 | "function-bind": "^1.1.2",
337 | "get-proto": "^1.0.1",
338 | "gopd": "^1.2.0",
339 | "has-symbols": "^1.1.0",
340 | "hasown": "^2.0.2",
341 | "math-intrinsics": "^1.1.0"
342 | },
343 | "engines": {
344 | "node": ">= 0.4"
345 | },
346 | "funding": {
347 | "url": "https://github.com/sponsors/ljharb"
348 | }
349 | },
350 | "node_modules/get-proto": {
351 | "version": "1.0.1",
352 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
353 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
354 | "license": "MIT",
355 | "dependencies": {
356 | "dunder-proto": "^1.0.1",
357 | "es-object-atoms": "^1.0.0"
358 | },
359 | "engines": {
360 | "node": ">= 0.4"
361 | }
362 | },
363 | "node_modules/gopd": {
364 | "version": "1.2.0",
365 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
366 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
367 | "license": "MIT",
368 | "engines": {
369 | "node": ">= 0.4"
370 | },
371 | "funding": {
372 | "url": "https://github.com/sponsors/ljharb"
373 | }
374 | },
375 | "node_modules/has-symbols": {
376 | "version": "1.1.0",
377 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
378 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
379 | "license": "MIT",
380 | "engines": {
381 | "node": ">= 0.4"
382 | },
383 | "funding": {
384 | "url": "https://github.com/sponsors/ljharb"
385 | }
386 | },
387 | "node_modules/hasown": {
388 | "version": "2.0.2",
389 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
390 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
391 | "license": "MIT",
392 | "dependencies": {
393 | "function-bind": "^1.1.2"
394 | },
395 | "engines": {
396 | "node": ">= 0.4"
397 | }
398 | },
399 | "node_modules/http-errors": {
400 | "version": "2.0.0",
401 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
402 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
403 | "license": "MIT",
404 | "dependencies": {
405 | "depd": "2.0.0",
406 | "inherits": "2.0.4",
407 | "setprototypeof": "1.2.0",
408 | "statuses": "2.0.1",
409 | "toidentifier": "1.0.1"
410 | },
411 | "engines": {
412 | "node": ">= 0.8"
413 | }
414 | },
415 | "node_modules/http-errors/node_modules/statuses": {
416 | "version": "2.0.1",
417 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
418 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
419 | "license": "MIT",
420 | "engines": {
421 | "node": ">= 0.8"
422 | }
423 | },
424 | "node_modules/iconv-lite": {
425 | "version": "0.6.3",
426 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
427 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
428 | "license": "MIT",
429 | "dependencies": {
430 | "safer-buffer": ">= 2.1.2 < 3.0.0"
431 | },
432 | "engines": {
433 | "node": ">=0.10.0"
434 | }
435 | },
436 | "node_modules/inherits": {
437 | "version": "2.0.4",
438 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
439 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
440 | "license": "ISC"
441 | },
442 | "node_modules/ipaddr.js": {
443 | "version": "1.9.1",
444 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
445 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
446 | "license": "MIT",
447 | "engines": {
448 | "node": ">= 0.10"
449 | }
450 | },
451 | "node_modules/is-promise": {
452 | "version": "4.0.0",
453 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
454 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
455 | "license": "MIT"
456 | },
457 | "node_modules/kafkajs": {
458 | "version": "2.2.4",
459 | "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz",
460 | "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==",
461 | "license": "MIT",
462 | "engines": {
463 | "node": ">=14.0.0"
464 | }
465 | },
466 | "node_modules/math-intrinsics": {
467 | "version": "1.1.0",
468 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
469 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
470 | "license": "MIT",
471 | "engines": {
472 | "node": ">= 0.4"
473 | }
474 | },
475 | "node_modules/media-typer": {
476 | "version": "1.1.0",
477 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
478 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
479 | "license": "MIT",
480 | "engines": {
481 | "node": ">= 0.8"
482 | }
483 | },
484 | "node_modules/merge-descriptors": {
485 | "version": "2.0.0",
486 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
487 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
488 | "license": "MIT",
489 | "engines": {
490 | "node": ">=18"
491 | },
492 | "funding": {
493 | "url": "https://github.com/sponsors/sindresorhus"
494 | }
495 | },
496 | "node_modules/mime-db": {
497 | "version": "1.54.0",
498 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
499 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
500 | "license": "MIT",
501 | "engines": {
502 | "node": ">= 0.6"
503 | }
504 | },
505 | "node_modules/mime-types": {
506 | "version": "3.0.1",
507 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
508 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
509 | "license": "MIT",
510 | "dependencies": {
511 | "mime-db": "^1.54.0"
512 | },
513 | "engines": {
514 | "node": ">= 0.6"
515 | }
516 | },
517 | "node_modules/ms": {
518 | "version": "2.1.3",
519 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
520 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
521 | "license": "MIT"
522 | },
523 | "node_modules/negotiator": {
524 | "version": "1.0.0",
525 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
526 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
527 | "license": "MIT",
528 | "engines": {
529 | "node": ">= 0.6"
530 | }
531 | },
532 | "node_modules/object-assign": {
533 | "version": "4.1.1",
534 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
535 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
536 | "license": "MIT",
537 | "engines": {
538 | "node": ">=0.10.0"
539 | }
540 | },
541 | "node_modules/object-inspect": {
542 | "version": "1.13.4",
543 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
544 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
545 | "license": "MIT",
546 | "engines": {
547 | "node": ">= 0.4"
548 | },
549 | "funding": {
550 | "url": "https://github.com/sponsors/ljharb"
551 | }
552 | },
553 | "node_modules/on-finished": {
554 | "version": "2.4.1",
555 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
556 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
557 | "license": "MIT",
558 | "dependencies": {
559 | "ee-first": "1.1.1"
560 | },
561 | "engines": {
562 | "node": ">= 0.8"
563 | }
564 | },
565 | "node_modules/once": {
566 | "version": "1.4.0",
567 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
568 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
569 | "license": "ISC",
570 | "dependencies": {
571 | "wrappy": "1"
572 | }
573 | },
574 | "node_modules/parseurl": {
575 | "version": "1.3.3",
576 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
577 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
578 | "license": "MIT",
579 | "engines": {
580 | "node": ">= 0.8"
581 | }
582 | },
583 | "node_modules/path-to-regexp": {
584 | "version": "8.2.0",
585 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
586 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
587 | "license": "MIT",
588 | "engines": {
589 | "node": ">=16"
590 | }
591 | },
592 | "node_modules/proxy-addr": {
593 | "version": "2.0.7",
594 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
595 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
596 | "license": "MIT",
597 | "dependencies": {
598 | "forwarded": "0.2.0",
599 | "ipaddr.js": "1.9.1"
600 | },
601 | "engines": {
602 | "node": ">= 0.10"
603 | }
604 | },
605 | "node_modules/qs": {
606 | "version": "6.14.0",
607 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
608 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
609 | "license": "BSD-3-Clause",
610 | "dependencies": {
611 | "side-channel": "^1.1.0"
612 | },
613 | "engines": {
614 | "node": ">=0.6"
615 | },
616 | "funding": {
617 | "url": "https://github.com/sponsors/ljharb"
618 | }
619 | },
620 | "node_modules/range-parser": {
621 | "version": "1.2.1",
622 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
623 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
624 | "license": "MIT",
625 | "engines": {
626 | "node": ">= 0.6"
627 | }
628 | },
629 | "node_modules/raw-body": {
630 | "version": "3.0.0",
631 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
632 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
633 | "license": "MIT",
634 | "dependencies": {
635 | "bytes": "3.1.2",
636 | "http-errors": "2.0.0",
637 | "iconv-lite": "0.6.3",
638 | "unpipe": "1.0.0"
639 | },
640 | "engines": {
641 | "node": ">= 0.8"
642 | }
643 | },
644 | "node_modules/router": {
645 | "version": "2.2.0",
646 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
647 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
648 | "license": "MIT",
649 | "dependencies": {
650 | "debug": "^4.4.0",
651 | "depd": "^2.0.0",
652 | "is-promise": "^4.0.0",
653 | "parseurl": "^1.3.3",
654 | "path-to-regexp": "^8.0.0"
655 | },
656 | "engines": {
657 | "node": ">= 18"
658 | }
659 | },
660 | "node_modules/safe-buffer": {
661 | "version": "5.2.1",
662 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
663 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
664 | "funding": [
665 | {
666 | "type": "github",
667 | "url": "https://github.com/sponsors/feross"
668 | },
669 | {
670 | "type": "patreon",
671 | "url": "https://www.patreon.com/feross"
672 | },
673 | {
674 | "type": "consulting",
675 | "url": "https://feross.org/support"
676 | }
677 | ],
678 | "license": "MIT"
679 | },
680 | "node_modules/safer-buffer": {
681 | "version": "2.1.2",
682 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
683 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
684 | "license": "MIT"
685 | },
686 | "node_modules/send": {
687 | "version": "1.2.0",
688 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
689 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
690 | "license": "MIT",
691 | "dependencies": {
692 | "debug": "^4.3.5",
693 | "encodeurl": "^2.0.0",
694 | "escape-html": "^1.0.3",
695 | "etag": "^1.8.1",
696 | "fresh": "^2.0.0",
697 | "http-errors": "^2.0.0",
698 | "mime-types": "^3.0.1",
699 | "ms": "^2.1.3",
700 | "on-finished": "^2.4.1",
701 | "range-parser": "^1.2.1",
702 | "statuses": "^2.0.1"
703 | },
704 | "engines": {
705 | "node": ">= 18"
706 | }
707 | },
708 | "node_modules/serve-static": {
709 | "version": "2.2.0",
710 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
711 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
712 | "license": "MIT",
713 | "dependencies": {
714 | "encodeurl": "^2.0.0",
715 | "escape-html": "^1.0.3",
716 | "parseurl": "^1.3.3",
717 | "send": "^1.2.0"
718 | },
719 | "engines": {
720 | "node": ">= 18"
721 | }
722 | },
723 | "node_modules/setprototypeof": {
724 | "version": "1.2.0",
725 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
726 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
727 | "license": "ISC"
728 | },
729 | "node_modules/side-channel": {
730 | "version": "1.1.0",
731 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
732 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
733 | "license": "MIT",
734 | "dependencies": {
735 | "es-errors": "^1.3.0",
736 | "object-inspect": "^1.13.3",
737 | "side-channel-list": "^1.0.0",
738 | "side-channel-map": "^1.0.1",
739 | "side-channel-weakmap": "^1.0.2"
740 | },
741 | "engines": {
742 | "node": ">= 0.4"
743 | },
744 | "funding": {
745 | "url": "https://github.com/sponsors/ljharb"
746 | }
747 | },
748 | "node_modules/side-channel-list": {
749 | "version": "1.0.0",
750 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
751 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
752 | "license": "MIT",
753 | "dependencies": {
754 | "es-errors": "^1.3.0",
755 | "object-inspect": "^1.13.3"
756 | },
757 | "engines": {
758 | "node": ">= 0.4"
759 | },
760 | "funding": {
761 | "url": "https://github.com/sponsors/ljharb"
762 | }
763 | },
764 | "node_modules/side-channel-map": {
765 | "version": "1.0.1",
766 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
767 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
768 | "license": "MIT",
769 | "dependencies": {
770 | "call-bound": "^1.0.2",
771 | "es-errors": "^1.3.0",
772 | "get-intrinsic": "^1.2.5",
773 | "object-inspect": "^1.13.3"
774 | },
775 | "engines": {
776 | "node": ">= 0.4"
777 | },
778 | "funding": {
779 | "url": "https://github.com/sponsors/ljharb"
780 | }
781 | },
782 | "node_modules/side-channel-weakmap": {
783 | "version": "1.0.2",
784 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
785 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
786 | "license": "MIT",
787 | "dependencies": {
788 | "call-bound": "^1.0.2",
789 | "es-errors": "^1.3.0",
790 | "get-intrinsic": "^1.2.5",
791 | "object-inspect": "^1.13.3",
792 | "side-channel-map": "^1.0.1"
793 | },
794 | "engines": {
795 | "node": ">= 0.4"
796 | },
797 | "funding": {
798 | "url": "https://github.com/sponsors/ljharb"
799 | }
800 | },
801 | "node_modules/statuses": {
802 | "version": "2.0.2",
803 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
804 | "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
805 | "license": "MIT",
806 | "engines": {
807 | "node": ">= 0.8"
808 | }
809 | },
810 | "node_modules/toidentifier": {
811 | "version": "1.0.1",
812 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
813 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
814 | "license": "MIT",
815 | "engines": {
816 | "node": ">=0.6"
817 | }
818 | },
819 | "node_modules/type-is": {
820 | "version": "2.0.1",
821 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
822 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
823 | "license": "MIT",
824 | "dependencies": {
825 | "content-type": "^1.0.5",
826 | "media-typer": "^1.1.0",
827 | "mime-types": "^3.0.0"
828 | },
829 | "engines": {
830 | "node": ">= 0.6"
831 | }
832 | },
833 | "node_modules/unpipe": {
834 | "version": "1.0.0",
835 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
836 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
837 | "license": "MIT",
838 | "engines": {
839 | "node": ">= 0.8"
840 | }
841 | },
842 | "node_modules/vary": {
843 | "version": "1.1.2",
844 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
845 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
846 | "license": "MIT",
847 | "engines": {
848 | "node": ">= 0.8"
849 | }
850 | },
851 | "node_modules/wrappy": {
852 | "version": "1.0.2",
853 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
854 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
855 | "license": "ISC"
856 | }
857 | }
858 | }
859 |
--------------------------------------------------------------------------------
/2-microservices-single-kafka-server/services/payment-service/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "payment-service",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "payment-service",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "cors": "^2.8.5",
13 | "express": "^5.1.0",
14 | "kafkajs": "^2.2.4"
15 | }
16 | },
17 | "node_modules/accepts": {
18 | "version": "2.0.0",
19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
20 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
21 | "license": "MIT",
22 | "dependencies": {
23 | "mime-types": "^3.0.0",
24 | "negotiator": "^1.0.0"
25 | },
26 | "engines": {
27 | "node": ">= 0.6"
28 | }
29 | },
30 | "node_modules/body-parser": {
31 | "version": "2.2.0",
32 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
33 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
34 | "license": "MIT",
35 | "dependencies": {
36 | "bytes": "^3.1.2",
37 | "content-type": "^1.0.5",
38 | "debug": "^4.4.0",
39 | "http-errors": "^2.0.0",
40 | "iconv-lite": "^0.6.3",
41 | "on-finished": "^2.4.1",
42 | "qs": "^6.14.0",
43 | "raw-body": "^3.0.0",
44 | "type-is": "^2.0.0"
45 | },
46 | "engines": {
47 | "node": ">=18"
48 | }
49 | },
50 | "node_modules/bytes": {
51 | "version": "3.1.2",
52 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
53 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
54 | "license": "MIT",
55 | "engines": {
56 | "node": ">= 0.8"
57 | }
58 | },
59 | "node_modules/call-bind-apply-helpers": {
60 | "version": "1.0.2",
61 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
62 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
63 | "license": "MIT",
64 | "dependencies": {
65 | "es-errors": "^1.3.0",
66 | "function-bind": "^1.1.2"
67 | },
68 | "engines": {
69 | "node": ">= 0.4"
70 | }
71 | },
72 | "node_modules/call-bound": {
73 | "version": "1.0.4",
74 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
75 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
76 | "license": "MIT",
77 | "dependencies": {
78 | "call-bind-apply-helpers": "^1.0.2",
79 | "get-intrinsic": "^1.3.0"
80 | },
81 | "engines": {
82 | "node": ">= 0.4"
83 | },
84 | "funding": {
85 | "url": "https://github.com/sponsors/ljharb"
86 | }
87 | },
88 | "node_modules/content-disposition": {
89 | "version": "1.0.0",
90 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
91 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
92 | "license": "MIT",
93 | "dependencies": {
94 | "safe-buffer": "5.2.1"
95 | },
96 | "engines": {
97 | "node": ">= 0.6"
98 | }
99 | },
100 | "node_modules/content-type": {
101 | "version": "1.0.5",
102 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
103 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
104 | "license": "MIT",
105 | "engines": {
106 | "node": ">= 0.6"
107 | }
108 | },
109 | "node_modules/cookie": {
110 | "version": "0.7.2",
111 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
112 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
113 | "license": "MIT",
114 | "engines": {
115 | "node": ">= 0.6"
116 | }
117 | },
118 | "node_modules/cookie-signature": {
119 | "version": "1.2.2",
120 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
121 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
122 | "license": "MIT",
123 | "engines": {
124 | "node": ">=6.6.0"
125 | }
126 | },
127 | "node_modules/cors": {
128 | "version": "2.8.5",
129 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
130 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
131 | "license": "MIT",
132 | "dependencies": {
133 | "object-assign": "^4",
134 | "vary": "^1"
135 | },
136 | "engines": {
137 | "node": ">= 0.10"
138 | }
139 | },
140 | "node_modules/debug": {
141 | "version": "4.4.1",
142 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
143 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
144 | "license": "MIT",
145 | "dependencies": {
146 | "ms": "^2.1.3"
147 | },
148 | "engines": {
149 | "node": ">=6.0"
150 | },
151 | "peerDependenciesMeta": {
152 | "supports-color": {
153 | "optional": true
154 | }
155 | }
156 | },
157 | "node_modules/depd": {
158 | "version": "2.0.0",
159 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
160 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
161 | "license": "MIT",
162 | "engines": {
163 | "node": ">= 0.8"
164 | }
165 | },
166 | "node_modules/dunder-proto": {
167 | "version": "1.0.1",
168 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
169 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
170 | "license": "MIT",
171 | "dependencies": {
172 | "call-bind-apply-helpers": "^1.0.1",
173 | "es-errors": "^1.3.0",
174 | "gopd": "^1.2.0"
175 | },
176 | "engines": {
177 | "node": ">= 0.4"
178 | }
179 | },
180 | "node_modules/ee-first": {
181 | "version": "1.1.1",
182 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
183 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
184 | "license": "MIT"
185 | },
186 | "node_modules/encodeurl": {
187 | "version": "2.0.0",
188 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
189 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
190 | "license": "MIT",
191 | "engines": {
192 | "node": ">= 0.8"
193 | }
194 | },
195 | "node_modules/es-define-property": {
196 | "version": "1.0.1",
197 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
198 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
199 | "license": "MIT",
200 | "engines": {
201 | "node": ">= 0.4"
202 | }
203 | },
204 | "node_modules/es-errors": {
205 | "version": "1.3.0",
206 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
207 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
208 | "license": "MIT",
209 | "engines": {
210 | "node": ">= 0.4"
211 | }
212 | },
213 | "node_modules/es-object-atoms": {
214 | "version": "1.1.1",
215 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
216 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
217 | "license": "MIT",
218 | "dependencies": {
219 | "es-errors": "^1.3.0"
220 | },
221 | "engines": {
222 | "node": ">= 0.4"
223 | }
224 | },
225 | "node_modules/escape-html": {
226 | "version": "1.0.3",
227 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
228 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
229 | "license": "MIT"
230 | },
231 | "node_modules/etag": {
232 | "version": "1.8.1",
233 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
234 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
235 | "license": "MIT",
236 | "engines": {
237 | "node": ">= 0.6"
238 | }
239 | },
240 | "node_modules/express": {
241 | "version": "5.1.0",
242 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
243 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
244 | "license": "MIT",
245 | "dependencies": {
246 | "accepts": "^2.0.0",
247 | "body-parser": "^2.2.0",
248 | "content-disposition": "^1.0.0",
249 | "content-type": "^1.0.5",
250 | "cookie": "^0.7.1",
251 | "cookie-signature": "^1.2.1",
252 | "debug": "^4.4.0",
253 | "encodeurl": "^2.0.0",
254 | "escape-html": "^1.0.3",
255 | "etag": "^1.8.1",
256 | "finalhandler": "^2.1.0",
257 | "fresh": "^2.0.0",
258 | "http-errors": "^2.0.0",
259 | "merge-descriptors": "^2.0.0",
260 | "mime-types": "^3.0.0",
261 | "on-finished": "^2.4.1",
262 | "once": "^1.4.0",
263 | "parseurl": "^1.3.3",
264 | "proxy-addr": "^2.0.7",
265 | "qs": "^6.14.0",
266 | "range-parser": "^1.2.1",
267 | "router": "^2.2.0",
268 | "send": "^1.1.0",
269 | "serve-static": "^2.2.0",
270 | "statuses": "^2.0.1",
271 | "type-is": "^2.0.1",
272 | "vary": "^1.1.2"
273 | },
274 | "engines": {
275 | "node": ">= 18"
276 | },
277 | "funding": {
278 | "type": "opencollective",
279 | "url": "https://opencollective.com/express"
280 | }
281 | },
282 | "node_modules/finalhandler": {
283 | "version": "2.1.0",
284 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
285 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
286 | "license": "MIT",
287 | "dependencies": {
288 | "debug": "^4.4.0",
289 | "encodeurl": "^2.0.0",
290 | "escape-html": "^1.0.3",
291 | "on-finished": "^2.4.1",
292 | "parseurl": "^1.3.3",
293 | "statuses": "^2.0.1"
294 | },
295 | "engines": {
296 | "node": ">= 0.8"
297 | }
298 | },
299 | "node_modules/forwarded": {
300 | "version": "0.2.0",
301 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
302 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
303 | "license": "MIT",
304 | "engines": {
305 | "node": ">= 0.6"
306 | }
307 | },
308 | "node_modules/fresh": {
309 | "version": "2.0.0",
310 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
311 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
312 | "license": "MIT",
313 | "engines": {
314 | "node": ">= 0.8"
315 | }
316 | },
317 | "node_modules/function-bind": {
318 | "version": "1.1.2",
319 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
320 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
321 | "license": "MIT",
322 | "funding": {
323 | "url": "https://github.com/sponsors/ljharb"
324 | }
325 | },
326 | "node_modules/get-intrinsic": {
327 | "version": "1.3.0",
328 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
329 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
330 | "license": "MIT",
331 | "dependencies": {
332 | "call-bind-apply-helpers": "^1.0.2",
333 | "es-define-property": "^1.0.1",
334 | "es-errors": "^1.3.0",
335 | "es-object-atoms": "^1.1.1",
336 | "function-bind": "^1.1.2",
337 | "get-proto": "^1.0.1",
338 | "gopd": "^1.2.0",
339 | "has-symbols": "^1.1.0",
340 | "hasown": "^2.0.2",
341 | "math-intrinsics": "^1.1.0"
342 | },
343 | "engines": {
344 | "node": ">= 0.4"
345 | },
346 | "funding": {
347 | "url": "https://github.com/sponsors/ljharb"
348 | }
349 | },
350 | "node_modules/get-proto": {
351 | "version": "1.0.1",
352 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
353 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
354 | "license": "MIT",
355 | "dependencies": {
356 | "dunder-proto": "^1.0.1",
357 | "es-object-atoms": "^1.0.0"
358 | },
359 | "engines": {
360 | "node": ">= 0.4"
361 | }
362 | },
363 | "node_modules/gopd": {
364 | "version": "1.2.0",
365 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
366 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
367 | "license": "MIT",
368 | "engines": {
369 | "node": ">= 0.4"
370 | },
371 | "funding": {
372 | "url": "https://github.com/sponsors/ljharb"
373 | }
374 | },
375 | "node_modules/has-symbols": {
376 | "version": "1.1.0",
377 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
378 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
379 | "license": "MIT",
380 | "engines": {
381 | "node": ">= 0.4"
382 | },
383 | "funding": {
384 | "url": "https://github.com/sponsors/ljharb"
385 | }
386 | },
387 | "node_modules/hasown": {
388 | "version": "2.0.2",
389 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
390 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
391 | "license": "MIT",
392 | "dependencies": {
393 | "function-bind": "^1.1.2"
394 | },
395 | "engines": {
396 | "node": ">= 0.4"
397 | }
398 | },
399 | "node_modules/http-errors": {
400 | "version": "2.0.0",
401 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
402 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
403 | "license": "MIT",
404 | "dependencies": {
405 | "depd": "2.0.0",
406 | "inherits": "2.0.4",
407 | "setprototypeof": "1.2.0",
408 | "statuses": "2.0.1",
409 | "toidentifier": "1.0.1"
410 | },
411 | "engines": {
412 | "node": ">= 0.8"
413 | }
414 | },
415 | "node_modules/http-errors/node_modules/statuses": {
416 | "version": "2.0.1",
417 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
418 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
419 | "license": "MIT",
420 | "engines": {
421 | "node": ">= 0.8"
422 | }
423 | },
424 | "node_modules/iconv-lite": {
425 | "version": "0.6.3",
426 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
427 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
428 | "license": "MIT",
429 | "dependencies": {
430 | "safer-buffer": ">= 2.1.2 < 3.0.0"
431 | },
432 | "engines": {
433 | "node": ">=0.10.0"
434 | }
435 | },
436 | "node_modules/inherits": {
437 | "version": "2.0.4",
438 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
439 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
440 | "license": "ISC"
441 | },
442 | "node_modules/ipaddr.js": {
443 | "version": "1.9.1",
444 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
445 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
446 | "license": "MIT",
447 | "engines": {
448 | "node": ">= 0.10"
449 | }
450 | },
451 | "node_modules/is-promise": {
452 | "version": "4.0.0",
453 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
454 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
455 | "license": "MIT"
456 | },
457 | "node_modules/kafkajs": {
458 | "version": "2.2.4",
459 | "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz",
460 | "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==",
461 | "license": "MIT",
462 | "engines": {
463 | "node": ">=14.0.0"
464 | }
465 | },
466 | "node_modules/math-intrinsics": {
467 | "version": "1.1.0",
468 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
469 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
470 | "license": "MIT",
471 | "engines": {
472 | "node": ">= 0.4"
473 | }
474 | },
475 | "node_modules/media-typer": {
476 | "version": "1.1.0",
477 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
478 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
479 | "license": "MIT",
480 | "engines": {
481 | "node": ">= 0.8"
482 | }
483 | },
484 | "node_modules/merge-descriptors": {
485 | "version": "2.0.0",
486 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
487 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
488 | "license": "MIT",
489 | "engines": {
490 | "node": ">=18"
491 | },
492 | "funding": {
493 | "url": "https://github.com/sponsors/sindresorhus"
494 | }
495 | },
496 | "node_modules/mime-db": {
497 | "version": "1.54.0",
498 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
499 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
500 | "license": "MIT",
501 | "engines": {
502 | "node": ">= 0.6"
503 | }
504 | },
505 | "node_modules/mime-types": {
506 | "version": "3.0.1",
507 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
508 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
509 | "license": "MIT",
510 | "dependencies": {
511 | "mime-db": "^1.54.0"
512 | },
513 | "engines": {
514 | "node": ">= 0.6"
515 | }
516 | },
517 | "node_modules/ms": {
518 | "version": "2.1.3",
519 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
520 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
521 | "license": "MIT"
522 | },
523 | "node_modules/negotiator": {
524 | "version": "1.0.0",
525 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
526 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
527 | "license": "MIT",
528 | "engines": {
529 | "node": ">= 0.6"
530 | }
531 | },
532 | "node_modules/object-assign": {
533 | "version": "4.1.1",
534 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
535 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
536 | "license": "MIT",
537 | "engines": {
538 | "node": ">=0.10.0"
539 | }
540 | },
541 | "node_modules/object-inspect": {
542 | "version": "1.13.4",
543 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
544 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
545 | "license": "MIT",
546 | "engines": {
547 | "node": ">= 0.4"
548 | },
549 | "funding": {
550 | "url": "https://github.com/sponsors/ljharb"
551 | }
552 | },
553 | "node_modules/on-finished": {
554 | "version": "2.4.1",
555 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
556 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
557 | "license": "MIT",
558 | "dependencies": {
559 | "ee-first": "1.1.1"
560 | },
561 | "engines": {
562 | "node": ">= 0.8"
563 | }
564 | },
565 | "node_modules/once": {
566 | "version": "1.4.0",
567 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
568 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
569 | "license": "ISC",
570 | "dependencies": {
571 | "wrappy": "1"
572 | }
573 | },
574 | "node_modules/parseurl": {
575 | "version": "1.3.3",
576 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
577 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
578 | "license": "MIT",
579 | "engines": {
580 | "node": ">= 0.8"
581 | }
582 | },
583 | "node_modules/path-to-regexp": {
584 | "version": "8.2.0",
585 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
586 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
587 | "license": "MIT",
588 | "engines": {
589 | "node": ">=16"
590 | }
591 | },
592 | "node_modules/proxy-addr": {
593 | "version": "2.0.7",
594 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
595 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
596 | "license": "MIT",
597 | "dependencies": {
598 | "forwarded": "0.2.0",
599 | "ipaddr.js": "1.9.1"
600 | },
601 | "engines": {
602 | "node": ">= 0.10"
603 | }
604 | },
605 | "node_modules/qs": {
606 | "version": "6.14.0",
607 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
608 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
609 | "license": "BSD-3-Clause",
610 | "dependencies": {
611 | "side-channel": "^1.1.0"
612 | },
613 | "engines": {
614 | "node": ">=0.6"
615 | },
616 | "funding": {
617 | "url": "https://github.com/sponsors/ljharb"
618 | }
619 | },
620 | "node_modules/range-parser": {
621 | "version": "1.2.1",
622 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
623 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
624 | "license": "MIT",
625 | "engines": {
626 | "node": ">= 0.6"
627 | }
628 | },
629 | "node_modules/raw-body": {
630 | "version": "3.0.0",
631 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
632 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
633 | "license": "MIT",
634 | "dependencies": {
635 | "bytes": "3.1.2",
636 | "http-errors": "2.0.0",
637 | "iconv-lite": "0.6.3",
638 | "unpipe": "1.0.0"
639 | },
640 | "engines": {
641 | "node": ">= 0.8"
642 | }
643 | },
644 | "node_modules/router": {
645 | "version": "2.2.0",
646 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
647 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
648 | "license": "MIT",
649 | "dependencies": {
650 | "debug": "^4.4.0",
651 | "depd": "^2.0.0",
652 | "is-promise": "^4.0.0",
653 | "parseurl": "^1.3.3",
654 | "path-to-regexp": "^8.0.0"
655 | },
656 | "engines": {
657 | "node": ">= 18"
658 | }
659 | },
660 | "node_modules/safe-buffer": {
661 | "version": "5.2.1",
662 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
663 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
664 | "funding": [
665 | {
666 | "type": "github",
667 | "url": "https://github.com/sponsors/feross"
668 | },
669 | {
670 | "type": "patreon",
671 | "url": "https://www.patreon.com/feross"
672 | },
673 | {
674 | "type": "consulting",
675 | "url": "https://feross.org/support"
676 | }
677 | ],
678 | "license": "MIT"
679 | },
680 | "node_modules/safer-buffer": {
681 | "version": "2.1.2",
682 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
683 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
684 | "license": "MIT"
685 | },
686 | "node_modules/send": {
687 | "version": "1.2.0",
688 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
689 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
690 | "license": "MIT",
691 | "dependencies": {
692 | "debug": "^4.3.5",
693 | "encodeurl": "^2.0.0",
694 | "escape-html": "^1.0.3",
695 | "etag": "^1.8.1",
696 | "fresh": "^2.0.0",
697 | "http-errors": "^2.0.0",
698 | "mime-types": "^3.0.1",
699 | "ms": "^2.1.3",
700 | "on-finished": "^2.4.1",
701 | "range-parser": "^1.2.1",
702 | "statuses": "^2.0.1"
703 | },
704 | "engines": {
705 | "node": ">= 18"
706 | }
707 | },
708 | "node_modules/serve-static": {
709 | "version": "2.2.0",
710 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
711 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
712 | "license": "MIT",
713 | "dependencies": {
714 | "encodeurl": "^2.0.0",
715 | "escape-html": "^1.0.3",
716 | "parseurl": "^1.3.3",
717 | "send": "^1.2.0"
718 | },
719 | "engines": {
720 | "node": ">= 18"
721 | }
722 | },
723 | "node_modules/setprototypeof": {
724 | "version": "1.2.0",
725 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
726 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
727 | "license": "ISC"
728 | },
729 | "node_modules/side-channel": {
730 | "version": "1.1.0",
731 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
732 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
733 | "license": "MIT",
734 | "dependencies": {
735 | "es-errors": "^1.3.0",
736 | "object-inspect": "^1.13.3",
737 | "side-channel-list": "^1.0.0",
738 | "side-channel-map": "^1.0.1",
739 | "side-channel-weakmap": "^1.0.2"
740 | },
741 | "engines": {
742 | "node": ">= 0.4"
743 | },
744 | "funding": {
745 | "url": "https://github.com/sponsors/ljharb"
746 | }
747 | },
748 | "node_modules/side-channel-list": {
749 | "version": "1.0.0",
750 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
751 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
752 | "license": "MIT",
753 | "dependencies": {
754 | "es-errors": "^1.3.0",
755 | "object-inspect": "^1.13.3"
756 | },
757 | "engines": {
758 | "node": ">= 0.4"
759 | },
760 | "funding": {
761 | "url": "https://github.com/sponsors/ljharb"
762 | }
763 | },
764 | "node_modules/side-channel-map": {
765 | "version": "1.0.1",
766 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
767 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
768 | "license": "MIT",
769 | "dependencies": {
770 | "call-bound": "^1.0.2",
771 | "es-errors": "^1.3.0",
772 | "get-intrinsic": "^1.2.5",
773 | "object-inspect": "^1.13.3"
774 | },
775 | "engines": {
776 | "node": ">= 0.4"
777 | },
778 | "funding": {
779 | "url": "https://github.com/sponsors/ljharb"
780 | }
781 | },
782 | "node_modules/side-channel-weakmap": {
783 | "version": "1.0.2",
784 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
785 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
786 | "license": "MIT",
787 | "dependencies": {
788 | "call-bound": "^1.0.2",
789 | "es-errors": "^1.3.0",
790 | "get-intrinsic": "^1.2.5",
791 | "object-inspect": "^1.13.3",
792 | "side-channel-map": "^1.0.1"
793 | },
794 | "engines": {
795 | "node": ">= 0.4"
796 | },
797 | "funding": {
798 | "url": "https://github.com/sponsors/ljharb"
799 | }
800 | },
801 | "node_modules/statuses": {
802 | "version": "2.0.2",
803 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
804 | "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
805 | "license": "MIT",
806 | "engines": {
807 | "node": ">= 0.8"
808 | }
809 | },
810 | "node_modules/toidentifier": {
811 | "version": "1.0.1",
812 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
813 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
814 | "license": "MIT",
815 | "engines": {
816 | "node": ">=0.6"
817 | }
818 | },
819 | "node_modules/type-is": {
820 | "version": "2.0.1",
821 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
822 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
823 | "license": "MIT",
824 | "dependencies": {
825 | "content-type": "^1.0.5",
826 | "media-typer": "^1.1.0",
827 | "mime-types": "^3.0.0"
828 | },
829 | "engines": {
830 | "node": ">= 0.6"
831 | }
832 | },
833 | "node_modules/unpipe": {
834 | "version": "1.0.0",
835 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
836 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
837 | "license": "MIT",
838 | "engines": {
839 | "node": ">= 0.8"
840 | }
841 | },
842 | "node_modules/vary": {
843 | "version": "1.1.2",
844 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
845 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
846 | "license": "MIT",
847 | "engines": {
848 | "node": ">= 0.8"
849 | }
850 | },
851 | "node_modules/wrappy": {
852 | "version": "1.0.2",
853 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
854 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
855 | "license": "ISC"
856 | }
857 | }
858 | }
859 |
--------------------------------------------------------------------------------
/1-without-microservices/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "backend",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "cors": "^2.8.5",
13 | "express": "^5.1.0",
14 | "uuid": "^11.1.0"
15 | }
16 | },
17 | "node_modules/accepts": {
18 | "version": "2.0.0",
19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
20 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
21 | "license": "MIT",
22 | "dependencies": {
23 | "mime-types": "^3.0.0",
24 | "negotiator": "^1.0.0"
25 | },
26 | "engines": {
27 | "node": ">= 0.6"
28 | }
29 | },
30 | "node_modules/body-parser": {
31 | "version": "2.2.0",
32 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
33 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
34 | "license": "MIT",
35 | "dependencies": {
36 | "bytes": "^3.1.2",
37 | "content-type": "^1.0.5",
38 | "debug": "^4.4.0",
39 | "http-errors": "^2.0.0",
40 | "iconv-lite": "^0.6.3",
41 | "on-finished": "^2.4.1",
42 | "qs": "^6.14.0",
43 | "raw-body": "^3.0.0",
44 | "type-is": "^2.0.0"
45 | },
46 | "engines": {
47 | "node": ">=18"
48 | }
49 | },
50 | "node_modules/bytes": {
51 | "version": "3.1.2",
52 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
53 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
54 | "license": "MIT",
55 | "engines": {
56 | "node": ">= 0.8"
57 | }
58 | },
59 | "node_modules/call-bind-apply-helpers": {
60 | "version": "1.0.2",
61 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
62 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
63 | "license": "MIT",
64 | "dependencies": {
65 | "es-errors": "^1.3.0",
66 | "function-bind": "^1.1.2"
67 | },
68 | "engines": {
69 | "node": ">= 0.4"
70 | }
71 | },
72 | "node_modules/call-bound": {
73 | "version": "1.0.4",
74 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
75 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
76 | "license": "MIT",
77 | "dependencies": {
78 | "call-bind-apply-helpers": "^1.0.2",
79 | "get-intrinsic": "^1.3.0"
80 | },
81 | "engines": {
82 | "node": ">= 0.4"
83 | },
84 | "funding": {
85 | "url": "https://github.com/sponsors/ljharb"
86 | }
87 | },
88 | "node_modules/content-disposition": {
89 | "version": "1.0.0",
90 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
91 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
92 | "license": "MIT",
93 | "dependencies": {
94 | "safe-buffer": "5.2.1"
95 | },
96 | "engines": {
97 | "node": ">= 0.6"
98 | }
99 | },
100 | "node_modules/content-type": {
101 | "version": "1.0.5",
102 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
103 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
104 | "license": "MIT",
105 | "engines": {
106 | "node": ">= 0.6"
107 | }
108 | },
109 | "node_modules/cookie": {
110 | "version": "0.7.2",
111 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
112 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
113 | "license": "MIT",
114 | "engines": {
115 | "node": ">= 0.6"
116 | }
117 | },
118 | "node_modules/cookie-signature": {
119 | "version": "1.2.2",
120 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
121 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
122 | "license": "MIT",
123 | "engines": {
124 | "node": ">=6.6.0"
125 | }
126 | },
127 | "node_modules/cors": {
128 | "version": "2.8.5",
129 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
130 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
131 | "license": "MIT",
132 | "dependencies": {
133 | "object-assign": "^4",
134 | "vary": "^1"
135 | },
136 | "engines": {
137 | "node": ">= 0.10"
138 | }
139 | },
140 | "node_modules/debug": {
141 | "version": "4.4.1",
142 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
143 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
144 | "license": "MIT",
145 | "dependencies": {
146 | "ms": "^2.1.3"
147 | },
148 | "engines": {
149 | "node": ">=6.0"
150 | },
151 | "peerDependenciesMeta": {
152 | "supports-color": {
153 | "optional": true
154 | }
155 | }
156 | },
157 | "node_modules/depd": {
158 | "version": "2.0.0",
159 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
160 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
161 | "license": "MIT",
162 | "engines": {
163 | "node": ">= 0.8"
164 | }
165 | },
166 | "node_modules/dunder-proto": {
167 | "version": "1.0.1",
168 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
169 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
170 | "license": "MIT",
171 | "dependencies": {
172 | "call-bind-apply-helpers": "^1.0.1",
173 | "es-errors": "^1.3.0",
174 | "gopd": "^1.2.0"
175 | },
176 | "engines": {
177 | "node": ">= 0.4"
178 | }
179 | },
180 | "node_modules/ee-first": {
181 | "version": "1.1.1",
182 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
183 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
184 | "license": "MIT"
185 | },
186 | "node_modules/encodeurl": {
187 | "version": "2.0.0",
188 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
189 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
190 | "license": "MIT",
191 | "engines": {
192 | "node": ">= 0.8"
193 | }
194 | },
195 | "node_modules/es-define-property": {
196 | "version": "1.0.1",
197 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
198 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
199 | "license": "MIT",
200 | "engines": {
201 | "node": ">= 0.4"
202 | }
203 | },
204 | "node_modules/es-errors": {
205 | "version": "1.3.0",
206 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
207 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
208 | "license": "MIT",
209 | "engines": {
210 | "node": ">= 0.4"
211 | }
212 | },
213 | "node_modules/es-object-atoms": {
214 | "version": "1.1.1",
215 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
216 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
217 | "license": "MIT",
218 | "dependencies": {
219 | "es-errors": "^1.3.0"
220 | },
221 | "engines": {
222 | "node": ">= 0.4"
223 | }
224 | },
225 | "node_modules/escape-html": {
226 | "version": "1.0.3",
227 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
228 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
229 | "license": "MIT"
230 | },
231 | "node_modules/etag": {
232 | "version": "1.8.1",
233 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
234 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
235 | "license": "MIT",
236 | "engines": {
237 | "node": ">= 0.6"
238 | }
239 | },
240 | "node_modules/express": {
241 | "version": "5.1.0",
242 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
243 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
244 | "license": "MIT",
245 | "dependencies": {
246 | "accepts": "^2.0.0",
247 | "body-parser": "^2.2.0",
248 | "content-disposition": "^1.0.0",
249 | "content-type": "^1.0.5",
250 | "cookie": "^0.7.1",
251 | "cookie-signature": "^1.2.1",
252 | "debug": "^4.4.0",
253 | "encodeurl": "^2.0.0",
254 | "escape-html": "^1.0.3",
255 | "etag": "^1.8.1",
256 | "finalhandler": "^2.1.0",
257 | "fresh": "^2.0.0",
258 | "http-errors": "^2.0.0",
259 | "merge-descriptors": "^2.0.0",
260 | "mime-types": "^3.0.0",
261 | "on-finished": "^2.4.1",
262 | "once": "^1.4.0",
263 | "parseurl": "^1.3.3",
264 | "proxy-addr": "^2.0.7",
265 | "qs": "^6.14.0",
266 | "range-parser": "^1.2.1",
267 | "router": "^2.2.0",
268 | "send": "^1.1.0",
269 | "serve-static": "^2.2.0",
270 | "statuses": "^2.0.1",
271 | "type-is": "^2.0.1",
272 | "vary": "^1.1.2"
273 | },
274 | "engines": {
275 | "node": ">= 18"
276 | },
277 | "funding": {
278 | "type": "opencollective",
279 | "url": "https://opencollective.com/express"
280 | }
281 | },
282 | "node_modules/finalhandler": {
283 | "version": "2.1.0",
284 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
285 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
286 | "license": "MIT",
287 | "dependencies": {
288 | "debug": "^4.4.0",
289 | "encodeurl": "^2.0.0",
290 | "escape-html": "^1.0.3",
291 | "on-finished": "^2.4.1",
292 | "parseurl": "^1.3.3",
293 | "statuses": "^2.0.1"
294 | },
295 | "engines": {
296 | "node": ">= 0.8"
297 | }
298 | },
299 | "node_modules/forwarded": {
300 | "version": "0.2.0",
301 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
302 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
303 | "license": "MIT",
304 | "engines": {
305 | "node": ">= 0.6"
306 | }
307 | },
308 | "node_modules/fresh": {
309 | "version": "2.0.0",
310 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
311 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
312 | "license": "MIT",
313 | "engines": {
314 | "node": ">= 0.8"
315 | }
316 | },
317 | "node_modules/function-bind": {
318 | "version": "1.1.2",
319 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
320 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
321 | "license": "MIT",
322 | "funding": {
323 | "url": "https://github.com/sponsors/ljharb"
324 | }
325 | },
326 | "node_modules/get-intrinsic": {
327 | "version": "1.3.0",
328 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
329 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
330 | "license": "MIT",
331 | "dependencies": {
332 | "call-bind-apply-helpers": "^1.0.2",
333 | "es-define-property": "^1.0.1",
334 | "es-errors": "^1.3.0",
335 | "es-object-atoms": "^1.1.1",
336 | "function-bind": "^1.1.2",
337 | "get-proto": "^1.0.1",
338 | "gopd": "^1.2.0",
339 | "has-symbols": "^1.1.0",
340 | "hasown": "^2.0.2",
341 | "math-intrinsics": "^1.1.0"
342 | },
343 | "engines": {
344 | "node": ">= 0.4"
345 | },
346 | "funding": {
347 | "url": "https://github.com/sponsors/ljharb"
348 | }
349 | },
350 | "node_modules/get-proto": {
351 | "version": "1.0.1",
352 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
353 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
354 | "license": "MIT",
355 | "dependencies": {
356 | "dunder-proto": "^1.0.1",
357 | "es-object-atoms": "^1.0.0"
358 | },
359 | "engines": {
360 | "node": ">= 0.4"
361 | }
362 | },
363 | "node_modules/gopd": {
364 | "version": "1.2.0",
365 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
366 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
367 | "license": "MIT",
368 | "engines": {
369 | "node": ">= 0.4"
370 | },
371 | "funding": {
372 | "url": "https://github.com/sponsors/ljharb"
373 | }
374 | },
375 | "node_modules/has-symbols": {
376 | "version": "1.1.0",
377 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
378 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
379 | "license": "MIT",
380 | "engines": {
381 | "node": ">= 0.4"
382 | },
383 | "funding": {
384 | "url": "https://github.com/sponsors/ljharb"
385 | }
386 | },
387 | "node_modules/hasown": {
388 | "version": "2.0.2",
389 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
390 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
391 | "license": "MIT",
392 | "dependencies": {
393 | "function-bind": "^1.1.2"
394 | },
395 | "engines": {
396 | "node": ">= 0.4"
397 | }
398 | },
399 | "node_modules/http-errors": {
400 | "version": "2.0.0",
401 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
402 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
403 | "license": "MIT",
404 | "dependencies": {
405 | "depd": "2.0.0",
406 | "inherits": "2.0.4",
407 | "setprototypeof": "1.2.0",
408 | "statuses": "2.0.1",
409 | "toidentifier": "1.0.1"
410 | },
411 | "engines": {
412 | "node": ">= 0.8"
413 | }
414 | },
415 | "node_modules/http-errors/node_modules/statuses": {
416 | "version": "2.0.1",
417 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
418 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
419 | "license": "MIT",
420 | "engines": {
421 | "node": ">= 0.8"
422 | }
423 | },
424 | "node_modules/iconv-lite": {
425 | "version": "0.6.3",
426 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
427 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
428 | "license": "MIT",
429 | "dependencies": {
430 | "safer-buffer": ">= 2.1.2 < 3.0.0"
431 | },
432 | "engines": {
433 | "node": ">=0.10.0"
434 | }
435 | },
436 | "node_modules/inherits": {
437 | "version": "2.0.4",
438 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
439 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
440 | "license": "ISC"
441 | },
442 | "node_modules/ipaddr.js": {
443 | "version": "1.9.1",
444 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
445 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
446 | "license": "MIT",
447 | "engines": {
448 | "node": ">= 0.10"
449 | }
450 | },
451 | "node_modules/is-promise": {
452 | "version": "4.0.0",
453 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
454 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
455 | "license": "MIT"
456 | },
457 | "node_modules/math-intrinsics": {
458 | "version": "1.1.0",
459 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
460 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
461 | "license": "MIT",
462 | "engines": {
463 | "node": ">= 0.4"
464 | }
465 | },
466 | "node_modules/media-typer": {
467 | "version": "1.1.0",
468 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
469 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
470 | "license": "MIT",
471 | "engines": {
472 | "node": ">= 0.8"
473 | }
474 | },
475 | "node_modules/merge-descriptors": {
476 | "version": "2.0.0",
477 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
478 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
479 | "license": "MIT",
480 | "engines": {
481 | "node": ">=18"
482 | },
483 | "funding": {
484 | "url": "https://github.com/sponsors/sindresorhus"
485 | }
486 | },
487 | "node_modules/mime-db": {
488 | "version": "1.54.0",
489 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
490 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
491 | "license": "MIT",
492 | "engines": {
493 | "node": ">= 0.6"
494 | }
495 | },
496 | "node_modules/mime-types": {
497 | "version": "3.0.1",
498 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
499 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
500 | "license": "MIT",
501 | "dependencies": {
502 | "mime-db": "^1.54.0"
503 | },
504 | "engines": {
505 | "node": ">= 0.6"
506 | }
507 | },
508 | "node_modules/ms": {
509 | "version": "2.1.3",
510 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
511 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
512 | "license": "MIT"
513 | },
514 | "node_modules/negotiator": {
515 | "version": "1.0.0",
516 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
517 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
518 | "license": "MIT",
519 | "engines": {
520 | "node": ">= 0.6"
521 | }
522 | },
523 | "node_modules/object-assign": {
524 | "version": "4.1.1",
525 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
526 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
527 | "license": "MIT",
528 | "engines": {
529 | "node": ">=0.10.0"
530 | }
531 | },
532 | "node_modules/object-inspect": {
533 | "version": "1.13.4",
534 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
535 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
536 | "license": "MIT",
537 | "engines": {
538 | "node": ">= 0.4"
539 | },
540 | "funding": {
541 | "url": "https://github.com/sponsors/ljharb"
542 | }
543 | },
544 | "node_modules/on-finished": {
545 | "version": "2.4.1",
546 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
547 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
548 | "license": "MIT",
549 | "dependencies": {
550 | "ee-first": "1.1.1"
551 | },
552 | "engines": {
553 | "node": ">= 0.8"
554 | }
555 | },
556 | "node_modules/once": {
557 | "version": "1.4.0",
558 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
559 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
560 | "license": "ISC",
561 | "dependencies": {
562 | "wrappy": "1"
563 | }
564 | },
565 | "node_modules/parseurl": {
566 | "version": "1.3.3",
567 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
568 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
569 | "license": "MIT",
570 | "engines": {
571 | "node": ">= 0.8"
572 | }
573 | },
574 | "node_modules/path-to-regexp": {
575 | "version": "8.2.0",
576 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
577 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
578 | "license": "MIT",
579 | "engines": {
580 | "node": ">=16"
581 | }
582 | },
583 | "node_modules/proxy-addr": {
584 | "version": "2.0.7",
585 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
586 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
587 | "license": "MIT",
588 | "dependencies": {
589 | "forwarded": "0.2.0",
590 | "ipaddr.js": "1.9.1"
591 | },
592 | "engines": {
593 | "node": ">= 0.10"
594 | }
595 | },
596 | "node_modules/qs": {
597 | "version": "6.14.0",
598 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
599 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
600 | "license": "BSD-3-Clause",
601 | "dependencies": {
602 | "side-channel": "^1.1.0"
603 | },
604 | "engines": {
605 | "node": ">=0.6"
606 | },
607 | "funding": {
608 | "url": "https://github.com/sponsors/ljharb"
609 | }
610 | },
611 | "node_modules/range-parser": {
612 | "version": "1.2.1",
613 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
614 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
615 | "license": "MIT",
616 | "engines": {
617 | "node": ">= 0.6"
618 | }
619 | },
620 | "node_modules/raw-body": {
621 | "version": "3.0.0",
622 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
623 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
624 | "license": "MIT",
625 | "dependencies": {
626 | "bytes": "3.1.2",
627 | "http-errors": "2.0.0",
628 | "iconv-lite": "0.6.3",
629 | "unpipe": "1.0.0"
630 | },
631 | "engines": {
632 | "node": ">= 0.8"
633 | }
634 | },
635 | "node_modules/router": {
636 | "version": "2.2.0",
637 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
638 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
639 | "license": "MIT",
640 | "dependencies": {
641 | "debug": "^4.4.0",
642 | "depd": "^2.0.0",
643 | "is-promise": "^4.0.0",
644 | "parseurl": "^1.3.3",
645 | "path-to-regexp": "^8.0.0"
646 | },
647 | "engines": {
648 | "node": ">= 18"
649 | }
650 | },
651 | "node_modules/safe-buffer": {
652 | "version": "5.2.1",
653 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
654 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
655 | "funding": [
656 | {
657 | "type": "github",
658 | "url": "https://github.com/sponsors/feross"
659 | },
660 | {
661 | "type": "patreon",
662 | "url": "https://www.patreon.com/feross"
663 | },
664 | {
665 | "type": "consulting",
666 | "url": "https://feross.org/support"
667 | }
668 | ],
669 | "license": "MIT"
670 | },
671 | "node_modules/safer-buffer": {
672 | "version": "2.1.2",
673 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
674 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
675 | "license": "MIT"
676 | },
677 | "node_modules/send": {
678 | "version": "1.2.0",
679 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
680 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
681 | "license": "MIT",
682 | "dependencies": {
683 | "debug": "^4.3.5",
684 | "encodeurl": "^2.0.0",
685 | "escape-html": "^1.0.3",
686 | "etag": "^1.8.1",
687 | "fresh": "^2.0.0",
688 | "http-errors": "^2.0.0",
689 | "mime-types": "^3.0.1",
690 | "ms": "^2.1.3",
691 | "on-finished": "^2.4.1",
692 | "range-parser": "^1.2.1",
693 | "statuses": "^2.0.1"
694 | },
695 | "engines": {
696 | "node": ">= 18"
697 | }
698 | },
699 | "node_modules/serve-static": {
700 | "version": "2.2.0",
701 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
702 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
703 | "license": "MIT",
704 | "dependencies": {
705 | "encodeurl": "^2.0.0",
706 | "escape-html": "^1.0.3",
707 | "parseurl": "^1.3.3",
708 | "send": "^1.2.0"
709 | },
710 | "engines": {
711 | "node": ">= 18"
712 | }
713 | },
714 | "node_modules/setprototypeof": {
715 | "version": "1.2.0",
716 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
717 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
718 | "license": "ISC"
719 | },
720 | "node_modules/side-channel": {
721 | "version": "1.1.0",
722 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
723 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
724 | "license": "MIT",
725 | "dependencies": {
726 | "es-errors": "^1.3.0",
727 | "object-inspect": "^1.13.3",
728 | "side-channel-list": "^1.0.0",
729 | "side-channel-map": "^1.0.1",
730 | "side-channel-weakmap": "^1.0.2"
731 | },
732 | "engines": {
733 | "node": ">= 0.4"
734 | },
735 | "funding": {
736 | "url": "https://github.com/sponsors/ljharb"
737 | }
738 | },
739 | "node_modules/side-channel-list": {
740 | "version": "1.0.0",
741 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
742 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
743 | "license": "MIT",
744 | "dependencies": {
745 | "es-errors": "^1.3.0",
746 | "object-inspect": "^1.13.3"
747 | },
748 | "engines": {
749 | "node": ">= 0.4"
750 | },
751 | "funding": {
752 | "url": "https://github.com/sponsors/ljharb"
753 | }
754 | },
755 | "node_modules/side-channel-map": {
756 | "version": "1.0.1",
757 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
758 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
759 | "license": "MIT",
760 | "dependencies": {
761 | "call-bound": "^1.0.2",
762 | "es-errors": "^1.3.0",
763 | "get-intrinsic": "^1.2.5",
764 | "object-inspect": "^1.13.3"
765 | },
766 | "engines": {
767 | "node": ">= 0.4"
768 | },
769 | "funding": {
770 | "url": "https://github.com/sponsors/ljharb"
771 | }
772 | },
773 | "node_modules/side-channel-weakmap": {
774 | "version": "1.0.2",
775 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
776 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
777 | "license": "MIT",
778 | "dependencies": {
779 | "call-bound": "^1.0.2",
780 | "es-errors": "^1.3.0",
781 | "get-intrinsic": "^1.2.5",
782 | "object-inspect": "^1.13.3",
783 | "side-channel-map": "^1.0.1"
784 | },
785 | "engines": {
786 | "node": ">= 0.4"
787 | },
788 | "funding": {
789 | "url": "https://github.com/sponsors/ljharb"
790 | }
791 | },
792 | "node_modules/statuses": {
793 | "version": "2.0.2",
794 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
795 | "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
796 | "license": "MIT",
797 | "engines": {
798 | "node": ">= 0.8"
799 | }
800 | },
801 | "node_modules/toidentifier": {
802 | "version": "1.0.1",
803 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
804 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
805 | "license": "MIT",
806 | "engines": {
807 | "node": ">=0.6"
808 | }
809 | },
810 | "node_modules/type-is": {
811 | "version": "2.0.1",
812 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
813 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
814 | "license": "MIT",
815 | "dependencies": {
816 | "content-type": "^1.0.5",
817 | "media-typer": "^1.1.0",
818 | "mime-types": "^3.0.0"
819 | },
820 | "engines": {
821 | "node": ">= 0.6"
822 | }
823 | },
824 | "node_modules/unpipe": {
825 | "version": "1.0.0",
826 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
827 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
828 | "license": "MIT",
829 | "engines": {
830 | "node": ">= 0.8"
831 | }
832 | },
833 | "node_modules/uuid": {
834 | "version": "11.1.0",
835 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
836 | "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
837 | "funding": [
838 | "https://github.com/sponsors/broofa",
839 | "https://github.com/sponsors/ctavan"
840 | ],
841 | "license": "MIT",
842 | "bin": {
843 | "uuid": "dist/esm/bin/uuid"
844 | }
845 | },
846 | "node_modules/vary": {
847 | "version": "1.1.2",
848 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
849 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
850 | "license": "MIT",
851 | "engines": {
852 | "node": ">= 0.8"
853 | }
854 | },
855 | "node_modules/wrappy": {
856 | "version": "1.0.2",
857 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
858 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
859 | "license": "ISC"
860 | }
861 | }
862 | }
863 |
--------------------------------------------------------------------------------