From ed353726310754aae95703f9182d70f4a3343944 Mon Sep 17 00:00:00 2001 From: Hifni Dana Abdillah <73625841+hifnygans@users.noreply.github.com> Date: Mon, 29 Jul 2024 10:30:52 +0700 Subject: [PATCH] first commit --- .editorconfig | 18 + .env.example | 64 + .gitattributes | 11 + .gitignore | 19 + app/Console/Commands/Karnel.php | 46 + app/Console/Commands/MqttListenCommand.php | 48 + app/Console/Commands/SubscribeToMQTT.php | 30 + .../Auth/ConfirmPasswordController.php | 39 + .../Auth/ForgotPasswordController.php | 22 + app/Http/Controllers/Auth/LoginController.php | 39 + .../Controllers/Auth/RegisterController.php | 72 + .../Auth/ResetPasswordController.php | 29 + .../Auth/VerificationController.php | 41 + app/Http/Controllers/BlogController.php | 55 + app/Http/Controllers/Controller.php | 12 + app/Http/Controllers/DeviceController.php | 11 + app/Http/Controllers/HomeController.php | 28 + app/Http/Controllers/MonitoringController.php | 30 + app/Http/Controllers/RiwayatController.php | 29 + app/Http/Controllers/SensorDataController.php | 26 + app/Http/Controllers/TentangController.php | 14 + app/Http/Controllers/Waterflow2Controller.php | 10 + app/Libraries/.gitignore | 2 + app/Libraries/LICENSE | 20 + app/Libraries/README.md | 15 + app/Libraries/composer.json | 21 + app/Libraries/examples/README.md | 44 + app/Libraries/examples/publish.php | 18 + app/Libraries/examples/subscribe.php | 32 + .../examples/subscribeAndWaitForMessage.php | 18 + app/Libraries/phpMQTT.php | 33 + app/Models/Coba.php | 23 + app/Models/Device.php | 10 + app/Models/Tds.php | 23 + app/Models/Ultrasonik.php | 23 + app/Models/User.php | 47 + app/Models/Waterflow1.php | 23 + app/Models/Waterflow2.php | 23 + app/Models/blog.php | 11 + app/Providers/AppServiceProvider.php | 24 + app/Providers/MQTTServiceProvider.php | 24 + app/Services/MqttServices.php | 38 + artisan | 15 + bootstrap/app.php | 18 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 6 + composer.json | 71 + composer.lock | 8466 +++++++++++++++++ config/app.php | 126 + config/auth.php | 115 + config/cache.php | 107 + config/charts.php | 15 + config/database.php | 170 + config/filesystems.php | 76 + config/logging.php | 132 + config/mail.php | 111 + config/mqtt.php | 9 + config/queue.php | 112 + config/services.php | 34 + config/session.php | 217 + database/.gitignore | 1 + database/factories/UserFactory.php | 44 + database/factories/Waterflow2Factory.php | 23 + .../0001_01_01_000000_create_users_table.php | 49 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + .../2024_04_25_155749_create_blogs_table.php | 34 + ..._05_05_140309_create_sensor_data_table.php | 30 + ..._05_27_064632_add_image_to_blogs_table.php | 22 + ...05_31_045519_add_tanggal_to_coba_table.php | 32 + ...24_06_03_055154_create_waterflow_table.php | 27 + ...24_06_03_055210_create_waterflow_table.php | 42 + ..._07_03_183229_create_waterflow2s_table.php | 27 + database/seeders/BlogSeeder.php | 26 + database/seeders/CobaSeeder.php | 23 + database/seeders/DatabaseSeeder.php | 21 + database/seeders/TdsSeeder.php | 28 + database/seeders/Waterflow1Seeder.php | 28 + database/seeders/Waterflow2Seeder.php | 28 + ds/.gitignore | 104 + ds/LICENSE | 201 + ds/README.md | 28 + ds/app.js | 30 + ds/package-lock.json | 2046 ++++ ds/package.json | 29 + ds/public/images/logo.png | Bin 0 -> 21303 bytes ds/public/index.js | 554 ++ ds/public/mqttService.js | 50 + ds/public/style.css | 553 ++ ds/routes/dashboard.js | 12 + ds/views/pages/dashboard.ejs | 134 + package-lock.json | 1312 +++ package.json | 20 + phpunit.xml | 33 + public/.htaccess | 21 + public/favicon.ico | 0 public/images/1716792688.png | Bin 0 -> 206644 bytes public/images/1716792995.png | Bin 0 -> 283002 bytes public/images/1716793200.png | Bin 0 -> 494223 bytes public/images/1716793660.jpg | Bin 0 -> 122389 bytes public/images/1716794306.jpg | Bin 0 -> 28129 bytes public/images/1717993109.png | Bin 0 -> 11502 bytes public/images/1719467540.jpg | Bin 0 -> 128533 bytes public/images/1719468262.jpg | Bin 0 -> 128533 bytes public/images/1720794083.jpg | Bin 0 -> 183150 bytes public/images/hidro.png | Bin 0 -> 159386 bytes public/images/hifni.jpg | Bin 0 -> 59605 bytes public/index.php | 17 + public/robots.txt | 2 + resources/css/app.css | 0 resources/js/app.js | 10 + resources/js/bootstrap.js | 34 + resources/js/components/ChartComponent.vue | 85 + resources/sass/_variables.scss | 7 + resources/sass/app.scss | 8 + resources/views/Device.blade.php | 5 + resources/views/Tentang.blade.php | 64 + resources/views/add.blade.php | 33 + resources/views/auth/login.blade.php | 105 + .../views/auth/passwords/confirm.blade.php | 49 + .../views/auth/passwords/email.blade.php | 47 + .../views/auth/passwords/reset.blade.php | 65 + resources/views/auth/register.blade.php | 66 + resources/views/auth/verify.blade.php | 28 + resources/views/blog/create.blade.php | 161 + resources/views/blog/index.blade.php | 125 + resources/views/blog/show.blade.php | 147 + resources/views/home.blade.php | 290 + resources/views/layouts/app.blade.php | 80 + resources/views/layouts/ui.blade.php | 6 + resources/views/monitoring.blade.php | 432 + resources/views/riwayat.blade.php | 431 + resources/views/welcome.blade.php | 92 + routes/api.php | 5 + routes/console.php | 8 + routes/web.php | 72 + storage/app/.gitignore | 3 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/Feature/ExampleTest.php | 19 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + vite.config.js | 14 + 149 files changed, 19231 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 app/Console/Commands/Karnel.php create mode 100644 app/Console/Commands/MqttListenCommand.php create mode 100644 app/Console/Commands/SubscribeToMQTT.php create mode 100644 app/Http/Controllers/Auth/ConfirmPasswordController.php create mode 100644 app/Http/Controllers/Auth/ForgotPasswordController.php create mode 100644 app/Http/Controllers/Auth/LoginController.php create mode 100644 app/Http/Controllers/Auth/RegisterController.php create mode 100644 app/Http/Controllers/Auth/ResetPasswordController.php create mode 100644 app/Http/Controllers/Auth/VerificationController.php create mode 100644 app/Http/Controllers/BlogController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/DeviceController.php create mode 100644 app/Http/Controllers/HomeController.php create mode 100644 app/Http/Controllers/MonitoringController.php create mode 100644 app/Http/Controllers/RiwayatController.php create mode 100644 app/Http/Controllers/SensorDataController.php create mode 100644 app/Http/Controllers/TentangController.php create mode 100644 app/Http/Controllers/Waterflow2Controller.php create mode 100644 app/Libraries/.gitignore create mode 100644 app/Libraries/LICENSE create mode 100644 app/Libraries/README.md create mode 100644 app/Libraries/composer.json create mode 100644 app/Libraries/examples/README.md create mode 100644 app/Libraries/examples/publish.php create mode 100644 app/Libraries/examples/subscribe.php create mode 100644 app/Libraries/examples/subscribeAndWaitForMessage.php create mode 100644 app/Libraries/phpMQTT.php create mode 100644 app/Models/Coba.php create mode 100644 app/Models/Device.php create mode 100644 app/Models/Tds.php create mode 100644 app/Models/Ultrasonik.php create mode 100644 app/Models/User.php create mode 100644 app/Models/Waterflow1.php create mode 100644 app/Models/Waterflow2.php create mode 100644 app/Models/blog.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/MQTTServiceProvider.php create mode 100644 app/Services/MqttServices.php create mode 100644 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/cache.php create mode 100644 config/charts.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/mqtt.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/factories/Waterflow2Factory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2024_04_25_155749_create_blogs_table.php create mode 100644 database/migrations/2024_05_05_140309_create_sensor_data_table.php create mode 100644 database/migrations/2024_05_27_064632_add_image_to_blogs_table.php create mode 100644 database/migrations/2024_05_31_045519_add_tanggal_to_coba_table.php create mode 100644 database/migrations/2024_06_03_055154_create_waterflow_table.php create mode 100644 database/migrations/2024_06_03_055210_create_waterflow_table.php create mode 100644 database/migrations/2024_07_03_183229_create_waterflow2s_table.php create mode 100644 database/seeders/BlogSeeder.php create mode 100644 database/seeders/CobaSeeder.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 database/seeders/TdsSeeder.php create mode 100644 database/seeders/Waterflow1Seeder.php create mode 100644 database/seeders/Waterflow2Seeder.php create mode 100644 ds/.gitignore create mode 100644 ds/LICENSE create mode 100644 ds/README.md create mode 100644 ds/app.js create mode 100644 ds/package-lock.json create mode 100644 ds/package.json create mode 100644 ds/public/images/logo.png create mode 100644 ds/public/index.js create mode 100644 ds/public/mqttService.js create mode 100644 ds/public/style.css create mode 100644 ds/routes/dashboard.js create mode 100644 ds/views/pages/dashboard.ejs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/images/1716792688.png create mode 100644 public/images/1716792995.png create mode 100644 public/images/1716793200.png create mode 100644 public/images/1716793660.jpg create mode 100644 public/images/1716794306.jpg create mode 100644 public/images/1717993109.png create mode 100644 public/images/1719467540.jpg create mode 100644 public/images/1719468262.jpg create mode 100644 public/images/1720794083.jpg create mode 100644 public/images/hidro.png create mode 100644 public/images/hifni.jpg create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/js/components/ChartComponent.vue create mode 100644 resources/sass/_variables.scss create mode 100644 resources/sass/app.scss create mode 100644 resources/views/Device.blade.php create mode 100644 resources/views/Tentang.blade.php create mode 100644 resources/views/add.blade.php create mode 100644 resources/views/auth/login.blade.php create mode 100644 resources/views/auth/passwords/confirm.blade.php create mode 100644 resources/views/auth/passwords/email.blade.php create mode 100644 resources/views/auth/passwords/reset.blade.php create mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/auth/verify.blade.php create mode 100644 resources/views/blog/create.blade.php create mode 100644 resources/views/blog/index.blade.php create mode 100644 resources/views/blog/show.blade.php create mode 100644 resources/views/home.blade.php create mode 100644 resources/views/layouts/app.blade.php create mode 100644 resources/views/layouts/ui.blade.php create mode 100644 resources/views/monitoring.blade.php create mode 100644 resources/views/riwayat.blade.php create mode 100644 resources/views/welcome.blade.php create mode 100644 routes/api.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 storage/app/.gitignore create mode 100644 storage/app/public/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 vite.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f0de65 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7b49625 --- /dev/null +++ b/.env.example @@ -0,0 +1,64 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_TIMEZONE=UTC +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +APP_MAINTENANCE_STORE=database + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=sqlite +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_DATABASE=laravel +# DB_USERNAME=root +# DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7fe978f --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +/.phpunit.cache +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/vendor +.env +.env.backup +.env.production +.phpunit.result.cache +Homestead.json +Homestead.yaml +auth.json +npm-debug.log +yarn-error.log +/.fleet +/.idea +/.vscode diff --git a/app/Console/Commands/Karnel.php b/app/Console/Commands/Karnel.php new file mode 100644 index 0000000..b213270 --- /dev/null +++ b/app/Console/Commands/Karnel.php @@ -0,0 +1,46 @@ +command('inspire')->hourly(); + + // Tambahkan schedule untuk mqtt:subscribe + $schedule->command('mqtt:subscribe')->everyMinute(); + } + + /** + * Register the commands for the application. + * + * @return void + */ + protected function commands() + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Console/Commands/MqttListenCommand.php b/app/Console/Commands/MqttListenCommand.php new file mode 100644 index 0000000..3246f04 --- /dev/null +++ b/app/Console/Commands/MqttListenCommand.php @@ -0,0 +1,48 @@ +subscribe('topic/nutrisi', function (string $topic, string $message) { + // Proses pesan yang diterima + \Log::info("Pesan dari $topic: $message"); + // Anda bisa menyimpan pesan ke database atau melakukan tindakan lainnya + }); + } +} diff --git a/app/Console/Commands/SubscribeToMQTT.php b/app/Console/Commands/SubscribeToMQTT.php new file mode 100644 index 0000000..1a9df99 --- /dev/null +++ b/app/Console/Commands/SubscribeToMQTT.php @@ -0,0 +1,30 @@ +connect(); + + $mqtt->subscribe('ultrasonic', function (string $topic, string $message) { + Cache::put('ultrasonic_data', $message, 60); + }, 0); + + $mqtt->loop(true); + $mqtt->disconnect(); + } +} diff --git a/app/Http/Controllers/Auth/ConfirmPasswordController.php b/app/Http/Controllers/Auth/ConfirmPasswordController.php new file mode 100644 index 0000000..3559954 --- /dev/null +++ b/app/Http/Controllers/Auth/ConfirmPasswordController.php @@ -0,0 +1,39 @@ +middleware('auth'); + } +} diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 0000000..465c39c --- /dev/null +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,22 @@ +middleware('guest')->except('logout'); + } +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php new file mode 100644 index 0000000..961ea36 --- /dev/null +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -0,0 +1,72 @@ +middleware('guest'); + } + + /** + * Get a validator for an incoming registration request. + * + * @param array $data + * @return \Illuminate\Contracts\Validation\Validator + */ + protected function validator(array $data) + { + return Validator::make($data, [ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => ['required', 'string', 'min:8', 'confirmed'], + ]); + } + + /** + * Create a new user instance after a valid registration. + * + * @param array $data + * @return \App\Models\User + */ + protected function create(array $data) + { + return User::create([ + 'name' => $data['name'], + 'email' => $data['email'], + 'password' => Hash::make($data['password']), + ]); + } +} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 0000000..fe965b2 --- /dev/null +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,29 @@ +middleware('auth'); + $this->middleware('signed')->only('verify'); + $this->middleware('throttle:6,1')->only('verify', 'resend'); + } +} diff --git a/app/Http/Controllers/BlogController.php b/app/Http/Controllers/BlogController.php new file mode 100644 index 0000000..dea1ffb --- /dev/null +++ b/app/Http/Controllers/BlogController.php @@ -0,0 +1,55 @@ +validate([ + 'title' => 'required|string|max:255', + 'content' => 'required|string', + 'image' => 'image|mimes:jpeg,png,jpg,gif|max:2048', // Menambahkan validasi untuk gambar + ]); + + // Simpan gambar + $imageName = null; + if ($request->hasFile('image')) { + $imageName = time().'.'.$request->image->extension(); + $request->image->move(public_path('images'), $imageName); + } + + // Simpan blog baru ke dalam database dengan menambahkan informasi pengguna saat ini sebagai author + $blog = new Blog([ + 'title' => $request->title, + 'content' => $request->content, + 'author' => auth()->user()->name, // Menggunakan nama pengguna yang saat ini masuk sebagai author + 'image' => $imageName, // Menyimpan nama file gambar ke dalam basis data + ]); + $blog->save(); + + // Redirect ke halaman lain dengan pesan sukses + return redirect()->route('blog.index')->with('success', 'Blog created successfully!'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..77ec359 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,12 @@ +middleware('auth'); + } + + /** + * Show the application dashboard. + * + * @return \Illuminate\Contracts\Support\Renderable + */ + public function index() + { + return view('home'); + } +} diff --git a/app/Http/Controllers/MonitoringController.php b/app/Http/Controllers/MonitoringController.php new file mode 100644 index 0000000..09b3630 --- /dev/null +++ b/app/Http/Controllers/MonitoringController.php @@ -0,0 +1,30 @@ +validate([ + 'value' => 'required|integer', + ]); + + // Simpan data ke database + $data = SensorData::create([ + 'value' => $request->value, + ]); + + return response()->json(['message' => 'Data berhasil disimpan'], 200); + } +} diff --git a/app/Http/Controllers/TentangController.php b/app/Http/Controllers/TentangController.php new file mode 100644 index 0000000..a50711a --- /dev/null +++ b/app/Http/Controllers/TentangController.php @@ -0,0 +1,14 @@ +=7.2" + }, + "autoload": { + "psr-4": { + "Bluerhinos\\": "./" + } + } +} diff --git a/app/Libraries/examples/README.md b/app/Libraries/examples/README.md new file mode 100644 index 0000000..27e8c8e --- /dev/null +++ b/app/Libraries/examples/README.md @@ -0,0 +1,44 @@ +# Output example + +For info on MQTT: https://mntolia.com/fundamentals-mqtt/#4_Advantages_of_MQTT_for_IoT_over_HTTP_UDP + +> Before running each file be sure to review the four connection parameters in the headers. + +subscribe.php +-- +This example is to demonstrate using MQTT for a long-running script that will wait for subscribed topics. +This script is not suitable to be run as web requests, instead should be run on the commandline. + +Let `subscribe.php` listening the broker: +```console +$ php subscribe.php +Msg Recieved: Fri, 13 Jan 2017 01:58:23 +0000 +Topic: bluerhinos/phpMQTT/examples/publishtest + + Hello World! at Fri, 13 Jan 2017 01:58:23 +0000 + +Msg Recieved: Fri, 13 Jan 2017 01:58:35 +0000 +Topic: bluerhinos/phpMQTT/examples/publishtest + + Hello World! at Fri, 13 Jan 2017 01:58:35 +0000 + +^C +``` + +publish.php +--- +This example will publish a message to a topic. + +The results shown above corresponds to publisher's two actions: +```console +$ php publish.php +$ php publish.php +``` + +When run as a web request you it is ok to just `$mqtt->connect()`, `$mqtt->publish()` and `$mqtt->close()`. +If it is being run as long-running command line script you should run `$mqtt->proc()` regularly in order maintain the connection with the broker. + +subscribeAndWaitForMessage.php +-- +In order to use this library to display messages on a website you can use `$mqtt->subscribeAndWaitForMessage()`, this will subscribe to a topic and then wait for, and return the message. +If you want messages to appear instantly, you should use retained messages (https://mntolia.com/mqtt-retained-messages-explained-example/) \ No newline at end of file diff --git a/app/Libraries/examples/publish.php b/app/Libraries/examples/publish.php new file mode 100644 index 0000000..dd0e978 --- /dev/null +++ b/app/Libraries/examples/publish.php @@ -0,0 +1,18 @@ +connect(true, NULL, $username, $password)) { + $mqtt->publish('bluerhinos/phpMQTT/examples/publishtest', 'Hello World! at ' . date('r'), 0, false); + $mqtt->close(); +} else { + echo "Time out!\n"; +} diff --git a/app/Libraries/examples/subscribe.php b/app/Libraries/examples/subscribe.php new file mode 100644 index 0000000..dcf467c --- /dev/null +++ b/app/Libraries/examples/subscribe.php @@ -0,0 +1,32 @@ +connect(true, NULL, $username, $password)) { + exit(1); +} + +$mqtt->debug = true; + +$topics['bluerhinos/phpMQTT/examples/publishtest'] = array('qos' => 0, 'function' => 'procMsg'); +$mqtt->subscribe($topics, 0); + +while($mqtt->proc()) { + +} + +$mqtt->close(); + +function procMsg($topic, $msg){ + echo 'Msg Recieved: ' . date('r') . "\n"; + echo "Topic: {$topic}\n\n"; + echo "\t$msg\n\n"; +} diff --git a/app/Libraries/examples/subscribeAndWaitForMessage.php b/app/Libraries/examples/subscribeAndWaitForMessage.php new file mode 100644 index 0000000..48a0581 --- /dev/null +++ b/app/Libraries/examples/subscribeAndWaitForMessage.php @@ -0,0 +1,18 @@ +connect(true, NULL, $username, $password)) { + exit(1); +} + +echo $mqtt->subscribeAndWaitForMessage('bluerhinos/phpMQTT/examples/publishtest', 0); + +$mqtt->close(); \ No newline at end of file diff --git a/app/Libraries/phpMQTT.php b/app/Libraries/phpMQTT.php new file mode 100644 index 0000000..d3bd161 --- /dev/null +++ b/app/Libraries/phpMQTT.php @@ -0,0 +1,33 @@ +server = $server; + $this->port = $port; + $this->client_id = $client_id; + } + + public function connect() { + // Implementasi koneksi ke broker MQTT + // Kembalikan true jika berhasil, false jika gagal + // Contoh sederhana: + return true; // atau false jika gagal + } + + public function publish($topic, $content) { + // Implementasi untuk mempublikasikan pesan ke broker MQTT + } + + public function subscribe($topic, $callback) { + // Implementasi untuk berlangganan ke topik MQTT + } + + public function close() { + // Implementasi untuk menutup koneksi + } +} diff --git a/app/Models/Coba.php b/app/Models/Coba.php new file mode 100644 index 0000000..d7aeeaf --- /dev/null +++ b/app/Models/Coba.php @@ -0,0 +1,23 @@ + + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + } +} diff --git a/app/Models/Waterflow1.php b/app/Models/Waterflow1.php new file mode 100644 index 0000000..c4d7411 --- /dev/null +++ b/app/Models/Waterflow1.php @@ -0,0 +1,23 @@ +mqtt = new phpMQTT($host, $port, $client_id); + + if ($username && $password) { + if (!$this->mqtt->connect(true, null, $username, $password)) { + exit(1); + } + } else { + if (!$this->mqtt->connect(true, null)) { + exit(1); + } + } + } + + public function subscribe($topic, $callback) + { + $this->mqtt->subscribe([$topic => ["qos" => 0, "function" => $callback]]); + while ($this->mqtt->proc()) {} + $this->mqtt->close(); + } +} diff --git a/artisan b/artisan new file mode 100644 index 0000000..8e04b42 --- /dev/null +++ b/artisan @@ -0,0 +1,15 @@ +#!/usr/bin/env php +handleCommand(new ArgvInput); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..7b162da --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,18 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware) { + // + }) + ->withExceptions(function (Exceptions $exceptions) { + // + })->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 0000000..852f72c --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,6 @@ +=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.1|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Balping\\JsonRaw\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-only" + ], + "authors": [ + { + "name": "Balázs Dura-Kovács" + } + ], + "description": "Encode arrays to json with raw JS objects (eg. callbacks) in them", + "keywords": [ + "callback", + "encode", + "json" + ], + "time": "2023-03-27T18:25:07+00:00" + }, + { + "name": "bluerhinos/phpmqtt", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/bluerhinos/phpMQTT.git", + "reference": "fe4b6b2fe3d1b651fe1456e147ad4f044fa70603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bluerhinos/phpMQTT/zipball/fe4b6b2fe3d1b651fe1456e147ad4f044fa70603", + "reference": "fe4b6b2fe3d1b651fe1456e147ad4f044fa70603", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Bluerhinos\\": "./" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Andrew Milsted", + "email": "andrew@bluerhinos.co.uk" + } + ], + "description": "Simple MQTT Class", + "support": { + "issues": "https://github.com/bluerhinos/phpMQTT/issues", + "source": "https://github.com/bluerhinos/phpMQTT/tree/1.0.1" + }, + "time": "2021-08-21T18:25:12+00:00" + }, + { + "name": "brick/math", + "version": "0.11.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.11.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-15T23:15:59+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "consoletvs/charts", + "version": "6.7.0", + "source": { + "type": "git", + "url": "https://github.com/ConsoleTVs/Charts.git", + "reference": "408b62609d79be06d229181d3b4c3a4cf6e27a1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ConsoleTVs/Charts/zipball/408b62609d79be06d229181d3b4c3a4cf6e27a1b", + "reference": "408b62609d79be06d229181d3b4c3a4cf6e27a1b", + "shasum": "" + }, + "require": { + "balping/json-raw-encoder": "^1.0", + "illuminate/console": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": ">=7.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "ConsoleTVs\\Charts\\ChartsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "ConsoleTVs\\Charts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Èrik Campobadal Forés", + "email": "soc@erik.cat" + } + ], + "description": "The laravel charting package", + "support": { + "issues": "https://github.com/ConsoleTVs/Charts/issues", + "source": "https://github.com/ConsoleTVs/Charts/tree/6.7.0" + }, + "funding": [ + { + "url": "https://www.patreon.com/ErikCampobadal", + "type": "patreon" + } + ], + "time": "2024-03-13T10:55:51+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "f41715465d65213d644d3141a6a93081be5d3549" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" + }, + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2023-08-10T19:36:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:16:48+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:05:35+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", + "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2023-12-03T19:50:20+00:00" + }, + { + "name": "laravel/framework", + "version": "v11.3.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "3b87d0767e9cbddec46480d883010ba720e50dea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/3b87d0767e9cbddec46480d883010ba720e50dea", + "reference": "3b87d0767e9cbddec46480d883010ba720e50dea", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.15", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.72.2|^3.0", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.0", + "symfony/error-handler": "^7.0", + "symfony/finder": "^7.0", + "symfony/http-foundation": "^7.0", + "symfony/http-kernel": "^7.0", + "symfony/mailer": "^7.0", + "symfony/mime": "^7.0", + "symfony/polyfill-php83": "^1.28", + "symfony/process": "^7.0", + "symfony/routing": "^7.0", + "symfony/uid": "^7.0", + "symfony/var-dumper": "^7.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "mockery/mockery": "1.6.8", + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "ext-gmp": "*", + "fakerphp/faker": "^1.23", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.6", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^9.0.6", + "pda/pheanstalk": "^5.0", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.5|^11.0", + "predis/predis": "^2.0.2", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.0", + "symfony/http-client": "^7.0", + "symfony/psr-http-message-bridge": "^7.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.6).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-04-10T15:13:49+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.18", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "3b5e6b03f1f1175574b5a32331d99c9819da9848" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/3b5e6b03f1f1175574b5a32331d99c9819da9848", + "reference": "3b5e6b03f1f1175574b5a32331d99c9819da9848", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.18" + }, + "time": "2024-04-04T17:41:50+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", + "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2023-11-08T14:08:06+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.9.0" + }, + "time": "2024-01-04T16:10:04+00:00" + }, + { + "name": "laravel/ui", + "version": "v4.5.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "a3562953123946996a503159199d6742d5534e61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/a3562953123946996a503159199d6742d5534e61", + "reference": "a3562953123946996a503159199d6742d5534e61", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.21|^10.0|^11.0", + "illuminate/filesystem": "^9.21|^10.0|^11.0", + "illuminate/support": "^9.21|^10.0|^11.0", + "illuminate/validation": "^9.21|^10.0|^11.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.35|^8.15|^9.0", + "phpunit/phpunit": "^9.3|^10.4|^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "support": { + "source": "https://github.com/laravel/ui/tree/v4.5.1" + }, + "time": "2024-03-21T18:12:29+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "reference": "91c24291965bd6d7c46c46a12ba7492f83b1cadf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.3", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 || ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2024-02-02T11:59:32+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.27.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f", + "reference": "4729745b1ab737908c7d055148c9a6b3e959832f", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.27.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-04-07T19:17:50+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.25.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + } + ], + "time": "2024-03-15T19:58:44+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.15.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-01-28T23:22:08+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-10-27T15:32:31+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", + "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.4" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2022-08-04T09:53:51+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.2.4", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "82c28278c1c8f7b82dcdab25692237f052ffc8d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/82c28278c1c8f7b82dcdab25692237f052ffc8d8", + "reference": "82c28278c1c8f7b82dcdab25692237f052ffc8d8", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.52.1", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.10.65", + "phpunit/phpunit": "^10.5.15", + "squizlabs/php_codesniffer": "^3.9.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-04-05T09:58:10+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.3" + }, + "require-dev": { + "nette/tester": "^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.0" + }, + "time": "2023-12-11T11:54:22+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.4", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.4" + }, + "time": "2024-01-17T16:50:36+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" + }, + "time": "2024-03-05T20:51:40+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/58c4c58cf23df7f498daeb97092e34f5259feb6a", + "reference": "58c4c58cf23df7f498daeb97092e34f5259feb6a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.0.4" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^2.2.0", + "illuminate/console": "^11.0.0", + "laravel/pint": "^1.14.0", + "mockery/mockery": "^1.6.7", + "pestphp/pest": "^2.34.1", + "phpstan/phpstan": "^1.10.59", + "phpstan/phpstan-strict-rules": "^1.5.2", + "symfony/var-dumper": "^7.0.4", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2024-03-06T16:17:14+00:00" + }, + { + "name": "php-mqtt/client", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-mqtt/client.git", + "reference": "82581417df4fa63a95c7584866a8fd2fdef53105" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-mqtt/client/zipball/82581417df4fa63a95c7584866a8fd2fdef53105", + "reference": "82581417df4fa63a95c7584866a8fd2fdef53105", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.7", + "php": "^8.0", + "psr/log": "^1.1|^2.0|^3.0" + }, + "require-dev": { + "phpunit/php-invoker": "^3.0", + "phpunit/phpunit": "^9.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-redis": "Required for the RedisRepository" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpMqtt\\Client\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marvin Mall", + "email": "marvin-mall@msn.com", + "role": "developer" + } + ], + "description": "An MQTT client written in and for PHP.", + "keywords": [ + "client", + "mqtt", + "publish", + "subscribe" + ], + "support": { + "issues": "https://github.com/php-mqtt/client/issues", + "source": "https://github.com/php-mqtt/client/tree/v2.1.0" + }, + "time": "2024-04-24T16:24:36+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-11-12T21:59:55+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.3", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.12.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.3" + }, + "time": "2024-04-02T15:57:53+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.5", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.5" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2023-11-08T05:53:05+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.0.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "8b9d08887353d627d5f6c3bf3373b398b49051c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/8b9d08887353d627d5f6c3bf3373b398b49051c2", + "reference": "8b9d08887353d627d5f6c3bf3373b398b49051c2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.0.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-02T12:46:12+00:00" + }, + { + "name": "symfony/console", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/fde915cd8e7eb99b3d531d3d5c09531429c3f9e5", + "reference": "fde915cd8e7eb99b3d531d3d5c09531429c3f9e5", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-01T11:04:53+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "ec60a4edf94e63b0556b6a0888548bb400a3a3be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/ec60a4edf94e63b0556b6a0888548bb400a3a3be", + "reference": "ec60a4edf94e63b0556b6a0888548bb400a3a3be", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.0.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T15:02:46+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "46a4cc138f799886d4bd70477c55c699d3e9dfc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/46a4cc138f799886d4bd70477c55c699d3e9dfc8", + "reference": "46a4cc138f799886d4bd70477c55c699d3e9dfc8", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-19T11:57:22+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/834c28d533dd0636f910909d01b9ff45cc094b5e", + "reference": "834c28d533dd0636f910909d01b9ff45cc094b5e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T15:02:46+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "4e64b49bf370ade88e567de29465762e316e4224" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224", + "reference": "4e64b49bf370ade88e567de29465762e316e4224", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/6e5688d69f7cfc4ed4a511e96007e06c2d34ce56", + "reference": "6e5688d69f7cfc4ed4a511e96007e06c2d34ce56", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-31T17:59:56+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "8789625dcf36e5fbf753014678a1e090f1bc759c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8789625dcf36e5fbf753014678a1e090f1bc759c", + "reference": "8789625dcf36e5fbf753014678a1e090f1bc759c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-19T11:46:48+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "34c872391046d59af804af62d4573b829cfe4824" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/34c872391046d59af804af62d4573b829cfe4824", + "reference": "34c872391046d59af804af62d4573b829cfe4824", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.0.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-03T06:12:25+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "eb0c3187c7ddfde12d8aa0e1fa5fb29e730a41e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/eb0c3187c7ddfde12d8aa0e1fa5fb29e730a41e0", + "reference": "eb0c3187c7ddfde12d8aa0e1fa5fb29e730a41e0", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-28T09:20:36+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "99362408c9abdf8c7cadcf0529b6fc8b16f5ace2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/99362408c9abdf8c7cadcf0529b6fc8b16f5ace2", + "reference": "99362408c9abdf8c7cadcf0529b6fc8b16f5ace2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-21T19:37:36+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v7.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/0e7727191c3b71ebec6d529fa0e50a01ca5679e9", + "reference": "0e7727191c3b71ebec6d529fa0e50a01ca5679e9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.0.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-22T20:27:20+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "cded64e5bbf9f31786f1055fcc76718fdd77519c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/cded64e5bbf9f31786f1055fcc76718fdd77519c", + "reference": "cded64e5bbf9f31786f1055fcc76718fdd77519c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-28T21:02:11+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "11bbf19a0fb7b36345861e85c5768844c552906e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e", + "reference": "11bbf19a0fb7b36345861e85c5768844c552906e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.4.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-12-19T21:51:00+00:00" + }, + { + "name": "symfony/string", + "version": "v7.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.0.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-01T13:17:36+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "5b75e872f7d135d7abb4613809fadc8d9f3d30a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/5b75e872f7d135d7abb4613809fadc8d9f3d30a0", + "reference": "5b75e872f7d135d7abb4613809fadc8d9f3d30a0", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.0.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-22T20:27:20+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "87cedaf3fabd7b733859d4d77aa4ca598259054b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/87cedaf3fabd7b733859d4d77aa4ca598259054b", + "reference": "87cedaf3fabd7b733859d4d77aa4ca598259054b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.0.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T15:02:46+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "66d13dc207d5dab6b4f4c2b5460efe1bea29dbfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/66d13dc207d5dab6b4f4c2b5460efe1bea29dbfb", + "reference": "66d13dc207d5dab6b4f4c2b5460efe1bea29dbfb", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-03-19T11:57:22+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.2.7", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb", + "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7" + }, + "time": "2023-12-08T13:03:43+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:43:29+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", + "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + }, + "time": "2024-01-02T13:46:09+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", + "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.15.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2023-11-03T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "5f288b5e79938cc72f5c298d384e639de87507c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/5f288b5e79938cc72f5c298d384e639de87507c6", + "reference": "5f288b5e79938cc72f5c298d384e639de87507c6", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.52.1", + "illuminate/view": "^10.48.4", + "larastan/larastan": "^2.9.2", + "laravel-zero/framework": "^10.3.0", + "mockery/mockery": "^1.6.11", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.34.5" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2024-04-02T14:28:47+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.29.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "8be4a31150eab3b46af11a2e7b2c4632eefaad7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/8be4a31150eab3b46af11a2e7b2c4632eefaad7e", + "reference": "8be4a31150eab3b46af11a2e7b2c4632eefaad7e", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0", + "illuminate/support": "^9.52.16|^10.0|^11.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2024-03-20T20:09:31+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.11", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "81a161d0b135df89951abd52296adf97deb0723d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/81a161d0b135df89951abd52296adf97deb0723d", + "reference": "81a161d0b135df89951abd52296adf97deb0723d", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-03-21T18:34:15+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "13e5d538b95a744d85f447a321ce10adb28e9af9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/13e5d538b95a744d85f447a321ce10adb28e9af9", + "reference": "13e5d538b95a744d85f447a321ce10adb28e9af9", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.4", + "nunomaduro/termwind": "^2.0.1", + "php": "^8.2.0", + "symfony/console": "^7.0.4" + }, + "conflict": { + "laravel/framework": "<11.0.0 || >=12.0.0", + "phpunit/phpunit": "<10.5.1 || >=12.0.0" + }, + "require-dev": { + "larastan/larastan": "^2.9.2", + "laravel/framework": "^11.0.0", + "laravel/pint": "^1.14.0", + "laravel/sail": "^1.28.2", + "laravel/sanctum": "^4.0.0", + "laravel/tinker": "^2.9.0", + "orchestra/testbench-core": "^9.0.0", + "pestphp/pest": "^2.34.1 || ^3.0.0", + "sebastian/environment": "^6.0.1 || ^7.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-03-06T16:20:09+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e35a2cbcabac0e6865fd373742ea432a3c34f92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e35a2cbcabac0e6865fd373742ea432a3c34f92", + "reference": "7e35a2cbcabac0e6865fd373742ea432a3c34f92", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-text-template": "^4.0", + "sebastian/code-unit-reverse-lookup": "^4.0", + "sebastian/complexity": "^4.0", + "sebastian/environment": "^7.0", + "sebastian/lines-of-code": "^3.0", + "sebastian/version": "^5.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-12T15:35:40+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "99e95c94ad9500daca992354fa09d7b99abe2210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/99e95c94ad9500daca992354fa09d7b99abe2210", + "reference": "99e95c94ad9500daca992354fa09d7b99abe2210", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:05:04+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5d8d9355a16d8cc5a1305b0a85342cfa420612be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5d8d9355a16d8cc5a1305b0a85342cfa420612be", + "reference": "5d8d9355a16d8cc5a1305b0a85342cfa420612be", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:05:50+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "d38f6cbff1cdb6f40b03c9811421561668cc133e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/d38f6cbff1cdb6f40b03c9811421561668cc133e", + "reference": "d38f6cbff1cdb6f40b03c9811421561668cc133e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:06:56+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "8a59d9e25720482ee7fcdf296595e08795b84dc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8a59d9e25720482ee7fcdf296595e08795b84dc5", + "reference": "8a59d9e25720482ee7fcdf296595e08795b84dc5", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:08:01+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "816cb6070af901c0548aa5f18f2132fd8a6e4ade" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/816cb6070af901c0548aa5f18f2132fd8a6e4ade", + "reference": "816cb6070af901c0548aa5f18f2132fd8a6e4ade", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-invoker": "^5.0", + "phpunit/php-text-template": "^4.0", + "phpunit/php-timer": "^7.0", + "sebastian/cli-parser": "^3.0", + "sebastian/code-unit": "^3.0", + "sebastian/comparator": "^6.0", + "sebastian/diff": "^6.0", + "sebastian/environment": "^7.0", + "sebastian/exporter": "^6.0", + "sebastian/global-state": "^7.0", + "sebastian/object-enumerator": "^6.0", + "sebastian/type": "^5.0", + "sebastian/version": "^5.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.1-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.1.1" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-04-06T06:20:21+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "00a74d5568694711f0222e54fb281e1d15fdf04a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/00a74d5568694711f0222e54fb281e1d15fdf04a", + "reference": "00a74d5568694711f0222e54fb281e1d15fdf04a", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:26:58+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "6634549cb8d702282a04a774e36a7477d2bd9015" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6634549cb8d702282a04a774e36a7477d2bd9015", + "reference": "6634549cb8d702282a04a774e36a7477d2bd9015", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:50:41+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "df80c875d3e459b45c6039e4d9b71d4fbccae25d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/df80c875d3e459b45c6039e4d9b71d4fbccae25d", + "reference": "df80c875d3e459b45c6039e4d9b71d4fbccae25d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:52:17+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "bd0f2fa5b9257c69903537b266ccb80fcf940db8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bd0f2fa5b9257c69903537b266ccb80fcf940db8", + "reference": "bd0f2fa5b9257c69903537b266ccb80fcf940db8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:53:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "88a434ad86150e11a606ac4866b09130712671f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/88a434ad86150e11a606ac4866b09130712671f0", + "reference": "88a434ad86150e11a606ac4866b09130712671f0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:55:19+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ab83243ecc233de5655b76f577711de9f842e712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ab83243ecc233de5655b76f577711de9f842e712", + "reference": "ab83243ecc233de5655b76f577711de9f842e712", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:30:33+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "4eb3a442574d0e9d141aab209cd4aaf25701b09a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4eb3a442574d0e9d141aab209cd4aaf25701b09a", + "reference": "4eb3a442574d0e9d141aab209cd4aaf25701b09a", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:56:34+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "f291e5a317c321c0381fa9ecc796fa2d21b186da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f291e5a317c321c0381fa9ecc796fa2d21b186da", + "reference": "f291e5a317c321c0381fa9ecc796fa2d21b186da", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:28:20+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "c3a307e832f2e69c7ef869e31fc644fde0e7cb3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c3a307e832f2e69c7ef869e31fc644fde0e7cb3e", + "reference": "c3a307e832f2e69c7ef869e31fc644fde0e7cb3e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:32:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "376c5b3f6b43c78fdc049740bca76a7c846706c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/376c5b3f6b43c78fdc049740bca76a7c846706c0", + "reference": "376c5b3f6b43c78fdc049740bca76a7c846706c0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:00:36+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f75f6c460da0bbd9668f43a3dde0ec0ba7faa678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f75f6c460da0bbd9668f43a3dde0ec0ba7faa678", + "reference": "f75f6c460da0bbd9668f43a3dde0ec0ba7faa678", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:01:29+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "bb2a6255d30853425fd38f032eb64ced9f7f132d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/bb2a6255d30853425fd38f032eb64ced9f7f132d", + "reference": "bb2a6255d30853425fd38f032eb64ced9f7f132d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:02:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "b75224967b5a466925c6d54e68edd0edf8dd4ed4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b75224967b5a466925c6d54e68edd0edf8dd4ed4", + "reference": "b75224967b5a466925c6d54e68edd0edf8dd4ed4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:08:48+00:00" + }, + { + "name": "sebastian/type", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b8502785eb3523ca0dd4afe9ca62235590020f3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8502785eb3523ca0dd4afe9ca62235590020f3f", + "reference": "b8502785eb3523ca0dd4afe9ca62235590020f3f", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:09:34+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "13999475d2cb1ab33cb73403ba356a814fdbb001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/13999475d2cb1ab33cb73403ba356a814fdbb001", + "reference": "13999475d2cb1ab33cb73403ba356a814fdbb001", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:10:47+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.5.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2023-06-28T12:59:17+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.4.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "17082e780752d346c2db12ef5d6bee8e835e399c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/17082e780752d346c2db12ef5d6bee8e835e399c", + "reference": "17082e780752d346c2db12ef5d6bee8e835e399c", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", + "php": "^8.0", + "spatie/backtrace": "^1.5.2", + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.4.4" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-01-31T14:18:45+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.13.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "889bf1dfa59e161590f677728b47bf4a6893983b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/889bf1dfa59e161590f677728b47bf4a6893983b", + "reference": "889bf1dfa59e161590f677728b47bf4a6893983b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/backtrace": "^1.5.3", + "spatie/flare-client-php": "^1.4.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "illuminate/cache": "^9.52|^10.0|^11.0", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-03-29T14:03:47+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9", + "reference": "0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0|^11.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.3.5", + "spatie/ignition": "^1.13", + "symfony/console": "^6.2.3|^7.0", + "symfony/var-dumper": "^6.2.3|^7.0" + }, + "require-dev": { + "livewire/livewire": "^2.11|^3.3.5", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.8.1", + "orchestra/testbench": "^8.0|^9.0", + "pestphp/pest": "^2.30", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.3", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-04-02T06:30:22+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "2d4fca631c00700597e9442a0b2451ce234513d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/2d4fca631c00700597e9442a0b2451ce234513d3", + "reference": "2d4fca631c00700597e9442a0b2451ce234513d3", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.0.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-23T15:02:46+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..f467267 --- /dev/null +++ b/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => env('APP_TIMEZONE', 'UTC'), + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..0ba5d5d --- /dev/null +++ b/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', App\Models\User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..3868091 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,107 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'connection' => env('DB_CACHE_CONNECTION'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/config/charts.php b/config/charts.php new file mode 100644 index 0000000..b1a19c4 --- /dev/null +++ b/config/charts.php @@ -0,0 +1,15 @@ + 'Chartjs', +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..f8e8dcb --- /dev/null +++ b/config/database.php @@ -0,0 +1,170 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..44fe9c8 --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,76 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..d526b64 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..8666659 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,111 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "log", "array", "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + +]; diff --git a/config/mqtt.php b/config/mqtt.php new file mode 100644 index 0000000..6524813 --- /dev/null +++ b/config/mqtt.php @@ -0,0 +1,9 @@ + env('MQTT_HOST', '192.168.123.153'), + 'port' => env('MQTT_PORT', 1883), + 'username' => env('MQTT_USERNAME', null), // atau hapus baris ini + 'password' => env('MQTT_PASSWORD', null), // atau hapus baris ini + 'client_id' => env('MQTT_CLIENT_ID', 'laravel-client') +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..116bd8d --- /dev/null +++ b/config/queue.php @@ -0,0 +1,112 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..6bb68f6 --- /dev/null +++ b/config/services.php @@ -0,0 +1,34 @@ + [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..f0b6541 --- /dev/null +++ b/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain and all subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..584104c --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/factories/Waterflow2Factory.php b/database/factories/Waterflow2Factory.php new file mode 100644 index 0000000..dd8ec20 --- /dev/null +++ b/database/factories/Waterflow2Factory.php @@ -0,0 +1,23 @@ + + */ +class Waterflow2Factory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..05fb5d9 --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..b9c106b --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration'); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..425e705 --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2024_04_25_155749_create_blogs_table.php b/database/migrations/2024_04_25_155749_create_blogs_table.php new file mode 100644 index 0000000..ed68a2e --- /dev/null +++ b/database/migrations/2024_04_25_155749_create_blogs_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('title'); + $table->text('content'); + $table->string('author'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('blogs'); + } +} diff --git a/database/migrations/2024_05_05_140309_create_sensor_data_table.php b/database/migrations/2024_05_05_140309_create_sensor_data_table.php new file mode 100644 index 0000000..5424beb --- /dev/null +++ b/database/migrations/2024_05_05_140309_create_sensor_data_table.php @@ -0,0 +1,30 @@ +id(); + $table->integer('value'); + $table->timestamps(); + }); +} + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('sensor_data'); + } +}; diff --git a/database/migrations/2024_05_27_064632_add_image_to_blogs_table.php b/database/migrations/2024_05_27_064632_add_image_to_blogs_table.php new file mode 100644 index 0000000..b3cf291 --- /dev/null +++ b/database/migrations/2024_05_27_064632_add_image_to_blogs_table.php @@ -0,0 +1,22 @@ +string('image')->nullable(); // tambahkan kolom 'image' ke tabel 'blogs' + }); + } + + public function down() + { + Schema::table('blogs', function (Blueprint $table) { + $table->dropColumn('image'); // hapus kolom 'image' dari tabel 'blogs' + }); + } +} diff --git a/database/migrations/2024_05_31_045519_add_tanggal_to_coba_table.php b/database/migrations/2024_05_31_045519_add_tanggal_to_coba_table.php new file mode 100644 index 0000000..dda22c1 --- /dev/null +++ b/database/migrations/2024_05_31_045519_add_tanggal_to_coba_table.php @@ -0,0 +1,32 @@ +timestamp('tanggal')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('coba', function (Blueprint $table) { + $table->dropColumn('tanggal'); + }); + } +} diff --git a/database/migrations/2024_06_03_055154_create_waterflow_table.php b/database/migrations/2024_06_03_055154_create_waterflow_table.php new file mode 100644 index 0000000..bb121fb --- /dev/null +++ b/database/migrations/2024_06_03_055154_create_waterflow_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('waterflow'); + } +}; diff --git a/database/migrations/2024_06_03_055210_create_waterflow_table.php b/database/migrations/2024_06_03_055210_create_waterflow_table.php new file mode 100644 index 0000000..8883c93 --- /dev/null +++ b/database/migrations/2024_06_03_055210_create_waterflow_table.php @@ -0,0 +1,42 @@ +id(); + $table->float('waterflow1'); // Kolom waterflow1 dengan tipe float + $table->float('waterflow2'); // Kolom waterflow2 dengan tipe float + $table->timestamp('tanggal')->useCurrent(); // Kolom tanggal dengan tipe timestamp, menggunakan nilai default saat ini + + // Tambahkan indeks pada kolom 'tanggal' jika Anda berencana untuk sering melakukan pencarian berdasarkan tanggal + // $table->index('tanggal'); + + // Jika Anda ingin menggunakan kolom id sebagai primary key + // $table->primary('id'); + + // Jika Anda ingin menonaktifkan pengaturan timestamps default (created_at dan updated_at) + // $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('waterflow'); + } +} diff --git a/database/migrations/2024_07_03_183229_create_waterflow2s_table.php b/database/migrations/2024_07_03_183229_create_waterflow2s_table.php new file mode 100644 index 0000000..082304a --- /dev/null +++ b/database/migrations/2024_07_03_183229_create_waterflow2s_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('waterflow2s'); + } +}; diff --git a/database/seeders/BlogSeeder.php b/database/seeders/BlogSeeder.php new file mode 100644 index 0000000..86226e3 --- /dev/null +++ b/database/seeders/BlogSeeder.php @@ -0,0 +1,26 @@ + 'Judul Artikel Pertama', + 'content' => 'Ini adalah konten dari artikel pertama.', + 'author' => 'Nama Penulis 1', + ]); + + Blog::create([ + 'title' => 'Judul Artikel Kedua', + 'content' => 'Ini adalah konten dari artikel kedua.', + 'author' => 'Nama Penulis 2', + ]); + + // Tambahkan data dummy lainnya sesuai kebutuhan + } +} diff --git a/database/seeders/CobaSeeder.php b/database/seeders/CobaSeeder.php new file mode 100644 index 0000000..f8d3794 --- /dev/null +++ b/database/seeders/CobaSeeder.php @@ -0,0 +1,23 @@ +insert([ + 'ultrasonik' => $faker->randomFloat(2, 0, 100), // Data float acak antara 0 dan 100 dengan 2 desimal + 'tanggal' => now() // Menyimpan waktu saat ini + ]); + echo "Inserted record $i\n"; + } + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..c2ded09 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,21 @@ +call([ + Waterflow1Seeder::class, + Waterflow2Seeder::class, + ]); + } +} diff --git a/database/seeders/TdsSeeder.php b/database/seeders/TdsSeeder.php new file mode 100644 index 0000000..e45bfc7 --- /dev/null +++ b/database/seeders/TdsSeeder.php @@ -0,0 +1,28 @@ +insert([ + 'tds' => $faker->numberBetween(1160, 1190), // Data tds acak antara 1160 dan 1190 + 'tanggal' => $startDate->copy() // Salin waktu saat ini + ]); + echo "Inserted record for " . $startDate->toDateTimeString() . "\n"; + $startDate->addHours(3); // Interval 3 jam + } + } +} diff --git a/database/seeders/Waterflow1Seeder.php b/database/seeders/Waterflow1Seeder.php new file mode 100644 index 0000000..7104d96 --- /dev/null +++ b/database/seeders/Waterflow1Seeder.php @@ -0,0 +1,28 @@ + $faker->randomFloat(2, 0.0, 10.0), // Arus dalam rentang 0.0 hingga 10.0 Ampere + 'total' => $faker->randomFloat(2, 0.0, 1000.0), // Total arus dalam rentang 0.0 hingga 1000.0 + 'tanggal' => $faker->dateTimeThisYear() // Tanggal acak dalam tahun ini + ]); + } + } +} diff --git a/database/seeders/Waterflow2Seeder.php b/database/seeders/Waterflow2Seeder.php new file mode 100644 index 0000000..61c32a8 --- /dev/null +++ b/database/seeders/Waterflow2Seeder.php @@ -0,0 +1,28 @@ + $faker->randomFloat(2, 0.0, 10.0), // Arus dalam rentang 0.0 hingga 10.0 Ampere + 'total' => $faker->randomFloat(2, 0.0, 1000.0), // Total arus dalam rentang 0.0 hingga 1000.0 + 'tanggal' => $faker->dateTimeThisYear() // Tanggal acak dalam tahun ini + ]); + } + } +} diff --git a/ds/.gitignore b/ds/.gitignore new file mode 100644 index 0000000..6704566 --- /dev/null +++ b/ds/.gitignore @@ -0,0 +1,104 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port diff --git a/ds/LICENSE b/ds/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/ds/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ds/README.md b/ds/README.md new file mode 100644 index 0000000..afd76e1 --- /dev/null +++ b/ds/README.md @@ -0,0 +1,28 @@ +# mqtt-custom-dashboard-node-js +A custom MQTT dashboard built using Node.js that can be used to display sensor readings from a BME280 sensor +![Featured Image - Custom MQTT Dashboard](https://user-images.githubusercontent.com/69466026/213635253-3e988d9e-bc5b-49fe-9ef5-d1bfcd38075b.jpg) + +## Write up +[How to build your own custom MQTT dashboard?](https://www.donskytech.com/how-to-build-your-own-custom-mqtt-dashboard/) + + +## How to run +You should have Node.js installed in your workstation + +Clone the repository +``` git clone https://github.com/donskytech/mqtt-custom-dashboard-node-js.git ``` +``` cd mqtt-custom-dashboard-node-js ``` + +Rename the .env.local to .env +``` mv .env.local .env ``` + +Edit the .env and set the MQTT broker URL that you are using +``` +NAME=DONSKYTECH +DASHBOARD_TITLE=MQTT DASHBOARD +MQTT_BROKER=ws://127.0.01:9001/mqtt +MQTT_TOPIC=sensorReadings +``` + +Install the dependencies and run the project +``` npm install && npm run dev ``` diff --git a/ds/app.js b/ds/app.js new file mode 100644 index 0000000..64d498e --- /dev/null +++ b/ds/app.js @@ -0,0 +1,30 @@ +const express = require("express"); +const app = express(); +const port = 3000; + +// load dotenv to read environment variables +require("dotenv").config(); + +// template view engine +app.set("view engine", "ejs"); + +// Serve Static Files +app.use(express.static("public")); + +//routes +const dashboardRouter = require("./routes/dashboard"); + +app.get("/mqttConnDetails", (req, res) => { + res.send( + JSON.stringify({ + mqttServer: process.env.MQTT_BROKER, + mqttTopic: process.env.MQTT_TOPIC, + }) + ); +}); + +app.get("/", dashboardRouter); + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`); +}); diff --git a/ds/package-lock.json b/ds/package-lock.json new file mode 100644 index 0000000..a529956 --- /dev/null +++ b/ds/package-lock.json @@ -0,0 +1,2046 @@ +{ + "name": "mqtt-custom-dashboard-node", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "mqtt-custom-dashboard-node", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dotenv": "^16.0.3", + "ejs": "^3.1.8", + "express": "^4.18.2" + }, + "devDependencies": { + "nodemon": "^3.1.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "requires": { + "jake": "^10.8.5" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "nodemon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + } + } +} diff --git a/ds/package.json b/ds/package.json new file mode 100644 index 0000000..9414890 --- /dev/null +++ b/ds/package.json @@ -0,0 +1,29 @@ +{ + "name": "mqtt-custom-dashboard-node", + "version": "1.0.0", + "description": "A custom MQTT dashboard built using Node.js that can be used to display sensor readings from a BME280 sensor", + "main": "index.js", + "scripts": { + "prod": "node app.js", + "dev": "nodemon app.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/donskytech/mqtt-custom-dashboard-node-js.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/donskytech/mqtt-custom-dashboard-node-js/issues" + }, + "homepage": "https://github.com/donskytech/mqtt-custom-dashboard-node-js#readme", + "dependencies": { + "dotenv": "^16.0.3", + "ejs": "^3.1.8", + "express": "^4.18.2" + }, + "devDependencies": { + "nodemon": "^3.1.0" + } +} diff --git a/ds/public/images/logo.png b/ds/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2266a09bce316048ccece92943eb60b181f2830c GIT binary patch literal 21303 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 J0(rB*{{cVNd^rFB literal 0 HcmV?d00001 diff --git a/ds/public/index.js b/ds/public/index.js new file mode 100644 index 0000000..af19590 --- /dev/null +++ b/ds/public/index.js @@ -0,0 +1,554 @@ +// Import MQTT service +import { MQTTService } from "./mqttService.js"; + +// Target specific HTML items +const sideMenu = document.querySelector("aside"); +const menuBtn = document.querySelector("#menu-btn"); +const closeBtn = document.querySelector("#close-btn"); +const themeToggler = document.querySelector(".theme-toggler"); + +// Holds the background color of all chart +var chartBGColor = getComputedStyle(document.body).getPropertyValue( + "--chart-background" +); +var chartFontColor = getComputedStyle(document.body).getPropertyValue( + "--chart-font-color" +); +var chartAxisColor = getComputedStyle(document.body).getPropertyValue( + "--chart-axis-color" +); + +/* + Event listeners for any HTML click +*/ +menuBtn.addEventListener("click", () => { + sideMenu.style.display = "block"; +}); + +closeBtn.addEventListener("click", () => { + sideMenu.style.display = "none"; +}); + +themeToggler.addEventListener("click", () => { + document.body.classList.toggle("dark-theme-variables"); + themeToggler.querySelector("span:nth-child(1)").classList.toggle("active"); + themeToggler.querySelector("span:nth-child(2)").classList.toggle("active"); + + // Update Chart background + chartBGColor = getComputedStyle(document.body).getPropertyValue( + "--chart-background" + ); + chartFontColor = getComputedStyle(document.body).getPropertyValue( + "--chart-font-color" + ); + chartAxisColor = getComputedStyle(document.body).getPropertyValue( + "--chart-axis-color" + ); + updateChartsBackground(); +}); + +/* + Plotly.js graph and chart setup code +*/ +var temperatureHistoryDiv = document.getElementById("temperature-history"); +var humidityHistoryDiv = document.getElementById("humidity-history"); +var pressureHistoryDiv = document.getElementById("pressure-history"); +var altitudeHistoryDiv = document.getElementById("altitude-history"); + +var temperatureGaugeDiv = document.getElementById("temperature-gauge"); +var humidityGaugeDiv = document.getElementById("humidity-gauge"); +var pressureGaugeDiv = document.getElementById("pressure-gauge"); +var altitudeGaugeDiv = document.getElementById("altitude-gauge"); + +const historyCharts = [ + temperatureHistoryDiv, + humidityHistoryDiv, + pressureHistoryDiv, + altitudeHistoryDiv, +]; + +const gaugeCharts = [ + temperatureGaugeDiv, + humidityGaugeDiv, + pressureGaugeDiv, + altitudeGaugeDiv, +]; + +// History Data +var temperatureTrace = { + x: [], + y: [], + name: "Temperature", + mode: "lines+markers", + type: "line", +}; +var humidityTrace = { + x: [], + y: [], + name: "Humidity", + mode: "lines+markers", + type: "line", +}; +var pressureTrace = { + x: [], + y: [], + name: "Pressure", + mode: "lines+markers", + type: "line", +}; +var altitudeTrace = { + x: [], + y: [], + name: "Altitude", + mode: "lines+markers", + type: "line", +}; + +var temperatureLayout = { + autosize: true, + title: { + text: "Temperature", + }, + font: { + size: 12, + color: chartFontColor, + family: "poppins, san-serif", + }, + colorway: ["#05AD86"], + margin: { t: 40, b: 40, l: 30, r: 30, pad: 10 }, + plot_bgcolor: chartBGColor, + paper_bgcolor: chartBGColor, + xaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + gridwidth: "2", + autorange: true, + }, + yaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + gridwidth: "2", + autorange: true, + }, +}; +var humidityLayout = { + autosize: true, + title: { + text: "Humidity", + }, + font: { + size: 12, + color: chartFontColor, + family: "poppins, san-serif", + }, + colorway: ["#05AD86"], + margin: { t: 40, b: 40, l: 30, r: 30, pad: 0 }, + plot_bgcolor: chartBGColor, + paper_bgcolor: chartBGColor, + xaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + gridwidth: "2", + }, + yaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + }, +}; +var pressureLayout = { + autosize: true, + title: { + text: "Pressure", + }, + font: { + size: 12, + color: chartFontColor, + family: "poppins, san-serif", + }, + colorway: ["#05AD86"], + margin: { t: 40, b: 40, l: 30, r: 30, pad: 0 }, + plot_bgcolor: chartBGColor, + paper_bgcolor: chartBGColor, + xaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + gridwidth: "2", + }, + yaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + }, +}; +var altitudeLayout = { + autosize: true, + title: { + text: "Altitude", + }, + font: { + size: 12, + color: chartFontColor, + family: "poppins, san-serif", + }, + colorway: ["#05AD86"], + margin: { t: 40, b: 40, l: 30, r: 30, pad: 0 }, + plot_bgcolor: chartBGColor, + paper_bgcolor: chartBGColor, + xaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + gridwidth: "2", + }, + yaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + }, +}; + +var config = { responsive: true, displayModeBar: false }; + +// Event listener when page is loaded +window.addEventListener("load", (event) => { + Plotly.newPlot( + temperatureHistoryDiv, + [temperatureTrace], + temperatureLayout, + config + ); + Plotly.newPlot(humidityHistoryDiv, [humidityTrace], humidityLayout, config); + Plotly.newPlot(pressureHistoryDiv, [pressureTrace], pressureLayout, config); + Plotly.newPlot(altitudeHistoryDiv, [altitudeTrace], altitudeLayout, config); + + // Get MQTT Connection + fetchMQTTConnection(); + + // Run it initially + handleDeviceChange(mediaQuery); +}); + +// Gauge Data +var temperatureData = [ + { + domain: { x: [0, 1], y: [0, 1] }, + value: 0, + title: { text: "Temperature" }, + type: "indicator", + mode: "gauge+number+delta", + delta: { reference: 30 }, + gauge: { + axis: { range: [null, 50] }, + steps: [ + { range: [0, 20], color: "lightgray" }, + { range: [20, 30], color: "gray" }, + ], + threshold: { + line: { color: "red", width: 4 }, + thickness: 0.75, + value: 30, + }, + }, + }, +]; + +var humidityData = [ + { + domain: { x: [0, 1], y: [0, 1] }, + value: 0, + title: { text: "Humidity" }, + type: "indicator", + mode: "gauge+number+delta", + delta: { reference: 50 }, + gauge: { + axis: { range: [null, 100] }, + steps: [ + { range: [0, 20], color: "lightgray" }, + { range: [20, 30], color: "gray" }, + ], + threshold: { + line: { color: "red", width: 4 }, + thickness: 0.75, + value: 30, + }, + }, + }, +]; + +var pressureData = [ + { + domain: { x: [0, 1], y: [0, 1] }, + value: 0, + title: { text: "Pressure" }, + type: "indicator", + mode: "gauge+number+delta", + delta: { reference: 750 }, + gauge: { + axis: { range: [null, 1100] }, + steps: [ + { range: [0, 300], color: "lightgray" }, + { range: [300, 700], color: "gray" }, + ], + threshold: { + line: { color: "red", width: 4 }, + thickness: 0.75, + value: 30, + }, + }, + }, +]; + +var altitudeData = [ + { + domain: { x: [0, 1], y: [0, 1] }, + value: 0, + title: { text: "Altitude" }, + type: "indicator", + mode: "gauge+number+delta", + delta: { reference: 60 }, + gauge: { + axis: { range: [null, 150] }, + steps: [ + { range: [0, 50], color: "lightgray" }, + { range: [50, 100], color: "gray" }, + ], + threshold: { + line: { color: "red", width: 4 }, + thickness: 0.75, + value: 30, + }, + }, + }, +]; + +var layout = { width: 300, height: 250, margin: { t: 0, b: 0, l: 0, r: 0 } }; + +Plotly.newPlot(temperatureGaugeDiv, temperatureData, layout); +Plotly.newPlot(humidityGaugeDiv, humidityData, layout); +Plotly.newPlot(pressureGaugeDiv, pressureData, layout); +Plotly.newPlot(altitudeGaugeDiv, altitudeData, layout); + +// Will hold the arrays we receive from our BME280 sensor +// Temperature +let newTempXArray = []; +let newTempYArray = []; +// Humidity +let newHumidityXArray = []; +let newHumidityYArray = []; +// Pressure +let newPressureXArray = []; +let newPressureYArray = []; +// Altitude +let newAltitudeXArray = []; +let newAltitudeYArray = []; + +// The maximum number of data points displayed on our scatter/line graph +let MAX_GRAPH_POINTS = 12; +let ctr = 0; + +// Callback function that will retrieve our latest sensor readings and redraw our Gauge with the latest readings +function updateSensorReadings(jsonResponse) { + console.log(typeof jsonResponse); + console.log(jsonResponse); + + let temperature = Number(jsonResponse.temperature).toFixed(2); + let humidity = Number(jsonResponse.humidity).toFixed(2); + let pressure = Number(jsonResponse.pressure).toFixed(2); + let altitude = Number(jsonResponse.altitude).toFixed(2); + + updateBoxes(temperature, humidity, pressure, altitude); + + updateGauge(temperature, humidity, pressure, altitude); + + // Update Temperature Line Chart + updateCharts( + temperatureHistoryDiv, + newTempXArray, + newTempYArray, + temperature + ); + // Update Humidity Line Chart + updateCharts( + humidityHistoryDiv, + newHumidityXArray, + newHumidityYArray, + humidity + ); + // Update Pressure Line Chart + updateCharts( + pressureHistoryDiv, + newPressureXArray, + newPressureYArray, + pressure + ); + + // Update Altitude Line Chart + updateCharts( + altitudeHistoryDiv, + newAltitudeXArray, + newAltitudeYArray, + altitude + ); +} + +function updateBoxes(temperature, humidity, pressure, altitude) { + let temperatureDiv = document.getElementById("temperature"); + let humidityDiv = document.getElementById("humidity"); + let pressureDiv = document.getElementById("pressure"); + let altitudeDiv = document.getElementById("altitude"); + + temperatureDiv.innerHTML = temperature + " C"; + humidityDiv.innerHTML = humidity + " %"; + pressureDiv.innerHTML = pressure + " hPa"; + altitudeDiv.innerHTML = altitude + " m"; +} + +function updateGauge(temperature, humidity, pressure, altitude) { + var temperature_update = { + value: temperature, + }; + var humidity_update = { + value: humidity, + }; + var pressure_update = { + value: pressure, + }; + var altitude_update = { + value: altitude, + }; + Plotly.update(temperatureGaugeDiv, temperature_update); + Plotly.update(humidityGaugeDiv, humidity_update); + Plotly.update(pressureGaugeDiv, pressure_update); + Plotly.update(altitudeGaugeDiv, altitude_update); +} + +function updateCharts(lineChartDiv, xArray, yArray, sensorRead) { + if (xArray.length >= MAX_GRAPH_POINTS) { + xArray.shift(); + } + if (yArray.length >= MAX_GRAPH_POINTS) { + yArray.shift(); + } + xArray.push(ctr++); + yArray.push(sensorRead); + + var data_update = { + x: [xArray], + y: [yArray], + }; + + Plotly.update(lineChartDiv, data_update); +} + +function updateChartsBackground() { + // updates the background color of historical charts + var updateHistory = { + plot_bgcolor: chartBGColor, + paper_bgcolor: chartBGColor, + font: { + color: chartFontColor, + }, + xaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + }, + yaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + }, + }; + historyCharts.forEach((chart) => Plotly.relayout(chart, updateHistory)); + + // updates the background color of gauge charts + var gaugeHistory = { + plot_bgcolor: chartBGColor, + paper_bgcolor: chartBGColor, + font: { + color: chartFontColor, + }, + xaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + }, + yaxis: { + color: chartAxisColor, + linecolor: chartAxisColor, + }, + }; + gaugeCharts.forEach((chart) => Plotly.relayout(chart, gaugeHistory)); +} + +const mediaQuery = window.matchMedia("(max-width: 600px)"); + +mediaQuery.addEventListener("change", function (e) { + handleDeviceChange(e); +}); + +function handleDeviceChange(e) { + if (e.matches) { + console.log("Inside Mobile"); + var updateHistory = { + width: 323, + height: 250, + "xaxis.autorange": true, + "yaxis.autorange": true, + }; + historyCharts.forEach((chart) => Plotly.relayout(chart, updateHistory)); + } else { + var updateHistory = { + width: 550, + height: 260, + "xaxis.autorange": true, + "yaxis.autorange": true, + }; + historyCharts.forEach((chart) => Plotly.relayout(chart, updateHistory)); + } +} + +/* + MQTT Message Handling Code +*/ +const mqttStatus = document.querySelector(".status"); + +function onConnect(message) { + mqttStatus.textContent = "Connected"; +} +function onMessage(topic, message) { + var stringResponse = message.toString(); + var messageResponse = JSON.parse(stringResponse); + updateSensorReadings(messageResponse); +} + +function onError(error) { + console.log(`Error encountered :: ${error}`); + mqttStatus.textContent = "Error"; +} + +function onClose() { + console.log(`MQTT connection closed!`); + mqttStatus.textContent = "Closed"; +} + +function fetchMQTTConnection() { + fetch("/mqttConnDetails", { + method: "GET", + headers: { + "Content-type": "application/json; charset=UTF-8", + }, + }) + .then(function (response) { + return response.json(); + }) + .then(function (data) { + initializeMQTTConnection(data.mqttServer, data.mqttTopic); + }) + .catch((error) => console.error("Error getting MQTT Connection :", error)); +} +function initializeMQTTConnection(mqttServer, mqttTopic) { + console.log( + `Initializing connection to :: ${mqttServer}, topic :: ${mqttTopic}` + ); + var fnCallbacks = { onConnect, onMessage, onError, onClose }; + + var mqttService = new MQTTService(mqttServer, fnCallbacks); + mqttService.connect(); + + mqttService.subscribe(mqttTopic); +} diff --git a/ds/public/mqttService.js b/ds/public/mqttService.js new file mode 100644 index 0000000..a61f073 --- /dev/null +++ b/ds/public/mqttService.js @@ -0,0 +1,50 @@ +export class MQTTService { + constructor(host, messageCallbacks) { + this.mqttClient = null; + this.host = host; + this.messageCallbacks = messageCallbacks; + } + + connect() { + this.mqttClient = mqtt.connect(this.host); + + // MQTT Callback for 'error' event + this.mqttClient.on("error", (err) => { + console.log(err); + this.mqttClient.end(); + if (this.messageCallbacks && this.messageCallbacks.onError) + this.messageCallbacks.onError(err); + }); + + // MQTT Callback for 'connect' event + this.mqttClient.on("connect", () => { + console.log(`MQTT client connected`); + if (this.messageCallbacks && this.messageCallbacks.onConnect) { + this.messageCallbacks.onConnect("Connected"); + } + }); + + // Call the message callback function when message arrived + this.mqttClient.on("message", (topic, message) => { + if (this.messageCallbacks && this.messageCallbacks.onMessage) { + this.messageCallbacks.onMessage(topic, message); + } + }); + + this.mqttClient.on("close", () => { + console.log(`MQTT client disconnected`); + if (this.messageCallbacks && this.messageCallbacks.onClose) + this.messageCallbacks.onClose(); + }); + } + + // Publish MQTT Message + publish(topic, message, options) { + this.mqttClient.publish(topic, message); + } + + // Subscribe to MQTT Message + subscribe(topic, options) { + this.mqttClient.subscribe(topic, options); + } +} diff --git a/ds/public/style.css b/ds/public/style.css new file mode 100644 index 0000000..684f9c0 --- /dev/null +++ b/ds/public/style.css @@ -0,0 +1,553 @@ +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700;800&display=swap"); + +:root { + --color-primary: #7380ec; + --color-danger: #ff7782; + --color-success: #41f1b6; + --color-warning: #ffbb55; + --color-white: #fff; + --color-info-dark: #7d8da1; + --color-info-light: #dce1eb; + --color-dark: #363949; + --color-light: rgba(132, 139, 200, 0.18); + --color-primary-variant: #111e88; + --color-dark-variant: #677483; + --color-background: #f6f6f9; + + --color-insight-1: rgb(99, 209, 35); + --color-insight-2: rgb(233, 245, 59); + --color-insight-3: rgb(204, 52, 67); + --color-insight-4: rgb(56, 183, 238); + + --card-border-radius: 2rem; + --border-radius-1: 0.4rem; + --border-radius-2: 0.8rem; + --border-radius-3: 1.2rem; + + --card-padding: 1.8rem; + --padding-1: 1.2rem; + + --box-shadow: 0 2rem 3rem var(--color-light); + + /* Plotly Chart Color */ + --chart-background: #fff; + --chart-font-color: #444; + --chart-axis-color: #444; +} +/* Dark Theme Variables */ +.dark-theme-variables { + --color-background: #090d3e; + --color-white: #0b0f4a; + --color-primary: #fff; + --color-dark: #edeffd; + --color-dark-variant: #fff; + --color-light: rgba(0, 0, 0, 0.4); + --box-shadow: 0 2rem 3rem var(--color-light); + + --chart-background: #0d1256; + --chart-font-color: #fff; + --chart-axis-color: #fff; +} + +* { + margin: 0; + padding: 0; + outline: 0; + appearance: none; + text-decoration: none; + list-style: none; + box-sizing: border-box; +} + +html { + font-size: 14px; +} +body { + width: 100vw; + height: 100vh; + font-family: poppins, san-serif; + font-size: 0.88rem; + background: var(--color-background); + user-select: none; + overflow-x: hidden; + color: var(--color-dark-variant); +} +.container { + display: grid; + width: 96%; + margin: 0 auto; + gap: 1.8rem; + grid-template-columns: 14rem auto 30rem; +} +a { + color: var(--color-dark); +} +img { + display: block; + width: 100%; +} +h1 { + font-weight: 800; + font-size: 1.8rem; +} +h2 { + font-size: 1.4rem; +} +h3 { + font-size: 0.87rem; +} +h4 { + font-size: 0.8rem; +} +h5 { + font-size: 0.77rem; +} +small { + font-size: 0.75rem; +} +.profile-photo { + width: 2.8rem; + height: 2.8rem; + border-radius: 50%; + overflow: hidden; +} +.text-muted { + color: var(--color-info-light); +} +p { + color: var(--color-dark-variant); +} +b { + color: var(--color-dark-variant); +} +.primary { + color: var(--color-primary); +} +.danger { + color: var(--color-danger); +} +.success { + color: var(--color-success); +} +.warning { + color: var(--color-warning); +} + +/***** Sidebar Image*****/ +aside { + height: 100vh; +} +aside .top { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: 1.4rem; +} +aside .logo { + display: flex; + gap: 0.8rem; +} +aside .logo img { + width: 2rem; + height: 2re; +} +aside .close { + display: none; +} +/***** Sidebar Links*****/ +aside .sidebar { + display: flex; + flex-direction: column; + height: 86vh; + position: relative; + top: 3rem; +} +aside h3 { + font-weight: 500; +} + +aside .sidebar a { + display: flex; + color: var(--color-info-dark); + margin-left: 2rem; + gap: 1rem; + align-items: center; + position: relative; + height: 3.7rem; + transition: all 300ms ease; +} + +aside .sidebar a span { + font-size: 1.6rem; + transition: all 300ms ease; +} + +/* aside .sidebar a:last-child { + position: absolute; + bottom: 2rem; + width: 100%; +} */ + +aside .sidebar a.active { + background: var(--color-light); + color: var(--color-primary); + margin-left: 0; +} +aside .sidebar a.active:before { + content: ""; + width: 6px; + height: 100%; + background: var(--color-primary); +} +aside .sidebar a.active span { + color: var(--color-primary); + margin-left: calc(1rem - 6px); +} +aside .sidebar a:hover { + color: var(--color-primary); +} + +aside .sidebar a:hover span { + margin-left: 1rem; +} + +/************* main ******************/ +main { + margin-top: 1.4rem; +} + +main .insights { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 1.6rem; +} +main .insights > div { + background: var(--color-white); + padding: var(--card-padding); + border-radius: var(--card-border-radius); + margin-top: 1rem; + box-shadow: var(--box-shadow); + transition: all 300ms ease; +} + +main .insights > div:hover { + box-shadow: none; +} + +main .insights > div span { + background: var(--color-primary); + padding: 0.5rem; + border-radius: 50%; + color: var(--color-white); + font-size: 2rem; +} + +main .insights > div.temperature span { + background: var(--color-insight-1); +} + +main .insights > div.humidity span { + background: var(--color-insight-2); +} + +main .insights > div.pressure span { + background: var(--color-insight-3); +} +main .insights > div.altitude span { + background: var(--color-insight-4); +} + +main .insights > div .middle { + display: flex; + align-items: center; + justify-content: space-between; +} + +main .insights h3 { + margin: 1rem 0 0.6rem; + font-size: 1rem; +} + +/************* End of Insights ******************/ +main .histories { + margin-top: 2rem; +} + +main .history-charts { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 2.5rem; + background: var(--color-white); + border-radius: var(--border-radius-1); + padding: var(--card-padding); + text-align: center; + box-shadow: var(--box-shadow); +} +main .history-charts:hover { + box-shadow: none; +} + +main .history-charts .history-divs { + text-align: center; +} + +main .histories h2 { + margin-bottom: 0.8rem; +} + +/* ********RIGHT ********** */ +.right { + margin-top: 1.4rem; +} +.right .top { + display: flex; + justify-content: end; + gap: 2rem; +} +.right .top button { + display: none; +} + +.right .theme-toggler { + background: var(--color-light); + display: flex; + justify-content: space-between; + align-items: center; + height: 1.6rem; + width: 4.2rem; + cursor: pointer; + border-radius: var(--border-radius-1); +} + +.right .theme-toggler span { + font-size: 1.2rem; + width: 50%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.right .theme-toggler span.active { + background: var(--color-primary); + color: white; + border-radius: var(--border-radius-1); +} + +/* GAUGE CHARTS */ +.right .gauge-charts { + margin-top: 2rem; +} +.right .gauge-charts .item { + background: var(--color-white); + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; + margin-bottom: 0.7rem; + padding: 1.4rem var(--card-padding); + border-radius: var(--border-radius-3); + box-shadow: var(--box-shadow); + transition: all 300ms ease; +} +.right .gauge-charts .item:hover { + box-shadow: none; +} + +.right .gauge-charts .item .right { + display: flex; + justify-content: space-between; + align-items: start; + margin: 0; + width: 100%; +} + +.right .gauge-charts .item .icon { + padding: 0.6rem; + color: var(--color-white); + border-radius: 50%; + background: var(--color-primary); + display: flex; +} + +.right .gauge-charts .item.offline .icon { + background: var(--color-danger); +} + +/* MEDIA QUERIES */ +@media screen and (max-width: 1200px) { + .container { + width: 94%; + grid-template-columns: 7rem auto 23rem; + } + aside .logo h2 { + display: none; + } + + aside .sidebar h3 { + display: none; + } + aside .sidebar a { + width: 5.6rem; + } + aside .sidebar a:last-child { + position: relative; + margin-top: 1.8rem; + } + main .insights { + grid-template-columns: 1fr; + } + main .histories { + width: 94%; + position: absolute; + left: 50%; + transform: translateX(-50%); + margin: 2rem 0 0 8.8rem; + } + main .histories .history-charts { + grid-template-columns: 1fr; + width: 54vw; + } +} + +@media only screen and (max-width: 992px) { + .container { + width: 94%; + grid-template-columns: 12rem auto 23rem; + } + main .insights { + grid-template-columns: repeat(2, 1fr); + gap: 1.6rem; + } + main .histories .history-charts { + grid-template-columns: 1fr; + align-items: center; + justify-content: center; + } +} + +@media screen and (max-width: 768px) { + .container { + width: 100%; + grid-template-columns: 1fr; + /* height: 100vh; */ + } + aside { + position: fixed; + left: -100%; + background: var(--color-white); + width: 18rem; + z-index: 3; + box-shadow: 1rem 3rem 4rem var(--color-light); + height: 100vh; + padding-right: var(--card-padding); + display: none; + animation: showMenu 400ms ease forwards; + } + @keyframes showMenu { + to { + left: 0; + } + } + aside .logo { + margin-left: 1rem; + } + aside .logo h2 { + display: inline; + } + aside .sidebar h3 { + display: inline; + } + aside .sidebar a { + width: 100%; + height: 3.4rem; + } + /* aside .sidebar a:last-child { + position: absolute; + bottom: 5rem; + } */ + aside .close { + display: inline-block; + cursor: pointer; + } + main { + margin: 8rem 2rem 2rem 2rem; + padding: 0 1rem; + } + main .histories { + position: relative; + margin: 3rem 0 0 0; + width: 100%; + } + main .histories .history-charts { + width: 100%; + justify-content: center; + align-items: center; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + .right { + width: 90%; + margin: 0 auto 0rem auto; + } + .right .top { + position: fixed; + top: 0; + left: 0; + align-items: center; + padding: 0 0.8rem; + height: 4.6rem; + background: var(--color-white); + width: 100%; + margin: 0; + z-index: 2; + box-shadow: 0 1rem 1 rem var(--color-light); + } + .right .top .theme-toggler { + width: 4.4rem; + position: absolute; + right: 2rem; + } + .right .profile .info { + display: none; + } + + .right .top button { + display: inline-block; + background: transparent; + cursor: pointer; + color: var(--color-dark); + position: absolute; + left: 1rem; + } + .right .top button span { + font-size: 2rem; + } +} + +@media screen and (max-width: 600px) { + .container { + width: 100%; + grid-template-columns: 1fr; + margin: 1rem 0 1rem 0; + } + main { + margin: 5rem 1rem 1rem 1rem; + padding: 0 1rem; + width: 90vw; + } + + main .insights { + gap: 0.4rem; + } + main .insights > div { + padding: 0.4rem; + } + + main .history-charts { + display: grid; + grid-template-columns: 1fr; + } +} diff --git a/ds/routes/dashboard.js b/ds/routes/dashboard.js new file mode 100644 index 0000000..40a6059 --- /dev/null +++ b/ds/routes/dashboard.js @@ -0,0 +1,12 @@ +const express = require("express"); +const router = express.Router(); + +// Home page - Dashboard. +router.get("/", function (req, res) { + res.render("pages/dashboard", { + name: process.env.NAME, + dashboardTitle: process.env.DASHBOARD_TITLE, + }); +}); + +module.exports = router; diff --git a/ds/views/pages/dashboard.ejs b/ds/views/pages/dashboard.ejs new file mode 100644 index 0000000..1ebf1ab --- /dev/null +++ b/ds/views/pages/dashboard.ejs @@ -0,0 +1,134 @@ + + + + + + + <%=dashboardTitle%> + + + + + + +
+ +
+

<%=dashboardTitle%>

+
+

Connection Status: Disconnected

+
+
+
+
+
+

Temperature

+

+
+
+ device_thermostat +
+
+
+ +
+
+
+

Humidity

+

+
+
+ + humidity_percentage + +
+
+
+ +
+
+
+

Pressure

+

+
+
+ speed +
+
+
+ +
+
+
+

Approx Altitude

+

+
+
+ altitude +
+
+
+ +
+ +
+

Historical Charts

+
+
+
+
+
+
+
+
+
+
+ +
+ light_mode + dark_mode +
+
+ +
+

Gauge Charts

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8325938 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1312 @@ +{ + "name": "fixTA", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "chart.js": "^4.4.3", + "vue": "^3.4.31" + }, + "devDependencies": { + "@popperjs/core": "^2.11.6", + "axios": "^1.6.4", + "bootstrap": "^5.2.3", + "laravel-vite-plugin": "^1.0.2", + "sass": "^1.56.1", + "vite": "^5.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.2.tgz", + "integrity": "sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.2.tgz", + "integrity": "sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.2.tgz", + "integrity": "sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.2.tgz", + "integrity": "sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.2.tgz", + "integrity": "sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz", + "integrity": "sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.2.tgz", + "integrity": "sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.2.tgz", + "integrity": "sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.2.tgz", + "integrity": "sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.2.tgz", + "integrity": "sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.2.tgz", + "integrity": "sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.2.tgz", + "integrity": "sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.2.tgz", + "integrity": "sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.2.tgz", + "integrity": "sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.2.tgz", + "integrity": "sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", + "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.31", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", + "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", + "dependencies": { + "@vue/compiler-core": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", + "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.31", + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", + "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", + "dependencies": { + "@vue/compiler-dom": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", + "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", + "dependencies": { + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", + "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", + "dependencies": { + "@vue/reactivity": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", + "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", + "dependencies": { + "@vue/reactivity": "3.4.31", + "@vue/runtime-core": "3.4.31", + "@vue/shared": "3.4.31", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", + "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", + "dependencies": { + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31" + }, + "peerDependencies": { + "vue": "3.4.31" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", + "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.0.2.tgz", + "integrity": "sha512-Mcclml10khYzBVxDwJro8wnVDwD4i7XOSEMACQNnarvTnHjrjXLLL+B/Snif2wYAyElsOqagJZ7VAinb/2vF5g==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rollup": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.2.tgz", + "integrity": "sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.14.2", + "@rollup/rollup-android-arm64": "4.14.2", + "@rollup/rollup-darwin-arm64": "4.14.2", + "@rollup/rollup-darwin-x64": "4.14.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.2", + "@rollup/rollup-linux-arm64-gnu": "4.14.2", + "@rollup/rollup-linux-arm64-musl": "4.14.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.2", + "@rollup/rollup-linux-riscv64-gnu": "4.14.2", + "@rollup/rollup-linux-s390x-gnu": "4.14.2", + "@rollup/rollup-linux-x64-gnu": "4.14.2", + "@rollup/rollup-linux-x64-musl": "4.14.2", + "@rollup/rollup-win32-arm64-msvc": "4.14.2", + "@rollup/rollup-win32-ia32-msvc": "4.14.2", + "@rollup/rollup-win32-x64-msvc": "4.14.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/sass": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz", + "integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/vite": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", + "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.1.0.tgz", + "integrity": "sha512-3cObNDzX6DdfhD9E7kf6w2mNunFpD7drxyNgHLw+XwIYAgb+Xt16SEXo0Up4VH+TMf3n+DSVJZtW2POBGcBYAA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vue": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", + "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", + "dependencies": { + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-sfc": "3.4.31", + "@vue/runtime-dom": "3.4.31", + "@vue/server-renderer": "3.4.31", + "@vue/shared": "3.4.31" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2439144 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "@popperjs/core": "^2.11.6", + "axios": "^1.6.4", + "bootstrap": "^5.2.3", + "laravel-vite-plugin": "^1.0.2", + "sass": "^1.56.1", + "vite": "^5.0" + }, + "dependencies": { + "chart.js": "^4.4.3", + "vue": "^3.4.31" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..506b9a3 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,33 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..3aec5e2 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,21 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/images/1716792688.png b/public/images/1716792688.png new file mode 100644 index 0000000000000000000000000000000000000000..fb31f5e8a574290e074dbc034738b710d60b28e7 GIT binary patch literal 206644 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 kYkoX_mhTGMZOXb_HWkoW1Wf>D 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 literal 0 HcmV?d00001 diff --git a/public/images/1716792995.png b/public/images/1716792995.png new file mode 100644 index 0000000000000000000000000000000000000000..a29d306fd7420e17d7881db16093e587ca1c6964 GIT binary patch literal 283002 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

ob5YVb+&#AN~% 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