3 |
4 |
Found Something?
5 |
6 | We help people find what they’ve lost —
7 | {{ itemCount }} item(s) found so far!
8 |
9 |
10 |
11 |
16 |
23 |
28 |
29 |
30 |
31 |
32 |
0">
33 |
48 |
49 |
50 |
51 |
52 | | Item Name |
53 | Category |
54 | Last Seen Location |
55 | Lost Date |
56 | Actions |
57 |
58 |
59 |
60 |
61 | | {{ item.item_name }} |
62 | {{ item.category }} |
63 | {{ item.found_location }} |
64 | {{ item.date_found | date:'mediumDate' }} |
65 |
66 |
67 | |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
No items found. Try a different search.
77 |
78 |
79 |
80 |
81 |
82 |
Found Items
83 |
84 |
85 |
86 |
93 |
94 |
95 |
96 |
0">
97 |
98 |
99 |
109 |
110 |
111 | {{ item.item_name }}
112 |
113 |
114 |
115 |
116 |
117 | Found at:
118 | {{ item.found_location || "Not specified" }}
119 |
120 |
128 |
129 |
130 |
131 |
136 |
144 |
152 |
153 |
154 |
155 |
156 |
157 |
No found items reported yet.
158 |
159 |
--------------------------------------------------------------------------------
/lost-and-found-frontend/src/app/components/lost-items/lost-items.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Lost Something?
5 |
6 | We help people find what they’ve lost —
7 | {{ itemCount }} item(s) are lost so far!
8 |
9 |
10 |
11 |
16 |
23 |
28 |
29 |
30 |
31 |
32 |
33 |
No items found. Try a different search.
34 |
35 |
36 |
37 |
38 |
0">
39 |
47 |
48 |
49 |
50 |
51 | | Item Name |
52 | Category |
53 | Last Seen Location |
54 | Lost Date |
55 | Actions |
56 |
57 |
58 |
59 |
60 | | {{ item.itemName }} |
61 | {{ item.category }} |
62 | {{ item.lastSeenLocation }} |
63 | {{ item.dateLost | date : "mediumDate" }} |
64 |
65 |
68 | |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
Lost Items
76 |
77 |
78 |
79 |
86 |
87 |
88 |
89 |
0">
90 |
91 |
92 |
102 |
103 |
104 | {{ item.itemName }}
105 |
106 |
107 |
108 |
109 |
110 | Last Seen:
111 | {{ item.lastSeenLocation || "Not specified" }}
112 |
113 |
114 |
115 |
116 |
117 |
125 |
133 |
141 |
142 |
143 |
144 |
145 |
146 |
No lost items reported yet.
147 |
148 |
149 |
--------------------------------------------------------------------------------
/lost-and-found-frontend/src/app/components/found-items/found-items.component.ts:
--------------------------------------------------------------------------------
1 | import { Component,OnInit } from '@angular/core';
2 | import { Router } from '@angular/router';
3 | import { ApiService } from 'src/app/services/api.service';
4 | import { FoundItem } from 'src/app/models/foundItem';
5 | import { MatSnackBar,MatSnackBarModule } from '@angular/material/snack-bar';
6 | import { MatDialog } from '@angular/material/dialog';
7 | import { ItemDetailsComponent } from '../item-details/item-details.component';
8 |
9 | @Component({
10 | selector: 'app-found-items',
11 | templateUrl: './found-items.component.html',
12 | styleUrls: ['./found-items.component.css']
13 | })
14 | export class FoundItemsComponent {
15 | //to search among found items
16 | // foundItemCount = 0;
17 | searchText = '';
18 | filterLocation = '';
19 | filterCategory = '';
20 | filterDate: string = '';
21 | searchTriggered: boolean = false; // 👈 Used to show results only after search
22 | searchItems: FoundItem[] = [];
23 | today: string = new Date().toISOString().split('T')[0];
24 |
25 |
26 | //for display of found items
27 | items: FoundItem[] = [];
28 | filteredItems: FoundItem[] = [];
29 | itemCount: number = 0;
30 |
31 | constructor(
32 | private apiService: ApiService,
33 | private snackBar: MatSnackBar,
34 | private router: Router,
35 | private dialog: MatDialog
36 | ) {}
37 |
38 | ngOnInit(): void {
39 | const baseUrl = 'http://localhost:3000'; // 👈 Change if your backend URL is different
40 |
41 |
42 | this.apiService.getFoundItems().subscribe({
43 | next: (data: FoundItem[]) => {
44 | // 🔁 Update imageUrl to include backend path
45 | this.items = data.map(item => ({
46 | ...item,
47 | imageUrl: item.imageUrl ? `${baseUrl}${item.imageUrl}` : null
48 | }));
49 |
50 | this.filteredItems = this.items;
51 | this.itemCount = this.items.length;
52 | console.log(this.items);
53 |
54 | if (this.items.length === 0) {
55 | this.snackBar.open('No found items reported.', 'Close', { duration: 3000 });
56 | }
57 | },
58 | error: (error) => {
59 | console.error('API Error:', error);
60 | this.snackBar.open('Failed to load found items. Check the console.', 'Close', { duration: 3000 });
61 | }
62 | });
63 |
64 |
65 | // console.log('Found items:', this.items, '\nCount:', this.foundItemCount);
66 | }
67 |
68 | loadItems(): void {
69 | const baseUrl = 'http://localhost:3000';
70 | console.log('Inside found items')
71 | this.apiService.getFoundItems().subscribe({
72 | next: (data: FoundItem[]) => {
73 | // 🔁 Update imageUrl to include backend path
74 | this.items = data.map(item => ({
75 | ...item,
76 | imageUrl: item.imageUrl ? `${baseUrl}${item.imageUrl}` : null
77 | }));
78 |
79 | this.filteredItems = this.items;
80 | this.itemCount = this.items.length;
81 |
82 | if (this.items.length === 0) {
83 | this.snackBar.open('No found items reported.', 'Close', { duration: 3000 });
84 | }
85 | },
86 | error: (error) => {
87 | console.error('API Error:', error);
88 | this.snackBar.open('Failed to load found items. Check the console.', 'Close', { duration: 3000 });
89 | }
90 | });
91 |
92 | }
93 |
94 | applyFilters(): void {
95 | this.searchTriggered = true; // 👈 Trigger result view
96 | this.searchItems = this.items.filter(item =>
97 | (this.searchText ? item.item_name?.toLowerCase().includes(this.searchText.toLowerCase()) : true) &&
98 | (this.filterLocation ? item.found_location?.toLowerCase().includes(this.filterLocation.toLowerCase()) : true) &&
99 | (this.filterCategory ? item.category === this.filterCategory : true) &&
100 | (this.filterDate ? new Date(item.date_found).toISOString().startsWith(this.filterDate) : true)
101 | );
102 | console.log(this.searchItems);
103 | }
104 |
105 | viewDetails(id: number | undefined): void {
106 | if (id !== undefined) {
107 | // this.router.navigate(['/found-items', id]);
108 | const dialogRef = this.dialog.open(ItemDetailsComponent, {
109 | width: '800px',
110 | data: { itemId: id, itemType: 'found' } // you can pass data for edit mode if needed
111 | });
112 | }
113 | }
114 |
115 | editItem(id: number | undefined): void {
116 | if (id !== undefined) {
117 | this.router.navigate(['/update-found-items', id]);
118 | }
119 | }
120 |
121 | postLostItem(): void {
122 | this.router.navigate(['/found-items/new']);
123 | }
124 |
125 | onDelete(id: number): void {
126 | if (confirm('Are you sure you want to delete this item?')) {
127 | this.apiService.deleteFoundItem(id).subscribe(() => {
128 | alert('🗑️ Item deleted successfully');
129 | this.loadItems(); // reload updated list
130 | });
131 | }
132 | }
133 |
134 | }
135 |
--------------------------------------------------------------------------------
/lost-and-found-frontend/src/app/components/lost-item-form/lost-item-form.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import {
3 | FormBuilder,
4 | FormGroup,
5 | Validators,
6 | ReactiveFormsModule,
7 | } from '@angular/forms';
8 | import { CommonModule } from '@angular/common';
9 | import { Router, RouterModule, ActivatedRoute } from '@angular/router';
10 | import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';
11 |
12 | import { ApiService } from 'src/app/services/api.service';
13 |
14 | @Component({
15 | selector: 'app-lost-item-form',
16 | templateUrl: './lost-item-form.component.html',
17 | styleUrls: ['./lost-item-form.component.css'],
18 | })
19 | export class LostItemFormComponent {
20 | lostItemForm!: FormGroup;
21 | categories = [
22 | 'Electronics',
23 | 'Clothing',
24 | 'Documents',
25 | 'Accessories',
26 | 'Others',
27 | ];
28 | selectedImage: File | null = null;
29 | imagePreview: string | ArrayBuffer | null = null;
30 | itemId: number = 0;
31 | item: any;
32 | isEditMode: boolean = false;
33 | maxDate: Date = new Date();
34 |
35 | constructor(
36 | private route: ActivatedRoute,
37 | private fb: FormBuilder,
38 | private apiService: ApiService,
39 | private snackBar: MatSnackBar,
40 | private router: Router
41 |
42 | ) {}
43 |
44 | ngOnInit(): void {
45 | if (this.route.snapshot.params['id']) {
46 | const baseUrl = 'http://localhost:3000';
47 | this.itemId = this.route.snapshot.params['id'];
48 | this.isEditMode = true;
49 | this.apiService.getItemById(this.itemId).subscribe(data=>{
50 | this.item = data;
51 | this.item[0].imageUrl = this.item[0].imageUrl ? `${baseUrl}${this.item[0].imageUrl}` : null
52 | console.log(this.item[0].itemName);
53 | this.lostItemForm.patchValue({
54 | itemName: this.item[0].itemName,
55 | category: this.item[0].category,
56 | description: this.item[0].description,
57 | lastSeenLocation: this.item[0].lastSeenLocation,
58 | dateLost: this.item[0].dateLost,
59 | contactInfo: this.item[0].contactInfo,
60 | phone_number: this.item[0].phone_number,
61 | address: this.item[0].address,
62 |
63 | });
64 | console.log(this.item[0].imageUrl);
65 | });
66 |
67 |
68 |
69 | }
70 |
71 | console.log('inside lost item form');
72 | console.log(this.itemId);
73 | this.lostItemForm = this.fb.group({
74 | itemName: ['', Validators.required],
75 | category: ['', Validators.required],
76 | description: ['', Validators.required],
77 | lastSeenLocation: [''],
78 | dateLost: [''],
79 | contactInfo: ['', [Validators.required, Validators.email]],
80 | phone_number: [
81 | '',
82 | [Validators.required, Validators.pattern('^[0-9]{10}$')],
83 | ],
84 | address: ['', Validators.required],
85 | });
86 | }
87 |
88 | onImageSelected(event: Event): void {
89 | const input = event.target as HTMLInputElement;
90 | if (input.files && input.files.length > 0) {
91 | this.selectedImage = input.files[0];
92 | const reader = new FileReader();
93 | reader.onload = () => {
94 | this.imagePreview = reader.result;
95 | };
96 | reader.readAsDataURL(this.selectedImage);
97 | }
98 | }
99 |
100 | onSubmit(): void {
101 | if (this.lostItemForm.invalid || !this.selectedImage) {
102 | this.snackBar.open(
103 | 'Please fill all required fields and select an image',
104 | 'Close',
105 | { duration: 3000 }
106 | );
107 | return;
108 | }
109 |
110 | const formData = new FormData();
111 | Object.entries(this.lostItemForm.value).forEach(([key, value]) => {
112 | formData.append(key, value as string);
113 | });
114 | formData.append('image', this.selectedImage);
115 | if (this.itemId != 0) {
116 | console.log('inside if');
117 | this.apiService.updateLostItem(this.itemId, formData).subscribe({
118 | next: () => {
119 | this.snackBar.open('Item updated successfully!', 'Close', {
120 | duration: 3000,
121 | });
122 | this.router.navigate(['/lost-items']);
123 | },
124 | error: () => {
125 | this.snackBar.open('Something went wrong!', 'Close', {
126 | duration: 3000,
127 | });
128 | },
129 | });
130 | } else {
131 | console.log('inside else');
132 | this.apiService.createLostItem(formData).subscribe({
133 | next: () => {
134 | this.snackBar.open('Item reported successfully!', 'Close', {
135 | duration: 3000,
136 | });
137 | this.router.navigate(['/lost-items']);
138 | },
139 | error: () => {
140 | this.snackBar.open('Something went wrong!', 'Close', {
141 | duration: 3000,
142 | });
143 | },
144 | });
145 | }
146 | }
147 | }
148 |
--------------------------------------------------------------------------------
/lost-and-found-frontend/src/app/components/lost-items/lost-items.component.ts:
--------------------------------------------------------------------------------
1 | import { Component,OnInit } from '@angular/core';
2 | import { Router } from '@angular/router';
3 | import { ApiService } from 'src/app/services/api.service';
4 | import { Item } from 'src/app/models/item';
5 | import { MatSnackBar,MatSnackBarModule } from '@angular/material/snack-bar';
6 | import { MatDialog } from '@angular/material/dialog';
7 | import { LostItemFormComponent } from '../lost-item-form/lost-item-form.component';
8 | import { ItemDetailsComponent } from '../item-details/item-details.component';
9 |
10 | @Component({
11 | selector: 'app-lost-items',
12 | templateUrl: './lost-items.component.html',
13 | styleUrls: ['./lost-items.component.css']
14 | })
15 | export class LostItemsComponent implements OnInit {
16 | //for search
17 | // search text for item name and as well as location
18 | searchText = '';
19 | filterLocation = '';
20 | filterCategory = '';
21 | filterDate: string = '';
22 | searchTriggered: boolean = false;
23 | searchItems: Item[] = [];
24 | // maxDate: Date = new Date();
25 | today: string = new Date().toISOString().split('T')[0];
26 |
27 |
28 | //to display lost items
29 | items: Item[] = [];
30 | filteredItems: Item[] = [];
31 | itemCount: number = 0;
32 |
33 | constructor(
34 | private apiService: ApiService,
35 | private snackBar: MatSnackBar,
36 | private router: Router,
37 | private dialog: MatDialog,
38 | ) {}
39 |
40 | ngOnInit(): void {
41 | const baseUrl = 'http://localhost:3000'; // 👈 Change if your backend URL is different
42 |
43 | this.apiService.getLostItems().subscribe({
44 | next: (data: Item[]) => {
45 | // 🔁 Update imageUrl to include backend path
46 | this.items = data.map(item => ({
47 | ...item,
48 | imageUrl: item.imageUrl ? `${baseUrl}${item.imageUrl}` : null
49 | }));
50 |
51 | this.filteredItems = this.items;
52 | this.itemCount = this.items.length;
53 |
54 | if (this.items.length === 0) {
55 | this.snackBar.open('No lost items found.', 'Close', { duration: 3000 });
56 | }
57 | },
58 | error: (error) => {
59 | console.error('API Error:', error);
60 | this.snackBar.open('Failed to load lost items. Check the console.', 'Close', { duration: 3000 });
61 | }
62 | });
63 | }
64 |
65 | loadItems(): void {
66 | const baseUrl = 'http://localhost:3000';
67 | console.log('Inside load items')
68 | this.apiService.getLostItems().subscribe({
69 | next: (data: Item[]) => {
70 | // 🔁 Update imageUrl to include backend path
71 | this.items = data.map(item => ({
72 | ...item,
73 | imageUrl: item.imageUrl ? `${baseUrl}${item.imageUrl}` : null
74 | }));
75 |
76 | this.filteredItems = this.items;
77 | this.itemCount = this.items.length;
78 |
79 | if (this.items.length === 0) {
80 | this.snackBar.open('No lost items found.', 'Close', { duration: 3000 });
81 | }
82 | },
83 | error: (error) => {
84 | console.error('API Error:', error);
85 | this.snackBar.open('Failed to load lost items. Check the console.', 'Close', { duration: 3000 });
86 | }
87 | });
88 |
89 | }
90 |
91 | applyFilters(): void {
92 | this.searchTriggered = true; // 👈 Trigger result view
93 | this.searchItems = this.items.filter(item =>
94 | ((this.searchText ? item.itemName?.toLowerCase().includes(this.searchText.toLowerCase()) : true) ||
95 | (this.searchText ? item.lastSeenLocation?.toLowerCase().includes(this.searchText.toLowerCase()) : true)) &&
96 | (this.filterCategory ? item.category === this.filterCategory : true) &&
97 | (this.filterDate ? new Date(item.dateLost).toISOString().startsWith(this.filterDate) : true)
98 | );
99 | console.log(this.searchItems);
100 | }
101 |
102 | viewDetails(id: number | undefined): void {
103 | if (id !== undefined) {
104 | // this.router.navigate(['/lost-items', id]);
105 | const dialogRef = this.dialog.open(ItemDetailsComponent, {
106 | width: '800px',
107 | data: { itemId: id,itemType: 'lost' } // you can pass data for edit mode if needed
108 | });
109 | }
110 | }
111 |
112 | editItem(id: number ): void {
113 | if (id !== undefined) {
114 | this.router.navigate(['/update-lost-items', id]);
115 | // this.openEditDialog(id);
116 | }
117 | }
118 |
119 | postLostItem(): void {
120 | this.router.navigate(['/lost-items/new']);
121 | }
122 |
123 | onDelete(id: number): void {
124 | if (confirm('Are you sure you want to delete this item?')) {
125 | this.apiService.deleteItem(id).subscribe(() => {
126 | alert('🗑️ Item deleted successfully');
127 | this.loadItems(); // reload updated list
128 | });
129 | }
130 | }
131 |
132 | openLostItemForm(): void {
133 | const dialogRef = this.dialog.open(LostItemFormComponent, {
134 | width: '800px',
135 |
136 | });
137 |
138 |
139 |
140 | dialogRef.afterClosed().subscribe(result => {
141 | // Reload list if needed
142 | this.loadItems();
143 | });
144 | }
145 |
146 | openEditDialog(id: number): void {
147 | const dialogRef = this.dialog.open(LostItemFormComponent, {
148 | width: '800px',
149 | data: { id }
150 | });
151 |
152 | dialogRef.afterClosed().subscribe(result => {
153 | // Reload list if needed
154 | this.loadItems();
155 | });
156 | }
157 |
158 | }
159 |
--------------------------------------------------------------------------------
/lost-and-found-backend/src/index.ts:
--------------------------------------------------------------------------------
1 | import express, { Request, Response } from "express";
2 | import cors from "cors";
3 | import multer from "multer";
4 | import path from "path";
5 | import mysql from "mysql2";
6 | import { ResultSetHeader } from "mysql2";
7 | import { environment } from "./config/environment";
8 | import * as dotenv from "dotenv";
9 |
10 | dotenv.config();
11 | const app = express();
12 | const PORT = process.env.PORTNO;
13 |
14 | // Simulated __dirname (safe if you're not using ES Modules)
15 | const __dirname = path.resolve();
16 |
17 | // ✅ Middleware
18 | app.use(cors());
19 | app.use(express.json());
20 |
21 | // ✅ Serve uploaded images statically
22 | app.use("/uploads", express.static(path.join(__dirname, "uploads")));
23 |
24 | // ✅ Multer storage config
25 | const storage = multer.diskStorage({
26 | destination: path.join(__dirname, "uploads"),
27 | filename: (req, file, cb) => {
28 | cb(null, Date.now() + path.extname(file.originalname));
29 | },
30 | });
31 | const upload = multer({ storage });
32 |
33 | // ✅ MySQL connection
34 | const db = mysql.createConnection({
35 | host: process.env.DB_HOST,
36 | user: process.env.DB_USER,
37 | password: process.env.DB_PASS,
38 | database: process.env.DB_NAME,
39 | });
40 |
41 | db.connect((err) => {
42 | if (err) {
43 | console.error("❌ MySQL connection error:", err);
44 | } else {
45 | console.log("✅ Connected to MySQL");
46 | }
47 | });
48 |
49 | // ✅ POST: Lost item
50 | app.post("/api/lost-items", upload.single("image"), (req, res) => {
51 | let {
52 | itemName,
53 | category,
54 | description,
55 | lastSeenLocation,
56 | dateLost,
57 | contactInfo,
58 | phone_number,
59 | address,
60 | } = req.body;
61 | console.log(req.body);
62 | console.log(
63 | itemName,
64 | category,
65 | description,
66 | lastSeenLocation,
67 | dateLost,
68 | contactInfo,
69 | phone_number,
70 | address
71 | );
72 |
73 | const imageUrl = req.file ? `/uploads/${req.file.filename}` : null;
74 |
75 | try {
76 | dateLost = new Date(dateLost).toISOString().slice(0, 10);
77 | } catch (err) {
78 | return res.status(400).json({ message: "Invalid date format" });
79 | }
80 |
81 | const sql = `
82 | INSERT INTO items (itemName, category, description, lastSeenLocation, dateLost, contactInfo, phone_number, address, imageUrl)
83 | VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
84 | `;
85 |
86 | db.query(
87 | sql,
88 | [
89 | itemName,
90 | category,
91 | description,
92 | lastSeenLocation,
93 | dateLost,
94 | contactInfo,
95 | phone_number,
96 | address,
97 | imageUrl,
98 | ],
99 | (err, result) => {
100 | if (err) {
101 | console.error("❌ Error inserting item:", err);
102 | return res.status(500).json({ message: "Internal server error" });
103 | }
104 |
105 | const insertResult = result as ResultSetHeader;
106 | res
107 | .status(201)
108 | .json({
109 | message: "✅ Item added successfully",
110 | itemId: insertResult.insertId,
111 | });
112 | }
113 | );
114 | });
115 |
116 | // ✅ GET all lost items
117 | app.get("/api/lost-items", (req, res) => {
118 | db.query("SELECT * FROM items ORDER BY dateLost DESC", (err, results) => {
119 | if (err) {
120 | console.error("❌ Error fetching items:", err);
121 | return res.status(500).json({ message: "Internal server error" });
122 | }
123 | res.status(200).json(results);
124 | });
125 | });
126 |
127 | // GET lost item by ID
128 | app.get("/api/lost-items/:id", async (req, res) => {
129 | const itemId = req.params.id;
130 | console.log("Received request for item ID:", itemId);
131 | db.query("SELECT * FROM items where id=?", [itemId], (err, results) => {
132 | if (err) {
133 | console.error("❌ Error fetching items:", err);
134 | return res.status(500).json({ message: "Internal server error" });
135 | }
136 | res.status(200).json(results);
137 | });
138 | });
139 |
140 | // PUT lost item by ID
141 | app.put("/api/lost-items/:id", upload.single("image"), async (req, res) => {
142 | console.log("Received request to update item ID:", req.params.id);
143 | const itemId = req.params.id;
144 | const { itemName, category, description, lastSeenLocation, contactInfo } =
145 | req.body;
146 | const imageUrl = req.file ? `/uploads/${req.file.filename}` : null;
147 | console.log(req.body);
148 | console.log(itemName, category, description, lastSeenLocation, contactInfo);
149 |
150 | if (!itemName || !category || !description || !contactInfo) {
151 | console.error("❌ Missing required fields");
152 | return res.status(400).json({ message: "Missing required fields" });
153 | }
154 |
155 | const sql = `UPDATE items SET itemName=?, category=?, description=?, lastSeenLocation=?, contactInfo=?, imageUrl=? WHERE id=?`;
156 |
157 | db.query(
158 | sql,
159 | [
160 | itemName,
161 | category,
162 | description,
163 | lastSeenLocation,
164 | contactInfo,
165 | imageUrl,
166 | itemId,
167 | ],
168 | (err, result) => {
169 | if (err) {
170 | console.error("❌ Error inserting item:", err);
171 | return res.status(500).json({ message: "Internal server error" });
172 | }
173 |
174 | const insertResult = result as ResultSetHeader;
175 | res
176 | .status(201)
177 | .json({
178 | message: "✅ Item updated successfully",
179 | itemId: insertResult.insertId,
180 | });
181 | }
182 | );
183 | });
184 |
185 | app.delete("/api/lost-items/:id", async (req: Request, res: Response) => {
186 | const itemId = req.params.id;
187 | console.log(itemId);
188 | try {
189 | const result = await db.execute("DELETE FROM items WHERE id = ?", [itemId]);
190 | const deleteResult = result as any;
191 |
192 | if (deleteResult.affectedRows > 0) {
193 | res.status(200).json({ message: "✅ Item deleted successfully" });
194 | } else {
195 | res.status(200).json({ message: "✅ Item deleted successfully" });
196 | }
197 | } catch (error) {
198 | console.error("❌ Error deleting item:", error);
199 | res.status(500).json({ message: "Internal server error", error });
200 | }
201 | });
202 |
203 | // ✅ GET all found items
204 | app.get("/api/found-items", (req, res) => {
205 | db.query(
206 | "SELECT * FROM Found_Items ORDER BY date_found DESC",
207 | (err, results) => {
208 | if (err) {
209 | console.error("❌ Error fetching items:", err);
210 | return res.status(500).json({ message: "Internal server error" });
211 | }
212 | res.status(200).json(results);
213 | }
214 | );
215 | });
216 |
217 | // GET found item by ID
218 | app.get("/api/found-items/:id", async (req, res) => {
219 | const itemId = req.params.id;
220 | console.log("Received request for lost item ID:", itemId);
221 | db.query("SELECT * FROM found_items where id=?", [itemId], (err, results) => {
222 | if (err) {
223 | console.error("❌ Error fetching items:", err);
224 | return res.status(500).json({ message: "Internal server error" });
225 | }
226 | res.status(200).json(results);
227 | });
228 | });
229 |
230 | // ✅ POST: Found item
231 | app.post("/api/found-items", upload.single("image"), (req, res) => {
232 | console.log("Received request to add found item");
233 | let {
234 | item_name,
235 | category,
236 | description,
237 | found_location,
238 | date_found,
239 | contact_info,
240 | phone_number,
241 | address,
242 | } = req.body;
243 | console.log(req.body);
244 | // console.log(itemName, category, description, lastSeenLocation, dateLost, contactInfo)
245 |
246 | const imageUrl = req.file ? `/uploads/${req.file.filename}` : null;
247 |
248 | try {
249 | date_found = new Date(date_found).toISOString().slice(0, 10);
250 | } catch (err) {
251 | return res.status(400).json({ message: "Invalid date format" });
252 | }
253 |
254 | const sql = `
255 | INSERT INTO Found_Items (item_name, category, description, found_location, date_found, contact_info, phone_number, address, imageUrl)
256 | VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
257 | `;
258 |
259 | db.query(
260 | sql,
261 | [
262 | item_name,
263 | category,
264 | description,
265 | found_location,
266 | date_found,
267 | contact_info,
268 | phone_number,
269 | address,
270 | imageUrl,
271 | ],
272 | (err, result) => {
273 | if (err) {
274 | console.error("❌ Error inserting item:", err);
275 | return res.status(500).json({ message: "Internal server error" });
276 | }
277 |
278 | const insertResult = result as ResultSetHeader;
279 | res
280 | .status(201)
281 | .json({
282 | message: "✅ Item added successfully",
283 | itemId: insertResult.insertId,
284 | });
285 | }
286 | );
287 | });
288 |
289 | // PUT found item by ID
290 | app.put("/api/found-items/:id", upload.single("image"), async (req, res) => {
291 | console.log("Received request to update item ID:", req.params.id);
292 | const itemId = req.params.id;
293 | const { item_name, category, description, found_location, contact_info } =
294 | req.body;
295 | const imageUrl = req.file ? `/uploads/${req.file.filename}` : null;
296 | console.log(req.body);
297 | console.log(item_name, category, description, found_location, contact_info);
298 |
299 | if (!item_name || !category || !description || !contact_info) {
300 | console.error("❌ Missing required fields");
301 | return res.status(400).json({ message: "Missing required fields" });
302 | }
303 |
304 | const sql = `UPDATE found_items SET item_name=?, category=?, description=?, found_location=?, contact_info=?, imageUrl=? WHERE id=?`;
305 |
306 | db.query(
307 | sql,
308 | [
309 | item_name,
310 | category,
311 | description,
312 | found_location,
313 | contact_info,
314 | imageUrl,
315 | itemId,
316 | ],
317 | (err, result) => {
318 | if (err) {
319 | console.error("❌ Error inserting item:", err);
320 | return res.status(500).json({ message: "Internal server error" });
321 | }
322 |
323 | const insertResult = result as ResultSetHeader;
324 | res
325 | .status(201)
326 | .json({
327 | message: "✅ Item updated successfully",
328 | itemId: insertResult.insertId,
329 | });
330 | }
331 | );
332 | });
333 |
334 | //Delete found item by ID
335 | app.delete("/api/found-items/:id", async (req: Request, res: Response) => {
336 | const itemId = req.params.id;
337 | console.log(itemId);
338 | try {
339 | const result = await db.execute("DELETE FROM found_items WHERE id = ?", [
340 | itemId,
341 | ]);
342 | const deleteResult = result as any;
343 |
344 | if (deleteResult.affectedRows > 0) {
345 | res.status(200).json({ message: "✅ Item deleted successfully" });
346 | } else {
347 | // res.status(404).json({ message: 'item not found' });
348 | res.status(200).json({ message: "✅ Item deleted successfully" });
349 | }
350 | } catch (error) {
351 | console.error("❌ Error deleting item:", error);
352 | res.status(500).json({ message: "Internal server error", error });
353 | }
354 | });
355 |
356 | // ✅ Start server
357 | app.listen(PORT, () => {
358 | console.log(`🚀 Server running on http://localhost:${PORT}`);
359 | });
360 |
--------------------------------------------------------------------------------
/lost-and-found-backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "lost-and-found-backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "lost-and-found-backend",
9 | "version": "1.0.0",
10 | "dependencies": {
11 | "@types/cors": "^2.8.17",
12 | "@types/express": "^4.17.21",
13 | "cors": "^2.8.5",
14 | "dotenv": "^16.5.0",
15 | "express": "^4.21.2",
16 | "multer": "^1.4.5-lts.2",
17 | "mysql2": "^3.14.0"
18 | },
19 | "devDependencies": {
20 | "@types/multer": "^1.4.12",
21 | "ts-node": "^10.9.2",
22 | "typescript": "^5.8.3"
23 | }
24 | },
25 | "node_modules/@cspotcode/source-map-support": {
26 | "version": "0.8.1",
27 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
28 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
29 | "dev": true,
30 | "license": "MIT",
31 | "dependencies": {
32 | "@jridgewell/trace-mapping": "0.3.9"
33 | },
34 | "engines": {
35 | "node": ">=12"
36 | }
37 | },
38 | "node_modules/@jridgewell/resolve-uri": {
39 | "version": "3.1.2",
40 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
41 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
42 | "dev": true,
43 | "license": "MIT",
44 | "engines": {
45 | "node": ">=6.0.0"
46 | }
47 | },
48 | "node_modules/@jridgewell/sourcemap-codec": {
49 | "version": "1.5.0",
50 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
51 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
52 | "dev": true,
53 | "license": "MIT"
54 | },
55 | "node_modules/@jridgewell/trace-mapping": {
56 | "version": "0.3.9",
57 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
58 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
59 | "dev": true,
60 | "license": "MIT",
61 | "dependencies": {
62 | "@jridgewell/resolve-uri": "^3.0.3",
63 | "@jridgewell/sourcemap-codec": "^1.4.10"
64 | }
65 | },
66 | "node_modules/@tsconfig/node10": {
67 | "version": "1.0.11",
68 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
69 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
70 | "dev": true,
71 | "license": "MIT"
72 | },
73 | "node_modules/@tsconfig/node12": {
74 | "version": "1.0.11",
75 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
76 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
77 | "dev": true,
78 | "license": "MIT"
79 | },
80 | "node_modules/@tsconfig/node14": {
81 | "version": "1.0.3",
82 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
83 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
84 | "dev": true,
85 | "license": "MIT"
86 | },
87 | "node_modules/@types/body-parser": {
88 | "version": "1.19.5",
89 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
90 | "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
91 | "license": "MIT",
92 | "dependencies": {
93 | "@types/connect": "*",
94 | "@types/node": "*"
95 | }
96 | },
97 | "node_modules/@types/connect": {
98 | "version": "3.4.38",
99 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
100 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
101 | "license": "MIT",
102 | "dependencies": {
103 | "@types/node": "*"
104 | }
105 | },
106 | "node_modules/@types/cors": {
107 | "version": "2.8.17",
108 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
109 | "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
110 | "license": "MIT",
111 | "dependencies": {
112 | "@types/node": "*"
113 | }
114 | },
115 | "node_modules/@types/express": {
116 | "version": "4.17.21",
117 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
118 | "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
119 | "license": "MIT",
120 | "dependencies": {
121 | "@types/body-parser": "*",
122 | "@types/express-serve-static-core": "^4.17.33",
123 | "@types/qs": "*",
124 | "@types/serve-static": "*"
125 | }
126 | },
127 | "node_modules/@types/express-serve-static-core": {
128 | "version": "4.19.6",
129 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
130 | "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
131 | "license": "MIT",
132 | "dependencies": {
133 | "@types/node": "*",
134 | "@types/qs": "*",
135 | "@types/range-parser": "*",
136 | "@types/send": "*"
137 | }
138 | },
139 | "node_modules/@types/http-errors": {
140 | "version": "2.0.4",
141 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
142 | "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
143 | "license": "MIT"
144 | },
145 | "node_modules/@types/mime": {
146 | "version": "1.3.5",
147 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
148 | "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
149 | "license": "MIT"
150 | },
151 | "node_modules/@types/multer": {
152 | "version": "1.4.12",
153 | "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.12.tgz",
154 | "integrity": "sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg==",
155 | "dev": true,
156 | "license": "MIT",
157 | "dependencies": {
158 | "@types/express": "*"
159 | }
160 | },
161 | "node_modules/@types/node": {
162 | "version": "22.14.0",
163 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz",
164 | "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==",
165 | "license": "MIT",
166 | "dependencies": {
167 | "undici-types": "~6.21.0"
168 | }
169 | },
170 | "node_modules/@types/qs": {
171 | "version": "6.9.18",
172 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
173 | "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
174 | "license": "MIT"
175 | },
176 | "node_modules/@types/range-parser": {
177 | "version": "1.2.7",
178 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
179 | "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
180 | "license": "MIT"
181 | },
182 | "node_modules/@types/send": {
183 | "version": "0.17.4",
184 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
185 | "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
186 | "license": "MIT",
187 | "dependencies": {
188 | "@types/mime": "^1",
189 | "@types/node": "*"
190 | }
191 | },
192 | "node_modules/@types/serve-static": {
193 | "version": "1.15.7",
194 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
195 | "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
196 | "license": "MIT",
197 | "dependencies": {
198 | "@types/http-errors": "*",
199 | "@types/node": "*",
200 | "@types/send": "*"
201 | }
202 | },
203 | "node_modules/accepts": {
204 | "version": "1.3.8",
205 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
206 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
207 | "license": "MIT",
208 | "dependencies": {
209 | "mime-types": "~2.1.34",
210 | "negotiator": "0.6.3"
211 | },
212 | "engines": {
213 | "node": ">= 0.6"
214 | }
215 | },
216 | "node_modules/acorn": {
217 | "version": "8.14.1",
218 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
219 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
220 | "dev": true,
221 | "license": "MIT",
222 | "bin": {
223 | "acorn": "bin/acorn"
224 | },
225 | "engines": {
226 | "node": ">=0.4.0"
227 | }
228 | },
229 | "node_modules/acorn-walk": {
230 | "version": "8.3.4",
231 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
232 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
233 | "dev": true,
234 | "license": "MIT",
235 | "dependencies": {
236 | "acorn": "^8.11.0"
237 | },
238 | "engines": {
239 | "node": ">=0.4.0"
240 | }
241 | },
242 | "node_modules/append-field": {
243 | "version": "1.0.0",
244 | "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
245 | "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
246 | "license": "MIT"
247 | },
248 | "node_modules/arg": {
249 | "version": "4.1.3",
250 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
251 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
252 | "dev": true,
253 | "license": "MIT"
254 | },
255 | "node_modules/array-flatten": {
256 | "version": "1.1.1",
257 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
258 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
259 | "license": "MIT"
260 | },
261 | "node_modules/aws-ssl-profiles": {
262 | "version": "1.1.2",
263 | "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
264 | "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
265 | "license": "MIT",
266 | "engines": {
267 | "node": ">= 6.0.0"
268 | }
269 | },
270 | "node_modules/body-parser": {
271 | "version": "1.20.3",
272 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
273 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
274 | "license": "MIT",
275 | "dependencies": {
276 | "bytes": "3.1.2",
277 | "content-type": "~1.0.5",
278 | "debug": "2.6.9",
279 | "depd": "2.0.0",
280 | "destroy": "1.2.0",
281 | "http-errors": "2.0.0",
282 | "iconv-lite": "0.4.24",
283 | "on-finished": "2.4.1",
284 | "qs": "6.13.0",
285 | "raw-body": "2.5.2",
286 | "type-is": "~1.6.18",
287 | "unpipe": "1.0.0"
288 | },
289 | "engines": {
290 | "node": ">= 0.8",
291 | "npm": "1.2.8000 || >= 1.4.16"
292 | }
293 | },
294 | "node_modules/buffer-from": {
295 | "version": "1.1.2",
296 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
297 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
298 | "license": "MIT"
299 | },
300 | "node_modules/busboy": {
301 | "version": "1.6.0",
302 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
303 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
304 | "dependencies": {
305 | "streamsearch": "^1.1.0"
306 | },
307 | "engines": {
308 | "node": ">=10.16.0"
309 | }
310 | },
311 | "node_modules/bytes": {
312 | "version": "3.1.2",
313 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
314 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
315 | "license": "MIT",
316 | "engines": {
317 | "node": ">= 0.8"
318 | }
319 | },
320 | "node_modules/call-bind-apply-helpers": {
321 | "version": "1.0.2",
322 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
323 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
324 | "license": "MIT",
325 | "dependencies": {
326 | "es-errors": "^1.3.0",
327 | "function-bind": "^1.1.2"
328 | },
329 | "engines": {
330 | "node": ">= 0.4"
331 | }
332 | },
333 | "node_modules/call-bound": {
334 | "version": "1.0.4",
335 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
336 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
337 | "license": "MIT",
338 | "dependencies": {
339 | "call-bind-apply-helpers": "^1.0.2",
340 | "get-intrinsic": "^1.3.0"
341 | },
342 | "engines": {
343 | "node": ">= 0.4"
344 | },
345 | "funding": {
346 | "url": "https://github.com/sponsors/ljharb"
347 | }
348 | },
349 | "node_modules/concat-stream": {
350 | "version": "1.6.2",
351 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
352 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
353 | "engines": [
354 | "node >= 0.8"
355 | ],
356 | "license": "MIT",
357 | "dependencies": {
358 | "buffer-from": "^1.0.0",
359 | "inherits": "^2.0.3",
360 | "readable-stream": "^2.2.2",
361 | "typedarray": "^0.0.6"
362 | }
363 | },
364 | "node_modules/content-disposition": {
365 | "version": "0.5.4",
366 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
367 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
368 | "license": "MIT",
369 | "dependencies": {
370 | "safe-buffer": "5.2.1"
371 | },
372 | "engines": {
373 | "node": ">= 0.6"
374 | }
375 | },
376 | "node_modules/content-type": {
377 | "version": "1.0.5",
378 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
379 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
380 | "license": "MIT",
381 | "engines": {
382 | "node": ">= 0.6"
383 | }
384 | },
385 | "node_modules/cookie": {
386 | "version": "0.7.1",
387 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
388 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
389 | "license": "MIT",
390 | "engines": {
391 | "node": ">= 0.6"
392 | }
393 | },
394 | "node_modules/cookie-signature": {
395 | "version": "1.0.6",
396 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
397 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
398 | "license": "MIT"
399 | },
400 | "node_modules/core-util-is": {
401 | "version": "1.0.3",
402 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
403 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
404 | "license": "MIT"
405 | },
406 | "node_modules/cors": {
407 | "version": "2.8.5",
408 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
409 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
410 | "license": "MIT",
411 | "dependencies": {
412 | "object-assign": "^4",
413 | "vary": "^1"
414 | },
415 | "engines": {
416 | "node": ">= 0.10"
417 | }
418 | },
419 | "node_modules/create-require": {
420 | "version": "1.1.1",
421 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
422 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
423 | "dev": true,
424 | "license": "MIT"
425 | },
426 | "node_modules/debug": {
427 | "version": "2.6.9",
428 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
429 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
430 | "license": "MIT",
431 | "dependencies": {
432 | "ms": "2.0.0"
433 | }
434 | },
435 | "node_modules/denque": {
436 | "version": "2.1.0",
437 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
438 | "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
439 | "license": "Apache-2.0",
440 | "engines": {
441 | "node": ">=0.10"
442 | }
443 | },
444 | "node_modules/depd": {
445 | "version": "2.0.0",
446 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
447 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
448 | "license": "MIT",
449 | "engines": {
450 | "node": ">= 0.8"
451 | }
452 | },
453 | "node_modules/destroy": {
454 | "version": "1.2.0",
455 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
456 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
457 | "license": "MIT",
458 | "engines": {
459 | "node": ">= 0.8",
460 | "npm": "1.2.8000 || >= 1.4.16"
461 | }
462 | },
463 | "node_modules/diff": {
464 | "version": "4.0.2",
465 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
466 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
467 | "dev": true,
468 | "license": "BSD-3-Clause",
469 | "engines": {
470 | "node": ">=0.3.1"
471 | }
472 | },
473 | "node_modules/dotenv": {
474 | "version": "16.5.0",
475 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
476 | "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
477 | "license": "BSD-2-Clause",
478 | "engines": {
479 | "node": ">=12"
480 | },
481 | "funding": {
482 | "url": "https://dotenvx.com"
483 | }
484 | },
485 | "node_modules/dunder-proto": {
486 | "version": "1.0.1",
487 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
488 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
489 | "license": "MIT",
490 | "dependencies": {
491 | "call-bind-apply-helpers": "^1.0.1",
492 | "es-errors": "^1.3.0",
493 | "gopd": "^1.2.0"
494 | },
495 | "engines": {
496 | "node": ">= 0.4"
497 | }
498 | },
499 | "node_modules/ee-first": {
500 | "version": "1.1.1",
501 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
502 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
503 | "license": "MIT"
504 | },
505 | "node_modules/encodeurl": {
506 | "version": "2.0.0",
507 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
508 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
509 | "license": "MIT",
510 | "engines": {
511 | "node": ">= 0.8"
512 | }
513 | },
514 | "node_modules/es-define-property": {
515 | "version": "1.0.1",
516 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
517 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
518 | "license": "MIT",
519 | "engines": {
520 | "node": ">= 0.4"
521 | }
522 | },
523 | "node_modules/es-errors": {
524 | "version": "1.3.0",
525 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
526 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
527 | "license": "MIT",
528 | "engines": {
529 | "node": ">= 0.4"
530 | }
531 | },
532 | "node_modules/es-object-atoms": {
533 | "version": "1.1.1",
534 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
535 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
536 | "license": "MIT",
537 | "dependencies": {
538 | "es-errors": "^1.3.0"
539 | },
540 | "engines": {
541 | "node": ">= 0.4"
542 | }
543 | },
544 | "node_modules/escape-html": {
545 | "version": "1.0.3",
546 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
547 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
548 | "license": "MIT"
549 | },
550 | "node_modules/etag": {
551 | "version": "1.8.1",
552 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
553 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
554 | "license": "MIT",
555 | "engines": {
556 | "node": ">= 0.6"
557 | }
558 | },
559 | "node_modules/express": {
560 | "version": "4.21.2",
561 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
562 | "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
563 | "license": "MIT",
564 | "dependencies": {
565 | "accepts": "~1.3.8",
566 | "array-flatten": "1.1.1",
567 | "body-parser": "1.20.3",
568 | "content-disposition": "0.5.4",
569 | "content-type": "~1.0.4",
570 | "cookie": "0.7.1",
571 | "cookie-signature": "1.0.6",
572 | "debug": "2.6.9",
573 | "depd": "2.0.0",
574 | "encodeurl": "~2.0.0",
575 | "escape-html": "~1.0.3",
576 | "etag": "~1.8.1",
577 | "finalhandler": "1.3.1",
578 | "fresh": "0.5.2",
579 | "http-errors": "2.0.0",
580 | "merge-descriptors": "1.0.3",
581 | "methods": "~1.1.2",
582 | "on-finished": "2.4.1",
583 | "parseurl": "~1.3.3",
584 | "path-to-regexp": "0.1.12",
585 | "proxy-addr": "~2.0.7",
586 | "qs": "6.13.0",
587 | "range-parser": "~1.2.1",
588 | "safe-buffer": "5.2.1",
589 | "send": "0.19.0",
590 | "serve-static": "1.16.2",
591 | "setprototypeof": "1.2.0",
592 | "statuses": "2.0.1",
593 | "type-is": "~1.6.18",
594 | "utils-merge": "1.0.1",
595 | "vary": "~1.1.2"
596 | },
597 | "engines": {
598 | "node": ">= 0.10.0"
599 | },
600 | "funding": {
601 | "type": "opencollective",
602 | "url": "https://opencollective.com/express"
603 | }
604 | },
605 | "node_modules/finalhandler": {
606 | "version": "1.3.1",
607 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
608 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
609 | "license": "MIT",
610 | "dependencies": {
611 | "debug": "2.6.9",
612 | "encodeurl": "~2.0.0",
613 | "escape-html": "~1.0.3",
614 | "on-finished": "2.4.1",
615 | "parseurl": "~1.3.3",
616 | "statuses": "2.0.1",
617 | "unpipe": "~1.0.0"
618 | },
619 | "engines": {
620 | "node": ">= 0.8"
621 | }
622 | },
623 | "node_modules/forwarded": {
624 | "version": "0.2.0",
625 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
626 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
627 | "license": "MIT",
628 | "engines": {
629 | "node": ">= 0.6"
630 | }
631 | },
632 | "node_modules/fresh": {
633 | "version": "0.5.2",
634 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
635 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
636 | "license": "MIT",
637 | "engines": {
638 | "node": ">= 0.6"
639 | }
640 | },
641 | "node_modules/function-bind": {
642 | "version": "1.1.2",
643 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
644 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
645 | "license": "MIT",
646 | "funding": {
647 | "url": "https://github.com/sponsors/ljharb"
648 | }
649 | },
650 | "node_modules/generate-function": {
651 | "version": "2.3.1",
652 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
653 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
654 | "license": "MIT",
655 | "dependencies": {
656 | "is-property": "^1.0.2"
657 | }
658 | },
659 | "node_modules/get-intrinsic": {
660 | "version": "1.3.0",
661 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
662 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
663 | "license": "MIT",
664 | "dependencies": {
665 | "call-bind-apply-helpers": "^1.0.2",
666 | "es-define-property": "^1.0.1",
667 | "es-errors": "^1.3.0",
668 | "es-object-atoms": "^1.1.1",
669 | "function-bind": "^1.1.2",
670 | "get-proto": "^1.0.1",
671 | "gopd": "^1.2.0",
672 | "has-symbols": "^1.1.0",
673 | "hasown": "^2.0.2",
674 | "math-intrinsics": "^1.1.0"
675 | },
676 | "engines": {
677 | "node": ">= 0.4"
678 | },
679 | "funding": {
680 | "url": "https://github.com/sponsors/ljharb"
681 | }
682 | },
683 | "node_modules/get-proto": {
684 | "version": "1.0.1",
685 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
686 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
687 | "license": "MIT",
688 | "dependencies": {
689 | "dunder-proto": "^1.0.1",
690 | "es-object-atoms": "^1.0.0"
691 | },
692 | "engines": {
693 | "node": ">= 0.4"
694 | }
695 | },
696 | "node_modules/gopd": {
697 | "version": "1.2.0",
698 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
699 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
700 | "license": "MIT",
701 | "engines": {
702 | "node": ">= 0.4"
703 | },
704 | "funding": {
705 | "url": "https://github.com/sponsors/ljharb"
706 | }
707 | },
708 | "node_modules/has-symbols": {
709 | "version": "1.1.0",
710 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
711 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
712 | "license": "MIT",
713 | "engines": {
714 | "node": ">= 0.4"
715 | },
716 | "funding": {
717 | "url": "https://github.com/sponsors/ljharb"
718 | }
719 | },
720 | "node_modules/hasown": {
721 | "version": "2.0.2",
722 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
723 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
724 | "license": "MIT",
725 | "dependencies": {
726 | "function-bind": "^1.1.2"
727 | },
728 | "engines": {
729 | "node": ">= 0.4"
730 | }
731 | },
732 | "node_modules/http-errors": {
733 | "version": "2.0.0",
734 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
735 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
736 | "license": "MIT",
737 | "dependencies": {
738 | "depd": "2.0.0",
739 | "inherits": "2.0.4",
740 | "setprototypeof": "1.2.0",
741 | "statuses": "2.0.1",
742 | "toidentifier": "1.0.1"
743 | },
744 | "engines": {
745 | "node": ">= 0.8"
746 | }
747 | },
748 | "node_modules/iconv-lite": {
749 | "version": "0.4.24",
750 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
751 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
752 | "license": "MIT",
753 | "dependencies": {
754 | "safer-buffer": ">= 2.1.2 < 3"
755 | },
756 | "engines": {
757 | "node": ">=0.10.0"
758 | }
759 | },
760 | "node_modules/inherits": {
761 | "version": "2.0.4",
762 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
763 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
764 | "license": "ISC"
765 | },
766 | "node_modules/ipaddr.js": {
767 | "version": "1.9.1",
768 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
769 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
770 | "license": "MIT",
771 | "engines": {
772 | "node": ">= 0.10"
773 | }
774 | },
775 | "node_modules/is-property": {
776 | "version": "1.0.2",
777 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
778 | "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
779 | "license": "MIT"
780 | },
781 | "node_modules/isarray": {
782 | "version": "1.0.0",
783 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
784 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
785 | "license": "MIT"
786 | },
787 | "node_modules/long": {
788 | "version": "5.3.1",
789 | "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz",
790 | "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==",
791 | "license": "Apache-2.0"
792 | },
793 | "node_modules/lru-cache": {
794 | "version": "7.18.3",
795 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
796 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
797 | "license": "ISC",
798 | "engines": {
799 | "node": ">=12"
800 | }
801 | },
802 | "node_modules/lru.min": {
803 | "version": "1.1.2",
804 | "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
805 | "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
806 | "license": "MIT",
807 | "engines": {
808 | "bun": ">=1.0.0",
809 | "deno": ">=1.30.0",
810 | "node": ">=8.0.0"
811 | },
812 | "funding": {
813 | "type": "github",
814 | "url": "https://github.com/sponsors/wellwelwel"
815 | }
816 | },
817 | "node_modules/make-error": {
818 | "version": "1.3.6",
819 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
820 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
821 | "dev": true,
822 | "license": "ISC"
823 | },
824 | "node_modules/math-intrinsics": {
825 | "version": "1.1.0",
826 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
827 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
828 | "license": "MIT",
829 | "engines": {
830 | "node": ">= 0.4"
831 | }
832 | },
833 | "node_modules/media-typer": {
834 | "version": "0.3.0",
835 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
836 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
837 | "license": "MIT",
838 | "engines": {
839 | "node": ">= 0.6"
840 | }
841 | },
842 | "node_modules/merge-descriptors": {
843 | "version": "1.0.3",
844 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
845 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
846 | "license": "MIT",
847 | "funding": {
848 | "url": "https://github.com/sponsors/sindresorhus"
849 | }
850 | },
851 | "node_modules/methods": {
852 | "version": "1.1.2",
853 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
854 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
855 | "license": "MIT",
856 | "engines": {
857 | "node": ">= 0.6"
858 | }
859 | },
860 | "node_modules/mime": {
861 | "version": "1.6.0",
862 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
863 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
864 | "license": "MIT",
865 | "bin": {
866 | "mime": "cli.js"
867 | },
868 | "engines": {
869 | "node": ">=4"
870 | }
871 | },
872 | "node_modules/mime-db": {
873 | "version": "1.52.0",
874 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
875 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
876 | "license": "MIT",
877 | "engines": {
878 | "node": ">= 0.6"
879 | }
880 | },
881 | "node_modules/mime-types": {
882 | "version": "2.1.35",
883 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
884 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
885 | "license": "MIT",
886 | "dependencies": {
887 | "mime-db": "1.52.0"
888 | },
889 | "engines": {
890 | "node": ">= 0.6"
891 | }
892 | },
893 | "node_modules/minimist": {
894 | "version": "1.2.8",
895 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
896 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
897 | "license": "MIT",
898 | "funding": {
899 | "url": "https://github.com/sponsors/ljharb"
900 | }
901 | },
902 | "node_modules/mkdirp": {
903 | "version": "0.5.6",
904 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
905 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
906 | "license": "MIT",
907 | "dependencies": {
908 | "minimist": "^1.2.6"
909 | },
910 | "bin": {
911 | "mkdirp": "bin/cmd.js"
912 | }
913 | },
914 | "node_modules/ms": {
915 | "version": "2.0.0",
916 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
917 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
918 | "license": "MIT"
919 | },
920 | "node_modules/multer": {
921 | "version": "1.4.5-lts.2",
922 | "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz",
923 | "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==",
924 | "license": "MIT",
925 | "dependencies": {
926 | "append-field": "^1.0.0",
927 | "busboy": "^1.0.0",
928 | "concat-stream": "^1.5.2",
929 | "mkdirp": "^0.5.4",
930 | "object-assign": "^4.1.1",
931 | "type-is": "^1.6.4",
932 | "xtend": "^4.0.0"
933 | },
934 | "engines": {
935 | "node": ">= 6.0.0"
936 | }
937 | },
938 | "node_modules/mysql2": {
939 | "version": "3.14.0",
940 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.0.tgz",
941 | "integrity": "sha512-8eMhmG6gt/hRkU1G+8KlGOdQi2w+CgtNoD1ksXZq9gQfkfDsX4LHaBwTe1SY0Imx//t2iZA03DFnyYKPinxSRw==",
942 | "license": "MIT",
943 | "dependencies": {
944 | "aws-ssl-profiles": "^1.1.1",
945 | "denque": "^2.1.0",
946 | "generate-function": "^2.3.1",
947 | "iconv-lite": "^0.6.3",
948 | "long": "^5.2.1",
949 | "lru.min": "^1.0.0",
950 | "named-placeholders": "^1.1.3",
951 | "seq-queue": "^0.0.5",
952 | "sqlstring": "^2.3.2"
953 | },
954 | "engines": {
955 | "node": ">= 8.0"
956 | }
957 | },
958 | "node_modules/mysql2/node_modules/iconv-lite": {
959 | "version": "0.6.3",
960 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
961 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
962 | "license": "MIT",
963 | "dependencies": {
964 | "safer-buffer": ">= 2.1.2 < 3.0.0"
965 | },
966 | "engines": {
967 | "node": ">=0.10.0"
968 | }
969 | },
970 | "node_modules/named-placeholders": {
971 | "version": "1.1.3",
972 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
973 | "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
974 | "license": "MIT",
975 | "dependencies": {
976 | "lru-cache": "^7.14.1"
977 | },
978 | "engines": {
979 | "node": ">=12.0.0"
980 | }
981 | },
982 | "node_modules/negotiator": {
983 | "version": "0.6.3",
984 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
985 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
986 | "license": "MIT",
987 | "engines": {
988 | "node": ">= 0.6"
989 | }
990 | },
991 | "node_modules/object-assign": {
992 | "version": "4.1.1",
993 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
994 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
995 | "license": "MIT",
996 | "engines": {
997 | "node": ">=0.10.0"
998 | }
999 | },
1000 | "node_modules/object-inspect": {
1001 | "version": "1.13.4",
1002 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1003 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1004 | "license": "MIT",
1005 | "engines": {
1006 | "node": ">= 0.4"
1007 | },
1008 | "funding": {
1009 | "url": "https://github.com/sponsors/ljharb"
1010 | }
1011 | },
1012 | "node_modules/on-finished": {
1013 | "version": "2.4.1",
1014 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1015 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1016 | "license": "MIT",
1017 | "dependencies": {
1018 | "ee-first": "1.1.1"
1019 | },
1020 | "engines": {
1021 | "node": ">= 0.8"
1022 | }
1023 | },
1024 | "node_modules/parseurl": {
1025 | "version": "1.3.3",
1026 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1027 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1028 | "license": "MIT",
1029 | "engines": {
1030 | "node": ">= 0.8"
1031 | }
1032 | },
1033 | "node_modules/path-to-regexp": {
1034 | "version": "0.1.12",
1035 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
1036 | "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
1037 | "license": "MIT"
1038 | },
1039 | "node_modules/process-nextick-args": {
1040 | "version": "2.0.1",
1041 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1042 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1043 | "license": "MIT"
1044 | },
1045 | "node_modules/proxy-addr": {
1046 | "version": "2.0.7",
1047 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1048 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1049 | "license": "MIT",
1050 | "dependencies": {
1051 | "forwarded": "0.2.0",
1052 | "ipaddr.js": "1.9.1"
1053 | },
1054 | "engines": {
1055 | "node": ">= 0.10"
1056 | }
1057 | },
1058 | "node_modules/qs": {
1059 | "version": "6.13.0",
1060 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
1061 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
1062 | "license": "BSD-3-Clause",
1063 | "dependencies": {
1064 | "side-channel": "^1.0.6"
1065 | },
1066 | "engines": {
1067 | "node": ">=0.6"
1068 | },
1069 | "funding": {
1070 | "url": "https://github.com/sponsors/ljharb"
1071 | }
1072 | },
1073 | "node_modules/range-parser": {
1074 | "version": "1.2.1",
1075 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1076 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1077 | "license": "MIT",
1078 | "engines": {
1079 | "node": ">= 0.6"
1080 | }
1081 | },
1082 | "node_modules/raw-body": {
1083 | "version": "2.5.2",
1084 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1085 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1086 | "license": "MIT",
1087 | "dependencies": {
1088 | "bytes": "3.1.2",
1089 | "http-errors": "2.0.0",
1090 | "iconv-lite": "0.4.24",
1091 | "unpipe": "1.0.0"
1092 | },
1093 | "engines": {
1094 | "node": ">= 0.8"
1095 | }
1096 | },
1097 | "node_modules/readable-stream": {
1098 | "version": "2.3.8",
1099 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1100 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1101 | "license": "MIT",
1102 | "dependencies": {
1103 | "core-util-is": "~1.0.0",
1104 | "inherits": "~2.0.3",
1105 | "isarray": "~1.0.0",
1106 | "process-nextick-args": "~2.0.0",
1107 | "safe-buffer": "~5.1.1",
1108 | "string_decoder": "~1.1.1",
1109 | "util-deprecate": "~1.0.1"
1110 | }
1111 | },
1112 | "node_modules/readable-stream/node_modules/safe-buffer": {
1113 | "version": "5.1.2",
1114 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1115 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1116 | "license": "MIT"
1117 | },
1118 | "node_modules/safe-buffer": {
1119 | "version": "5.2.1",
1120 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1121 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1122 | "funding": [
1123 | {
1124 | "type": "github",
1125 | "url": "https://github.com/sponsors/feross"
1126 | },
1127 | {
1128 | "type": "patreon",
1129 | "url": "https://www.patreon.com/feross"
1130 | },
1131 | {
1132 | "type": "consulting",
1133 | "url": "https://feross.org/support"
1134 | }
1135 | ],
1136 | "license": "MIT"
1137 | },
1138 | "node_modules/safer-buffer": {
1139 | "version": "2.1.2",
1140 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1141 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1142 | "license": "MIT"
1143 | },
1144 | "node_modules/send": {
1145 | "version": "0.19.0",
1146 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
1147 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
1148 | "license": "MIT",
1149 | "dependencies": {
1150 | "debug": "2.6.9",
1151 | "depd": "2.0.0",
1152 | "destroy": "1.2.0",
1153 | "encodeurl": "~1.0.2",
1154 | "escape-html": "~1.0.3",
1155 | "etag": "~1.8.1",
1156 | "fresh": "0.5.2",
1157 | "http-errors": "2.0.0",
1158 | "mime": "1.6.0",
1159 | "ms": "2.1.3",
1160 | "on-finished": "2.4.1",
1161 | "range-parser": "~1.2.1",
1162 | "statuses": "2.0.1"
1163 | },
1164 | "engines": {
1165 | "node": ">= 0.8.0"
1166 | }
1167 | },
1168 | "node_modules/send/node_modules/encodeurl": {
1169 | "version": "1.0.2",
1170 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1171 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
1172 | "license": "MIT",
1173 | "engines": {
1174 | "node": ">= 0.8"
1175 | }
1176 | },
1177 | "node_modules/send/node_modules/ms": {
1178 | "version": "2.1.3",
1179 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1180 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1181 | "license": "MIT"
1182 | },
1183 | "node_modules/seq-queue": {
1184 | "version": "0.0.5",
1185 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
1186 | "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
1187 | },
1188 | "node_modules/serve-static": {
1189 | "version": "1.16.2",
1190 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
1191 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
1192 | "license": "MIT",
1193 | "dependencies": {
1194 | "encodeurl": "~2.0.0",
1195 | "escape-html": "~1.0.3",
1196 | "parseurl": "~1.3.3",
1197 | "send": "0.19.0"
1198 | },
1199 | "engines": {
1200 | "node": ">= 0.8.0"
1201 | }
1202 | },
1203 | "node_modules/setprototypeof": {
1204 | "version": "1.2.0",
1205 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1206 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1207 | "license": "ISC"
1208 | },
1209 | "node_modules/side-channel": {
1210 | "version": "1.1.0",
1211 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1212 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1213 | "license": "MIT",
1214 | "dependencies": {
1215 | "es-errors": "^1.3.0",
1216 | "object-inspect": "^1.13.3",
1217 | "side-channel-list": "^1.0.0",
1218 | "side-channel-map": "^1.0.1",
1219 | "side-channel-weakmap": "^1.0.2"
1220 | },
1221 | "engines": {
1222 | "node": ">= 0.4"
1223 | },
1224 | "funding": {
1225 | "url": "https://github.com/sponsors/ljharb"
1226 | }
1227 | },
1228 | "node_modules/side-channel-list": {
1229 | "version": "1.0.0",
1230 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1231 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1232 | "license": "MIT",
1233 | "dependencies": {
1234 | "es-errors": "^1.3.0",
1235 | "object-inspect": "^1.13.3"
1236 | },
1237 | "engines": {
1238 | "node": ">= 0.4"
1239 | },
1240 | "funding": {
1241 | "url": "https://github.com/sponsors/ljharb"
1242 | }
1243 | },
1244 | "node_modules/side-channel-map": {
1245 | "version": "1.0.1",
1246 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1247 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1248 | "license": "MIT",
1249 | "dependencies": {
1250 | "call-bound": "^1.0.2",
1251 | "es-errors": "^1.3.0",
1252 | "get-intrinsic": "^1.2.5",
1253 | "object-inspect": "^1.13.3"
1254 | },
1255 | "engines": {
1256 | "node": ">= 0.4"
1257 | },
1258 | "funding": {
1259 | "url": "https://github.com/sponsors/ljharb"
1260 | }
1261 | },
1262 | "node_modules/side-channel-weakmap": {
1263 | "version": "1.0.2",
1264 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1265 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1266 | "license": "MIT",
1267 | "dependencies": {
1268 | "call-bound": "^1.0.2",
1269 | "es-errors": "^1.3.0",
1270 | "get-intrinsic": "^1.2.5",
1271 | "object-inspect": "^1.13.3",
1272 | "side-channel-map": "^1.0.1"
1273 | },
1274 | "engines": {
1275 | "node": ">= 0.4"
1276 | },
1277 | "funding": {
1278 | "url": "https://github.com/sponsors/ljharb"
1279 | }
1280 | },
1281 | "node_modules/sqlstring": {
1282 | "version": "2.3.3",
1283 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
1284 | "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
1285 | "license": "MIT",
1286 | "engines": {
1287 | "node": ">= 0.6"
1288 | }
1289 | },
1290 | "node_modules/statuses": {
1291 | "version": "2.0.1",
1292 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1293 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1294 | "license": "MIT",
1295 | "engines": {
1296 | "node": ">= 0.8"
1297 | }
1298 | },
1299 | "node_modules/streamsearch": {
1300 | "version": "1.1.0",
1301 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1302 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1303 | "engines": {
1304 | "node": ">=10.0.0"
1305 | }
1306 | },
1307 | "node_modules/string_decoder": {
1308 | "version": "1.1.1",
1309 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1310 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1311 | "license": "MIT",
1312 | "dependencies": {
1313 | "safe-buffer": "~5.1.0"
1314 | }
1315 | },
1316 | "node_modules/string_decoder/node_modules/safe-buffer": {
1317 | "version": "5.1.2",
1318 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1319 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1320 | "license": "MIT"
1321 | },
1322 | "node_modules/toidentifier": {
1323 | "version": "1.0.1",
1324 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1325 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1326 | "license": "MIT",
1327 | "engines": {
1328 | "node": ">=0.6"
1329 | }
1330 | },
1331 | "node_modules/ts-node": {
1332 | "version": "10.9.2",
1333 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
1334 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
1335 | "dev": true,
1336 | "license": "MIT",
1337 | "dependencies": {
1338 | "@cspotcode/source-map-support": "^0.8.0",
1339 | "@tsconfig/node10": "^1.0.7",
1340 | "@tsconfig/node12": "^1.0.7",
1341 | "@tsconfig/node14": "^1.0.0",
1342 | "@tsconfig/node16": "^1.0.2",
1343 | "acorn": "^8.4.1",
1344 | "acorn-walk": "^8.1.1",
1345 | "arg": "^4.1.0",
1346 | "create-require": "^1.1.0",
1347 | "diff": "^4.0.1",
1348 | "make-error": "^1.1.1",
1349 | "v8-compile-cache-lib": "^3.0.1",
1350 | "yn": "3.1.1"
1351 | },
1352 | "bin": {
1353 | "ts-node": "dist/bin.js",
1354 | "ts-node-cwd": "dist/bin-cwd.js",
1355 | "ts-node-esm": "dist/bin-esm.js",
1356 | "ts-node-script": "dist/bin-script.js",
1357 | "ts-node-transpile-only": "dist/bin-transpile.js",
1358 | "ts-script": "dist/bin-script-deprecated.js"
1359 | },
1360 | "peerDependencies": {
1361 | "@swc/core": ">=1.2.50",
1362 | "@swc/wasm": ">=1.2.50",
1363 | "@types/node": "*",
1364 | "typescript": ">=2.7"
1365 | },
1366 | "peerDependenciesMeta": {
1367 | "@swc/core": {
1368 | "optional": true
1369 | },
1370 | "@swc/wasm": {
1371 | "optional": true
1372 | }
1373 | }
1374 | },
1375 | "node_modules/ts-node/node_modules/@tsconfig/node16": {
1376 | "version": "1.0.4",
1377 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
1378 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
1379 | "dev": true,
1380 | "license": "MIT"
1381 | },
1382 | "node_modules/type-is": {
1383 | "version": "1.6.18",
1384 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1385 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1386 | "license": "MIT",
1387 | "dependencies": {
1388 | "media-typer": "0.3.0",
1389 | "mime-types": "~2.1.24"
1390 | },
1391 | "engines": {
1392 | "node": ">= 0.6"
1393 | }
1394 | },
1395 | "node_modules/typedarray": {
1396 | "version": "0.0.6",
1397 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1398 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
1399 | "license": "MIT"
1400 | },
1401 | "node_modules/typescript": {
1402 | "version": "5.8.3",
1403 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
1404 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
1405 | "dev": true,
1406 | "license": "Apache-2.0",
1407 | "bin": {
1408 | "tsc": "bin/tsc",
1409 | "tsserver": "bin/tsserver"
1410 | },
1411 | "engines": {
1412 | "node": ">=14.17"
1413 | }
1414 | },
1415 | "node_modules/undici-types": {
1416 | "version": "6.21.0",
1417 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
1418 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
1419 | "license": "MIT"
1420 | },
1421 | "node_modules/unpipe": {
1422 | "version": "1.0.0",
1423 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1424 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1425 | "license": "MIT",
1426 | "engines": {
1427 | "node": ">= 0.8"
1428 | }
1429 | },
1430 | "node_modules/util-deprecate": {
1431 | "version": "1.0.2",
1432 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1433 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1434 | "license": "MIT"
1435 | },
1436 | "node_modules/utils-merge": {
1437 | "version": "1.0.1",
1438 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1439 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1440 | "license": "MIT",
1441 | "engines": {
1442 | "node": ">= 0.4.0"
1443 | }
1444 | },
1445 | "node_modules/v8-compile-cache-lib": {
1446 | "version": "3.0.1",
1447 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
1448 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
1449 | "dev": true,
1450 | "license": "MIT"
1451 | },
1452 | "node_modules/vary": {
1453 | "version": "1.1.2",
1454 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1455 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1456 | "license": "MIT",
1457 | "engines": {
1458 | "node": ">= 0.8"
1459 | }
1460 | },
1461 | "node_modules/xtend": {
1462 | "version": "4.0.2",
1463 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1464 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1465 | "license": "MIT",
1466 | "engines": {
1467 | "node": ">=0.4"
1468 | }
1469 | },
1470 | "node_modules/yn": {
1471 | "version": "3.1.1",
1472 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
1473 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
1474 | "dev": true,
1475 | "license": "MIT",
1476 | "engines": {
1477 | "node": ">=6"
1478 | }
1479 | }
1480 | }
1481 | }
1482 |
--------------------------------------------------------------------------------